记录编号 |
203772 |
评测结果 |
AAAAAAAAA |
题目名称 |
[POI 2001] 区间 |
最终得分 |
100 |
用户昵称 |
神利·代目 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.140 s |
提交时间 |
2015-11-03 16:44:55 |
内存使用 |
21.27 MiB |
显示代码纯文本
#include<cstdio>
#define n 2000000
int EPX,N;
inline void in(int &TEMP)
{
for(TEMP=getchar();TEMP<48||TEMP>57;TEMP=getchar());
TEMP^=48;
for(EPX=getchar();EPX<58&&EPX>47;EPX=getchar())
TEMP=(TEMP<<3)+(TEMP<<1)+(EPX^48);
}
int L,R;
bool tree[11000000];
inline void add(int l,int r,int rt)
{
if(tree[rt])
return;
if(L<=l&&r<=R)
{
tree[rt]=1;
return;
}
int mid=l+r>>1;
if(L<=mid)
add(l,mid,rt<<1);
if(R>mid)
add(mid+1,r,rt<<1|1);
}
bool ans[11000000];
inline void find(int l,int r,int rt)
{
if(l==r)
{
if(tree[rt])
ans[l]=1;
return;
}
if(tree[rt])
{
tree[rt<<1]=1;
tree[rt<<1|1]=1;
}
int mid=l+r>>1;
find(l,mid,rt<<1);
find(mid+1,r,rt<<1|1);
}
int main()
{
freopen("prz.in","r",stdin);
freopen("prz.out","w",stdout);
in(N);
while(N--)
{
in(L),in(R);
L<<=1;
R<<=1;
add(2,n,1);
}
find(2,n,1);
for(int i=2;i<=n;++i)
if(ans[i])
{
L=i;
while(ans[++i]);
printf("%d %d\n",L>>1,(i-1)>>1);
}
//while(1);
}