标签:
这道题,很自然的想到了用离散化和成段更新。。
离散化有2中方式写。。详见代码。。
然后成段更新虽然没有lazy因为写的途中发现并不需要。。
然后,我实在不知道discuss里面大家说的关于数据的问题,可能自己的这个程序也会有错误的吧。。
然后尝试着用树的节点保存颜色数目,,, 但是没实现。。
然后是乱七八糟的代码。。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<vector>
using namespace std;
//int dian[200010];
vector<int>dian;
int flag[200010];
struct nodes
{
int x;
int y;
}nod[10010];
struct mytree
{
//int lazy;
int me;
}tree[20010<<2];
void myson(int node)
{
//tree[(node<<1)].me=tree[node].lazy;
//tree[(node<<1)+1].me=tree[node].lazy;
//tree[(node<<1)].lazy=tree[node].lazy;
//tree[(node<<1)+1].lazy=tree[node].lazy;
//tree[node].lazy=0;
tree[(node<<1)+1].me=tree[node].me;
tree[(node<<1)].me=tree[node].me;
tree[node].me=0;
}
void change(int node,int left,int right,int x,int y,int color)
{
if(x<=left&&right<=y)
{
tree[node].me=color;
//tree[node].lazy=color;
return ;
}
//if(tree[node].lazy)
//{
// myson(node);
//}
if(tree[node].me)
{
myson(node);
}
int mid=(left+right)/2;
if(y<=mid)
{
change((node<<1),left,mid,x,y,color);
//tree[node].me=tree[(node<<1)+1].me+tree[(node<<1)].me;
}
else if(mid<x)
{
change((node<<1)+1,mid+1,right,x,y,color);
//tree[node].me=tree[(node<<1)+1].me+tree[(node<<1)].me;
}
else
{
change((node<<1),left,mid,x,y,color);
change((node<<1)+1,mid+1,right,x,y,color);
//tree[node].me=tree[(node<<1)+1].me+tree[(node<<1)+1].me-1;
}
}
int find(int node,int left,int right)
{
if(tree[node].me)
{
if(!flag[tree[node].me])
{
flag[tree[node].me]++;
return 1;
}
else
{
return 0;
}
}
else
{
int mid=(left+right)/2;
return find((node<<1),left,mid)+find((node<<1)+1,mid+1,right);
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
int x;
int y;
//int cnt=0;
dian.clear();
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(x>y)
swap(x,y);
nod[i].x=x;
nod[i].y=y;
//cnt++;
dian.push_back(x);
//dian[cnt]=x;
//cnt++;
dian.push_back(y);
//dian[cnt]=y;
}
sort(dian.begin(),dian.end());
//sort(dian+1,dian+cnt+1);
vector<int>::iterator it=unique(dian.begin(),dian.end());
dian.erase(it,dian.end());//这样就可以了。。
//dian[0]=0;
//int all=0;
//for(int i=1;i<=cnt;i++)//去重。。但是可以用vector,一开始并不知道有unique的存在。。
//{
// if(dian[i]!=dian[i-1])
// {
// all++;
// dian[all]=dian[i];
// }
//}
int all=dian.size();
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++)
{
//nod[i].x=lower_bound(dian+1,dian+all,nod[i].x)-dian;
//nod[i].y=lower_bound(dian+1,dian+all,nod[i].y)-dian;
nod[i].x=lower_bound(dian.begin(),dian.end(),nod[i].x)-dian.begin()+1;
nod[i].y=lower_bound(dian.begin(),dian.end(),nod[i].y)-dian.begin()+1;
change(1,1,all,nod[i].x,nod[i].y,i);
}
memset(flag,0,sizeof(flag));
printf("%d\n",find(1,1,all));
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/qq_32995183/article/details/51334901