Codeforce 220 div2
D
插入: 在当前指针位置sz处插入一个1,col[sz]记录插入的内容,sz++;
删除i: 找到第i个1的位置,赋为0;
于是转化为一个维护区间和的问题;
trick:
如果是依次删除a[0],a[1]...a[k], 那么对应的删除操作应该为 a[0],a[1]-1,a[2]-2...a[k]-k,要把前面删掉的算进去;
#define maxn 1000100
int bit[maxn],a[maxn],n,m,col[maxn],sz;
int lowbit(int x){return x&(-x);}
void ins(int pos,int c,int v){
col[pos]=c;
// printf("ins %d at %d c=%d\n",v,pos,c);
for (int cur=pos ; cur<=n ; cur+=lowbit(cur))
bit[cur]+=v;
}
int query(int x){
int res=;
for (int i=x ; i> ; i-=lowbit(i)) res += bit[i];
return res;
}
int sum(int l,int r){
return query(r)-query(l-);
}
void del(int pos){
int l=,r=sz;
while (l<r){
if(query(mid)>=pos) r=mid;
else l=mid+;
}
// printf("del:%dth at %d\n",pos,l);
ins(l,col[l],-);
}
int binsearch(int l,int r,int len){
while (l<=r){
if (a[mid]>len) r=mid-;
else l=mid;
if (l+>=r){
if (a[r]<=len) return r;
if (a[l]<=len) return l;
return -;
}
}
return -;
}
int main(){
// freopen("test","r",stdin);
scanf("%d%d",&n,&m);
rep(i,m) scanf("%d",&a[i]);
sz = ;
rep(i,n){
int o;
scanf("%d",&o);
// printf("o=%d\n",o);
if (o==-){
int len = sum(,sz);
int k = binsearch(,m-,len);
// printf("len=%d k=%d\n",len,k);
for (int i= ; i<=k ; i++ ) del(a[i]-i);
}else{
ins(++sz,o,);
}
}
if (query(sz)){
for (int i= ; i<=sz ; i++ ) if(sum(i,i)) printf("%d",col[i]);
}
else
printf("Poor stack!\n");
return ;
}
E
显然把坐标变为(x+y,x-y),生长的线段都是平行坐标轴的,会让问题简单很多;
然后考虑某时间t,有若干线段,如果能判断这些线段是否构成矩形,就能二分t来确定答案;
判断:
预处理处当前时间产生的所有线段;
枚举横线作为矩形上边,将所有与它相交的竖线插入树状数组,
枚举,下边,回答询问,>=2说明围成矩形;
这是O(n^3)做法,可以通过排序,逐个插入等办法优化成O(n^2)的.
#define rep(i,n) for(int i=0 ; i<(n) ; i++)
#define mid ((l+r)>>1)
#define ls ((rt<<1))
#define rs ((rt<<1)+1)
#define maxn 2020
#define INF 2000100
struct node{
int x,y;
};node red[maxn],blue[maxn];
struct line{
int p,l,r;
};vector<line>lx[maxn],ly; int n,m,bit[maxn][maxn];
vector<int>X,Y;
bool cmpb(node a,node b){
return (a.x==b.x)?(a.y<b.y):(a.x<b.x);
}
bool cmpr(node a,node b){
return (a.y==b.y)?(a.x<b.x):(a.y<b.y);
}
void input(){
scanf("%d%d",&n,&m);
int x,y;
rep(i,n) {
scanf("%d%d",&x,&y);
blue[i]=(node){x+y,x-y};
X.push_back(blue[i].x);
}
rep(i,m) {
scanf("%d%d",&x,&y);
red[i]=(node){x+y,x-y};
Y.push_back(red[i].y);
}
sort(blue,blue+n,cmpb);
sort(red,red+m,cmpr);
}
void compress(){
sort(X.begin(),X.end());
sort(Y.begin(),Y.end());
X.erase(unique(X.begin(),X.end()),X.end());
Y.erase(unique(Y.begin(),Y.end()),Y.end());
}
int findlft(vector<int>a,int var){
int l=,r=(int)a.size()-;
while (l<r){
if (a[mid]>=var) r=mid;
else l=mid+;
}
return a[l]>=var?l:INF;
}
int findrgt(vector<int>a,int var){
int l=,r=(int)a.size()-;
while (l<=r){
if (a[mid]<=var) l=mid;
else r=mid-;
if (l+>=r){
if (a[r]<=var) return r;
if (a[l]<=var) return l;
return -INF;
}
}
return -INF;
}
int lowbit(int x) {return x&(-x);}
int query(int y,int x){
int res=;
for ( ; x> ; x-=lowbit(x)) {
res += bit[y][x];
if (bit[y][x]<) while();
}
return res;
}
int sum(int y,int l,int r){
if (l>r) return ;
return query(y,r)-query(y,l-);
}
void ins(int y,int x,int v){
for ( ; x<maxn ; x+=lowbit(x) ) {
bit[y][x]+=v;
if (bit[y][x]<) while();
}
}
bool vis[maxn];
void addline(int idx){
for (int i=ly[idx].l ; i<=ly[idx].r ; i++ )
ins(i,ly[idx].p,);
vis[idx]=true;
}
void delline(int idx){
for (int i=ly[idx].l ; i<=ly[idx].r ; i++ )
ins(i,ly[idx].p,-);
vis[idx]=false;
}
bool check(int t){
ly.clear();
rep(i,(int)Y.size()) lx[i].clear();
rep(i,n){//find ly;
int x = lower_bound(X.begin(),X.end(),blue[i].x)-X.begin()+;
int l = blue[i].y-*t;
int r = blue[i].y+*t;
while (i+<n){
int tmp = blue[i+].y-*t;
if (blue[i+].x==blue[i].x && l<=tmp && tmp<=r){
r = blue[i+].y+*t;
i++;
}else break;
}
l = findlft(Y,l);
r = findrgt(Y,r);
if (l<=r) ly.push_back((line){x,l,r});
}
rep(i,m){//find lx;
int y = lower_bound(Y.begin(),Y.end(),red[i].y)-Y.begin();
int l = red[i].x-*t;
int r = red[i].x+*t;
while (i+<m){
int tmp = red[i+].x-*t;
if (red[i+].y==red[i].y && l<=tmp && tmp<=r){
r = red[i+].x+*t;
i++;
}else break;
}
l = findlft(X,l)+;
r = findrgt(X,r)+;
if (l<r) lx[y].push_back((line){y,l,r});
}
rep(i,(int)Y.size()){
rep(j,(int)ly.size()) if (vis[j] && !(ly[j].l<=i && i<=ly[j].r)) delline(j);
rep(j,(int)ly.size()) if (!vis[j] && ly[j].l<=i && i<=ly[j].r) addline(j); rep(j,(int)lx[i].size()){
line cur = lx[i][j];
if (sum(i,cur.l,cur.r)<) continue;
rep(k,i) rep(x,(int)lx[k].size()){
int l = max(cur.l,lx[k][x].l);
int r = min(cur.r,lx[k][x].r);
if (sum(i,l,r)>= && sum(k,l,r)>=) {
rep(i,(int)ly.size()) if(vis[i]) delline(i);
return true;
}
}
}
}
rep(i,(int)ly.size()) if(vis[i]) delline(i);
return false;
}
int binsearch(int l,int r){
while (l<r){
if (check(mid)) r=mid;
else l=mid+;
}
return check(l)?l:;
}
int main(){
// freopen("test","r",stdin);
input();
compress();
int ans = binsearch(,INF);
if (!ans) printf("Poor Sereja!\n");
else printf("%d\n",ans);
return ;
}
Codeforce 220 div2的更多相关文章
- 220 DIV2 B. Inna and Nine
220 DIV2 B. Inna and Nine input 369727 output 2 input 123456789987654321 output 1 题意:比如例子1:369727--& ...
- Codeforce Round #220 Div2
这场气场太大,居然一个题不会! 所以没交! 赛后发现 A:陷阱多- -!不要超过上下界,可以上去再下来! B:不会做! C:自己想太多- -!
- codeforce 192 div2解题报告
今天大家一起做的div2,怎么说呢,前三题有点坑,好多特判.... A. Cakeminator 题目的意思是说,让你吃掉cake,并且是一行或者一列下去,但是必须没有草莓的存在.这道题目,就是判断一 ...
- Codeforce 287 div2 C题
题目链接:http://codeforces.com/contest/507/problem/C 解题报告:现在有一个满二叉树型的迷宫,入口在根结点,出口在第n个叶节点,有一串命令,LRLRLRLRL ...
- 220 DIV2 A. Inna and Pink Pony
Inna and Pink Pony 输入n,m,i,j,a,b 可以看成n行m列的矩阵,起点(i,j),每次移动(a,b),(-a,-b),(-a,b),(a,-b) 可移动到(1,m),(n,1) ...
- codeforce #339(div2)C Peter and Snow Blower
Peter and Snow Blower 题意:有n(3 <= n <= 100 000)个点的一个多边形,这个多边形绕一个顶点转动,问扫过的面积为多少? 思路:开始就认为是一个凸包的问 ...
- Codeforce 218 div2
D 一开始想错了,试图用"前缀和-容量"来求从上层流下来了多少水",但这是错的,因为溢出可能发生在中间. 然后发现对于每层,溢出事件只会发生一次,所以可以用类似并查集的办 ...
- Codeforce 217 div2
C 假设每种颜色的个数都相同,可以用轮换的方式,让答案达到最大n,当不同的时候,可以每次从每种颜色中取出相同个数的手套来操作; 一直迭代下去直到只剩下1种颜色; 再将这一种颜色与之前交换过的交换就行了 ...
- Codeforce 216 div2
D 只要搞清楚一个性质:确定了当前最大和次大的位置,局面就唯一确定了; 根据这个性质设计dp,统计到达该局面的方法数即可. E 询问的要求是: 求有多少个区间至少覆盖了询问的点集中的一个; 转化成逆命 ...
随机推荐
- openwrt上网配置的一些理解(四)
这次要解决的问题是3g上网和wan口上往可以随意切换,当然能够叠加也是好事,不过这不是我关心的.下面还是修改3个文件network,firewall,multiwan.首先在network中加入界面配 ...
- spring技术翻译开始
从今天开始,我会坚持每天花费两个小时来翻译一本英文书(当然自己觉得绝对算得上是经典),可能我英文水平有限,但也请路过的高人予以指点. 如果有翻译的出入很大,望各位告知,本人一定更改.决定翻译的目的有两 ...
- Adobe/Flash Media Server 5.0 linux 64位系统下的安装
一.下载 Adobe/Flash MS5.0下载地址: http://fs1.d-h.st/download/00036/VOt/adobemediaserver_5_ls1_linux64.tar. ...
- Java基础知识强化63:Arrays工具类之方法源码解析
1. Arrays工具类的sort方法: public static void sort(int[] a): 底层是快速排序,知道就可以了,用空看. 2. Arrays工具类的toString方法底层 ...
- Solr集成IK中文分词器
1.将IKAnalyzer-2012-4x.jar拷贝到example\solr-webapp\webapp\WEB-INF\lib下: 2.在schema.xml文件中添加fieldType: &l ...
- Java初转型-MavenWEB项目搭建
http://www.cnblogs.com/xdp-gacl/p/4054814.html
- (转)SQL Server 2008怎样编辑200行以上的数据
刚换SQL Server2008 不久,感觉运行速度.编辑提示都比05版的提升不少,但是在维护考试系统中遇到一个05中没有的问题:05中有“打开表”可以编辑所有数据行,到了08变成了“打开前1000行 ...
- jquery的鼠标移入移出事件hover、mouseenter、mouseleave、mouseover、mouseout
hover:鼠标进入元素的子元素时不会触发‘鼠标移开’的事件: mouseenter.mouseleave:效果与hover相同: mouseover: 鼠标进入元素和进入它的子元素时都会触发‘mou ...
- px em rem
px 在Web页面初期制作中,我们都是使用“px”来设置我们的文本,因为他比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的Web页面时,他改变了浏览器的字体大小,这时会使用我们 ...
- phpword的几个坑
下载地址http://phpword.codeplex.com/ 开发目的:有现成的word模板 替换模板中的字段 1.中文乱码问题,如果你文件本身就是utf8...把Phpword里的模板类的一行转 ...