Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 54376 | Accepted: 15796 |
Description
Input
Output
Sample Input
1 5 1 4 2 6 8 10 3 4 7 10
Sample Output
4
Source
开学第一题~将近两个小时才过,暴露一堆问题==
说题意:在高度一定的展板上依次贴与展板一样高的海报,也就是后来的贴在上面,问最后能看到几个。开始特别没脑子的val值想设成当前区间上能看到的不同海报的个数,实在想不到update怎么写。标称是把val设成是当前最上面的颜色,智商啊啊啊啊。
update()的递归写法也错了好多次
其实最重要的是离散化的过程,由于展板分成整数单元,普通离散化不能表示,间隔超过一的中间加一点即可。
最最最最傻×的是没写scanf("%d",&n);!!!
/******************* poj2528 2016.3.7 1088K 79MS C++ 2669B *******************/ #include <cstdio> #include <algorithm> #include<cstring> using namespace std; #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 const int maxn = 11111; bool hash[maxn]; int li[maxn] , ri[maxn]; int X[maxn*3]; int col[maxn<<4]; int cnt; void push_down(int rt) { if(col[rt]!=-1) { col[rt<<1]=col[rt<<1|1]=col[rt]; col[rt]=-1; } } void update(int l,int r,int c,int L,int R,int rt) { if(l<=L&&R<=r) { col[rt]=c; return; } push_down(rt); int mid=(L+R)/2; if(l<=mid)update(l,r,c,L,mid,rt<<1); if(r>mid) update(l,r,c,mid+1,R,rt<<1|1);/// } void query(int l,int r,int rt) { if(col[rt]!=-1) { if(!hash[col[rt]]) cnt++; hash[col[rt]]=1; return; } if(l==r) return; int m=(l+r)/2; query(l,m,rt<<1); query(m+1,r,rt<<1|1); } int Bin(int num,int R) { int l=0,r=R-1,mid; while(l<=r) { mid=(l+r)/2; if(X[mid]==num) return mid; if(X[mid]<num) l=mid+1; else r=mid-1; } } int main() { // freopen("cin.txt","r",stdin); int t,n; scanf("%d",&t); while(t--) { int nn=0,m=1; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&li[i],&ri[i]),X[nn++]=li[i],X[nn++]=ri[i]; sort(X,X+nn); for(int i=1;i<nn;i++) if(X[i]!=X[i-1]) X[m++]=X[i]; for(int i=m-1;i>0;i--)if(X[i]!=X[i-1]+1)X[m++]=X[i-1]+1; sort(X,X+m); memset(col,-1,sizeof(col)); for(int i=0;i<n;i++) { int l=Bin(li[i],m); int r=Bin(ri[i],m); update(l,r,i,0,m,1); } cnt=0; memset(hash , false , sizeof(hash)); query(0,m,1); printf("%d\n",cnt); // scanf("%d",&n); // int nn = 0; // for (int i = 0 ; i < n ; i ++) { // scanf("%d%d",&li[i] , &ri[i]); // X[nn++] = li[i]; // X[nn++] = ri[i]; // } // sort(X , X + nn); // int m = 1; // for (int i = 1 ; i < nn; i ++) { // if (X[i] != X[i-1]) X[m ++] = X[i]; // } // for (int i = m - 1 ; i > 0 ; i --) { // if (X[i] != X[i-1] + 1) X[m ++] = X[i-1] + 1; // } // sort(X , X + m); // memset(col , -1 , sizeof(col)); // for (int i = 0 ; i < n ; i ++) { // int l = Bin(li[i] , m); // int r = Bin(ri[i] , m); // update(l , r , i , 0 , m , 1); // } // cnt = 0; // memset(hash , false , sizeof(hash)); // query(0 , m , 1); // printf("%d\n",cnt); } return 0; }
纠结于更新操作的具体写法,发现如下写也是对的
/******************* poj2528 2016.3.7 1088K 79MS C++ 2669B *******************/ #include <cstdio> #include <algorithm> #include<cstring> using namespace std; #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 const int maxn = 21111; bool hash[maxn]; int li[maxn] , ri[maxn]; int X[maxn*3]; int col[maxn<<4]; int cnt; void push_down(int rt) { if(col[rt]!=-1) { col[rt<<1]=col[rt<<1|1]=col[rt]; col[rt]=-1; } } void update(int l,int r,int c,int L,int R,int rt) { if(l<=L&&R<=r) { col[rt]=c; return; } push_down(rt); int mid=(L+R)/2; if(r<=mid)update(l,r,c,L,mid,rt<<1); else if(l>mid) update(l,r,c,mid+1,R,rt<<1|1);/// else { update(l,mid,c,L,mid,rt<<1); update(mid+1,r,c,mid+1,R,rt<<1|1); } } void query(int l,int r,int rt) { if(col[rt]!=-1) { if(!hash[col[rt]]) cnt++; hash[col[rt]]=1; return; } if(l==r) return; int m=(l+r)/2; query(l,m,rt<<1); query(m+1,r,rt<<1|1); } int Bin(int num,int R) { int l=0,r=R-1,mid; while(l<=r) { mid=(l+r)/2; if(X[mid]==num) return mid; if(X[mid]<num) l=mid+1; else r=mid-1; } } int main() { // freopen("cin.txt","r",stdin); int t,n; scanf("%d",&t); while(t--) { int nn=0,m=1; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&li[i],&ri[i]),X[nn++]=li[i],X[nn++]=ri[i]; sort(X,X+nn); for(int i=1;i<nn;i++) if(X[i]!=X[i-1]) X[m++]=X[i]; for(int i=m-1;i>0;i--)if(X[i]!=X[i-1]+1)X[m++]=X[i-1]+1; sort(X,X+m); memset(col,-1,sizeof(col)); for(int i=0;i<n;i++) { int l=Bin(li[i],m); int r=Bin(ri[i],m); update(l,r,i,0,m,1); } cnt=0; memset(hash , false , sizeof(hash)); query(0,m,1); printf("%d\n",cnt); // scanf("%d",&n); // int nn = 0; // for (int i = 0 ; i < n ; i ++) { // scanf("%d%d",&li[i] , &ri[i]); // X[nn++] = li[i]; // X[nn++] = ri[i]; // } // sort(X , X + nn); // int m = 1; // for (int i = 1 ; i < nn; i ++) { // if (X[i] != X[i-1]) X[m ++] = X[i]; // } // for (int i = m - 1 ; i > 0 ; i --) { // if (X[i] != X[i-1] + 1) X[m ++] = X[i-1] + 1; // } // sort(X , X + m); // memset(col , -1 , sizeof(col)); // for (int i = 0 ; i < n ; i ++) { // int l = Bin(li[i] , m); // int r = Bin(ri[i] , m); // update(l , r , i , 0 , m , 1); // } // cnt = 0; // memset(hash , false , sizeof(hash)); // query(0 , m , 1); // printf("%d\n",cnt); } return 0; }