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 询问的要求是: 求有多少个区间至少覆盖了询问的点集中的一个; 转化成逆命 ...
随机推荐
- 《图解HTTP》 第11章 web的攻击技术
11.1 针对Web的攻击技术 简单的HTTP协议本身并不存在安全性问题,所以协议本身几乎不会成为攻击的对象. 11.1.1 HTTP不具备必要的安全功能 11.1.2 在客户端即可篡改请求 在HTT ...
- Linux 之 rsyslog 系统日志转发(转载)
一.rsyslog 介绍 ryslog 是一个快速处理收集系统日志的程序,提供了高性能.安全功能和模块化设计.rsyslog 是syslog 的升级版,它将多种来源输入输出转换结果到目的地,据官网介绍 ...
- JAVA并发七(多线程环境中安全使用集合API)
在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对 ...
- hdu 4277 USACO ORZ(dfs+剪枝)
Problem Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pasture ...
- Mac phpstorm破解版安装(简单,有效)
如果是公司作为商业用途的,还是希望你能购买正版的,如果是苦逼的穷学生,亦或是我这样的苦逼码农,那就往下看, 之前有个只需要在"License server address"里输入 ...
- [置顶] .net技术类面试、笔试题汇总1
1.简述 private. protected. public. internal 修饰符的访问权限. private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内 ...
- [置顶] Linux协议栈代码阅读笔记(一)
Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...
- sql列转行
1.需要实现一个单行的统计报表 思路先用一个union查出单列,然后再把单列转成单行 2.实现 SELECT MAX(CASE WHEN type = 1 THEN num ELSE 0 END) A ...
- AngularJs练习Demo15自定义服务
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...
- 武汉科技大学ACM :1008: 零起点学算法58——开灯问题
Problem Description 计算中心有8个机房,每个机房有n台电脑.每台电脑都有一个编号,比如8号机房编号就为H1到Hn,我们有时又称为H1为1号机器,H2为2号机器,.... 有一天我们 ...