题目链接
时间限制:1000ms;
空间限制:8192K;
数据大小:
1<=T<=1e3;
1<=n<=1e6;
1<=m<=1e3;
题目大意:《自己读一下就可以理解》
写线段树会超内存,不做处理写差分会超时;
解决方法:
记录并离散化需要差分处理的点;
离散化后处理差分数组;
依据离散化后的差分数组处数据;
虽然差分可以在o(1)时间内修改,可是查询每个点的信息,任然需要o(n)的复杂度
可是在某一个区间内的点的信息是一样的,直接查找这样的区间,可以大大减少n的值
本题中就可以达到o(2*m),的复杂度;优化了o(n);m=sqrt(n)。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int num=2e3+100;
struct node{
int u,v;
}d[num];
int a[num],cnt;
int c[num];
void int_i(void)
{
for(int i=0;i<=num;i++)
c[i]=0;
cnt=0;
return ;
}
int main()
{
int t;
scanf("%d",&t);
int n,m,u,v,len,ans,sum;
for(int k=1;k<=t;k++)
{
int_i();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
u++;v++;
d[i].u=u;
d[i].v=v+1;
a[++cnt]=u;
a[++cnt]=v+1;
}
sort(a+1,a+cnt+1);
int len=unique(a+1,a+cnt+1)-(a+1);
for(int i=1;i<=m;i++)
{
int x=lower_bound(a+1,a+len+1,d[i].u) - a;
int y=lower_bound(a+1,a+len+1,d[i].v) - a;
c[x]++;c[y]--;
}
ans=sum=0;
for(int i=1;i<len;i++)
{
sum+=c[i];
if(sum&1)
{
ans+=a[i+1] - a[i];
}
}
printf("Case #%d: %d\n",k,ans);
}
return 0;
}