POJ 2528
来源:互联网 发布:100本网络禁书在线阅读 编辑:程序博客网 时间:2024/05/22 00:06
题意:
一块黑板 给你贴广告。。。后面贴的会把前面贴的给覆盖了(如果在同一个地方),
然后最后要你求还有多少广告是能被看到的。。 能被看到任何一点都算能看到。。。
这题难点也在于数据太大。。无法直接用暴力去做。。
所以要用到离散。。。。。
每一个广告有2个端点。他最多有1W个广告。。。也就是说他最多只有2W个端点。
所以我们可以把他给的所有广告的端点来一个排序。 然后重新给他们定义值。
这样就可以用一个2*N的线段树来解决了= =
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;int m;int a[80000];struct tree{ int left; int right; int lazy;}tree[80000];struct shuzu{ int zhi; int xuhao;}b[50005];bool cmp(shuzu s,shuzu d){ return s.zhi<d.zhi;}void inset(int inst,int le,int ri){ tree[inst].left=le; tree[inst].right=ri; tree[inst].lazy=0; if(le==ri) return ; int mid=(le+ri)>>1; inset(2*inst,le,mid); inset(2*inst+1,mid+1,ri);}void lazy(int inst,int k){ if(tree[inst].left==tree[inst].right) return ; tree[inst].lazy=0; tree[2*inst].lazy=k; tree[2*inst+1].lazy=k;}void query(int inst,int le,int ri,int k){ if(tree[inst].left==le&&tree[inst].right==ri) { tree[inst].lazy=k; return ; } if(tree[inst].lazy!=0) lazy(inst,tree[inst].lazy); int mid=(tree[inst].left+tree[inst].right)>>1; if(ri<=mid) query(2*inst,le,ri,k); else if(le>mid) query(2*inst+1,le,ri,k); else { query(2*inst,le,mid,k); query(2*inst+1,mid+1,ri,k); }}void tj(int inst){ if(tree[inst].lazy!=0) { //cout<<tree[inst].left<<" "<<tree[inst].right<<" "<<tree[inst].lazy<<endl; a[m]=tree[inst].lazy; m++; return ; } if(tree[inst].left==tree[inst].right) return ; tj(2*inst); tj(2*inst+1);}int main(){ int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); int i[20005],j[20005]; for(int o=0;o<n;o++) {scanf("%d%d",&i[o],&j[o]); b[o].zhi=i[o]; b[o+n].zhi=j[o]; b[o].xuhao=o; b[o+n].xuhao=o+n; } sort(b,b+2*n,cmp); /*for(int o=0;o<2*n;o++) cout<<b[o].xuhao<<" "<<b[o].zhi<<endl;*/ int k1=1; if(b[0].xuhao<n) i[b[0].xuhao]=1; else j[b[0].xuhao-n]=1; int n1=1; for(int o=1;o<2*n;o++) { if(b[o].zhi!=b[o-1].zhi) { k1++; if(b[o].xuhao<n) i[b[o].xuhao]=k1; else j[b[o].xuhao-n]=k1; } else { if(b[o].xuhao<n) i[b[o].xuhao]=k1; else j[b[o].xuhao-n]=k1; } // if(b[o].xuhao<n) // cout<<b[o].xuhao<<" "<<i[b[o].xuhao]<<" "<<'i'<<endl; // else // cout<<b[o].xuhao-n<<" "<<j[b[o].xuhao-n]<<" "<<'j'<<endl; if(o==2*n-1) { if(b[o].xuhao<n) n1=i[b[o].xuhao]; else n1=j[b[o].xuhao-n]; } } //cout<<n1<<endl; inset(1,1,n1); for(int o=0;o<n;o++) //cout<<i[o]<<" "<<j[o]<<endl; query(1,i[o],j[o],o+1); m=0; tj(1); sort(a,a+m); int k=1; if(n==0) k=0; for(int o=1;o<m;o++) { // cout<<a[o]<<" "; if(a[o]!=a[o-1]) k++; } printf("%d\n",k); }}
- POJ 2528
- poj 2528
- POJ 2528
- POJ 2528
- poj 2528
- poj 2528
- poj 2528
- poj 2528
- POJ 2528
- POJ 2528
- poj 2528
- poj-2528
- poj 2528
- poj 2528
- POJ 2528
- poj 2528
- POJ 2528
- POJ 2528
- 客户端 用不用 bind 的区别
- socket (hello world)
- 黑马程序员---Hibernate和Ibatis区别
- Python源码学习 番外-为方便调试和查看变量而自己写的autoexp.dat
- C语言实现 二分查找 支持降序和升序
- POJ 2528
- JavaScript -- 节点操作, 事件触发, 表单伸缩
- bash shell变量替换
- 反射
- git进行权限控制
- 《HTTP权威指南》 读一
- 获取arcgis克里格插值后的每个点的插值结果
- UVa 10721 Bar Codes (DP)
- web.xml文件中最好定义webAppRootKey参数