首页 > 代码库 > 离散化坐标然后线段树解poj2528Mayor's posters
离散化坐标然后线段树解poj2528Mayor's posters
#include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<algorithm> using namespace std; bool cmp(int a,int b) { return a<b; } struct node { int l,r; }line[10010]; struct node1 { int l,r,m,w; }tree[80010]; void create(int l,int r,int k) { tree[k].l=l; tree[k].r=r; tree[k].m=(l+r)>>1; tree[k].w=0; if(l==r) return; create(l,tree[k].m,k<<1); create(tree[k].m+1,r,k<<1|1); } void join(int l,int r,int w,int k) { if(tree[k].l==l&&tree[k].r==r) { tree[k].w=w; return; } if(tree[k].w>0) { tree[k<<1].w=tree[k<<1|1].w=tree[k].w; tree[k].w=-1; } else if(tree[k].w==0) tree[k].w=w; if(r<=tree[k].m) join(l,r,w,k<<1); else if(l>tree[k].m) join(l,r,w,k<<1|1); else { join(l,tree[k].m,w,k<<1); join(tree[k].m+1,r,w,k<<1|1); } } void in() { int n,i,l,r; cin>>n; vector<int>v; for(i=0;i<n;i++) { cin>>line[i].l>>line[i].r; v.push_back(line[i].l);v.push_back(line[i].r); } sort(v.begin(),v.end(),cmp); v.erase(unique(v.begin(),v.end()),v.end()); create(1,v.size(),1); for(i=0;i<n;i++) { l=lower_bound(v.begin(),v.end(),line[i].l)-v.begin()+1; r=lower_bound(v.begin(),v.end(),line[i].r)-v.begin()+1; join(l,r,i+1,1); } } int ans; bool vis[20010]; void find(int k) { if(tree[k].w!=-1) { if(!vis[tree[k].w]) { ans++; vis[tree[k].w]=1; } return; } find(k<<1); find(k<<1|1); } int main() { int exp; cin>>exp; while(exp--) { in(); ans=0; memset(vis,0,sizeof(vis)); find(1); cout<<ans<<endl; } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。