码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 527C Glass Carving

时间:2015-03-18 12:03:07      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

题意:给你一个二维平面,m个询问  横着和竖着划一条线,问你最大矩形面积是多少。

解题思路:

1)不知道为什么感觉不能用优先队列找最大值以后就脑抽的想到了线段树找最大值,真是悲剧的开始。

线段树 + map 迭代器

解题代码:

技术分享
  1 // File Name: c.cpp
  2 // Author: darkdream
  3 // Created Time: 2015年03月18日 星期三 01时04分52秒
  4 
  5 #include<vector>
  6 #include<list>
  7 #include<map>
  8 #include<set>
  9 #include<deque>
 10 #include<stack>
 11 #include<bitset>
 12 #include<algorithm>
 13 #include<functional>
 14 #include<numeric>
 15 #include<utility>
 16 #include<sstream>
 17 #include<iostream>
 18 #include<iomanip>
 19 #include<cstdio>
 20 #include<cmath>
 21 #include<cstdlib>
 22 #include<cstring>
 23 #include<ctime>
 24 #define LL long long
 25 #define maxn 200005
 26 using namespace std;
 27 int w, h , n;
 28 char str[10];
 29 int v; 
 30 struct node{
 31   int l , r , m ,v,lazy;
 32 };
 33 map<int ,int> wmp;
 34 map<int ,int> hmp;
 35 class sg{
 36     public:
 37     struct node tree[maxn*4];
 38     int L(int x)
 39     {
 40        return 2 * x; 
 41     }
 42     int R(int x)
 43     {
 44        return 2* x + 1; 
 45     }
 46     void build(int c, int l , int r ,int v)
 47     {
 48           tree[c].l = l ; 
 49           tree[c].r = r; 
 50           tree[c].m = (l + r)/2;
 51           tree[c].lazy = 0 ; 
 52           if(l == r)
 53           {
 54               tree[c].v = v; 
 55               return;
 56           }
 57           build(L(c),l,tree[c].m,v);
 58           build(R(c),tree[c].m+1,tree[c].r,v);
 59           push_up(c);
 60     }
 61     void push_up(int c)
 62     {
 63          tree[c].v = max(tree[L(c)].v,tree[R(c)].v);
 64     }
 65     void push_down(int c)
 66     {
 67          if(tree[c].lazy != 0 )
 68          {
 69           tree[L(c)].v = tree[c].lazy; 
 70           tree[R(c)].v = tree[c].lazy;
 71           tree[L(c)].lazy = tree[c].lazy;
 72           tree[R(c)].lazy = tree[c].lazy;
 73           tree[c].lazy = 0 ;
 74          }
 75     }
 76     void update(int c, int l , int r,int v)
 77     {
 78       if(l <= tree[c].l && r >= tree[c].r)
 79       {
 80            //printf("%d**%d\n",tree[c].v,v);
 81            tree[c].lazy = v;
 82            tree[c].v = v; 
 83            return; 
 84       }
 85       push_down(c);
 86       if(l <= tree[c].m )
 87           update(L(c),l,r,v);
 88       if(r > tree[c].m)
 89           update(R(c),l,r,v);
 90       push_up(c);
 91     }
 92 
 93 }t1,t2; 
 94 int main(){
 95     scanf("%d %d %d",&w,&h,&n);
 96       t1.build(1,1,w,w);
 97       t1.tree[1].lazy = w; 
 98       t2.build(1,1,h,h); 
 99       t2.tree[1].lazy = h;
100       wmp[0] = 1; 
101       wmp[w] = 1; 
102       hmp[0] = 1; 
103       hmp[h] = 1;
104       map<int ,int >::iterator l,m,r;
105       int tmpv;  
106     for(int i = 1;i <= n;i ++)
107     {
108       scanf("%s %d",str,&tmpv);
109       if(str[0] == H)
110       {
111           if(hmp.find(tmpv) == hmp.end())
112           {
113               hmp[tmpv] = 1;
114               l = hmp.find(tmpv);
115               l --;
116               m = hmp.find(tmpv);
117               r = hmp.find(tmpv);
118               r ++ ; 
119               t2.update(1,l->first,m->first,m->first- l->first);
120               t2.update(1,m->first+1,r->first,r->first - m->first);
121         //      printf("%d %d\n",m->first - l->first+1,r->first - m->first);
122           }
123       }else{
124           if(wmp.find(tmpv)== wmp.end() )
125           {
126               wmp[tmpv] = 1;
127               l = wmp.find(tmpv);
128               l --;
129               m = wmp.find(tmpv);
130               r = wmp.find(tmpv);
131               r ++ ;
132         //      printf("%d %d\n",m->first ,l->first);
133               //if(l->first == 1 )
134               t1.update(1,l->first,m->first,m->first- l->first );
135               t1.update(1,m->first+1,r->first,r->first - m->first);
136         //      printf("%d %d %d\n",t1.tree[1].v,m->first - l->first+1,r->first - m->first);
137           }
138       }
139       //printf("%d %d\n",t1.tree[1].v,t2.tree[1].v);
140       printf("%I64d\n",1ll*t1.tree[1].v*t2.tree[1].v);
141     }
142 return 0;
143 }
View Code

 

Codeforces 527C Glass Carving

标签:

原文地址:http://www.cnblogs.com/zyue/p/4346633.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!