标签:
这题简直蛋疼死。。。。。
A了一下午
#include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 200005; int h,w,n; int C1[maxn],C2[maxn]; int vis1[maxn] = {0},vis2[maxn] = {0}; priority_queue<int,vector<int>,less<int> >q1; priority_queue<int,vector<int>,less<int> >q2; int lowbit(int x){ return x & -x; } int sum(int C[],int x){ int ret = 0; while(x > 0){ ret += C[x]; x -= lowbit(x); } return ret; } void add(int x,int d,int n,int C[]){ while(x <= n){ C[x] += d; x += lowbit(x); } } int main(){ memset(C1,0,sizeof(C1)); memset(C2,0,sizeof(C2)); scanf("%d%d%d",&w,&h,&n); int max_width = w; int max_height = h; int oh = 0, ow = 0; vis1[h] ++; q1.push(h); vis2[w] ++; q2.push(w); h ++; w ++; add(1,1,h,C1); add(h,1,h,C1); add(1,1,w,C2); add(w,1,w,C2); for(int i = 0; i < n; i++){ char str[7]; int d; scanf("%s%d",str,&d); d ++; if(str[0] == 'H'){ int l = 1,r = d - 1; int e1,e2; int v = sum(C1,d); while(l < r){ int mid = (l + r) >> 1; int ans = sum(C1,mid); if(ans >= v) r = mid; else l = mid + 1; } e1 = l; add(d,1,h,C1); v = sum(C1,d) + 1; l = d + 1; r = h; while(l < r){ int mid = (l + r) >> 1; int ans = sum(C1,mid); if(ans < v) l = mid + 1; else r = mid; } e2 = l; int d1 = d - e1,d2 = e2 - d; vis1[d1 + d2]--; if(!vis1[d1]) q1.push(d1); if(!vis1[d2]) q1.push(d2); vis1[d1] ++; vis1[d2] ++; while(!q1.empty()){ int t = q1.top(); q1.pop(); if(vis1[t]){ max_height = t; q1.push(t); break; } } } else if(str[0] == 'V'){ int l = 1,r = d - 1; int e1,e2; int v = sum(C2,d); while(l < r){ int mid = (l + r) >> 1; int ans = sum(C2,mid); if(ans < v) l = mid + 1; else r = mid; } e1 = l; add(d,1,w,C2); v = sum(C2,d) + 1; l = d + 1; r = w; while(l < r){ int mid = (l + r) >> 1; int ans = sum(C2,mid); if(ans < v) l = mid + 1; else r = mid; } e2 = l; int d1 = d - e1,d2 = e2 - d; vis2[d1 + d2]--; if(!vis2[d1]) q2.push(d1); if(!vis2[d2]) q2.push(d2); vis2[d1] ++; vis2[d2] ++; while(!q2.empty()){ int t = q2.top(); q2.pop(); if(vis2[t]){ max_width = t; q2.push(t); break; } } } printf("%I64d\n",(LL)max_width * max_height); } return 0; }
【CF】C. Glass Carving(二分 + 树状数组 + 优先队列 + 数组计数)
标签:
原文地址:http://blog.csdn.net/u013451221/article/details/44781947