[IOI2018] seats 排座位

IOI2018题解

压缩状态思想很不错的

每次把原来的贡献减掉,新来的再加上

最多涉及10个点

注意:

1.去重

2.下标从0开始

3.线段树初始的最小值个数都是r-l+1

代码:

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define mid ((l+r)>>1)
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=1000000+5;
const int inf=0x3f3f3f3f;
int id[N],vis[N],sta[N],top;
int pos[N][2];
int n,m,q;
int num(int x,int y){return (x-1)*m+y;
}
struct tr{int mi,cnt;int mx;int ad;
}t[4*N];
void pushup(int x){t[x].mi=min(t[x<<1].mi,t[x<<1|1].mi);t[x].mx=max(t[x<<1].mx,t[x<<1|1].mx);t[x].cnt=t[x<<1].cnt*(t[x<<1].mi==t[x].mi)+t[x<<1|1].cnt*(t[x<<1|1].mi==t[x].mi);
}
void pushdown(int x){if(!t[x].ad) return;t[x<<1].ad+=t[x].ad;t[x<<1].mi+=t[x].ad;t[x<<1].mx+=t[x].ad;t[x<<1|1].ad+=t[x].ad;t[x<<1|1].mi+=t[x].ad;t[x<<1|1].mx+=t[x].ad;t[x].ad=0;
}
void build(int x,int l,int r){if(l==r){t[x].cnt=1;return;}build(x<<1,l,mid);build(x<<1|1,mid+1,r);pushup(x);
}
void add(int x,int l,int r,int L,int R,int c){if(L<=l&&r<=R){t[x].ad+=c;t[x].mi+=c;t[x].mx+=c;if(t[x].mi==t[x].mx) t[x].cnt=r-l+1;return;}    pushdown(x);if(L<=mid) add(x<<1,l,mid,L,R,c);if(mid<R) add(x<<1|1,mid+1,r,L,R,c);pushup(x);
}
int mv[4][2]={{+1,0},{-1,0},{0,+1},{0,-1}};
void wrk1(int x,int y,int c){//cout<<" x y "<<x<<" "<<y<<" c "<<c<<endl;int mi=inf,cmi=inf;for(reg i=0;i<4;++i){int dx=x+mv[i][0],dy=y+mv[i][1];if(dx>=1&&dx<=n&&dy>=1&&dy<=m){if(id[num(dx,dy)]<mi){cmi=mi;mi=id[num(dx,dy)];}else cmi=min(cmi,id[num(dx,dy)]);}}if(cmi<=id[num(x,y)]-1) {//cout<<" x y "<<x<<" "<<y<<" : "<<mi<<" "<<cmi<<endl;add(1,1,n*m,cmi,id[num(x,y)]-1,c);}
}
void wrk2(int x,int y,int c){int mi=n*m+1;int dx=x-1,dy=y;if(dx>=1&&dx<=n&&dy>=1&&dy<=m){mi=min(mi,id[num(dx,dy)]);}dx=x,dy=y-1;if(dx>=1&&dx<=n&&dy>=1&&dy<=m){mi=min(mi,id[num(dx,dy)]);}//cout<<" x y "<<x<<" "<<y<<" mimimi "<<mi<<endl;if(id[num(x,y)]<=mi-1) add(1,1,n*m,id[num(x,y)],mi-1,c);
}
void sol(int x,int y,int c){//cout<<" sol "<<x<<" "<<y<<" c "<<c<<endl;if(!vis[num(x,y)]) {sta[++top]=num(x,y);vis[num(x,y)]=1;wrk1(x,y,c);wrk2(x,y,c);}for(reg i=0;i<4;++i){int dx=x+mv[i][0],dy=y+mv[i][1];if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&!vis[num(dx,dy)]){vis[num(dx,dy)]=1;sta[++top]=num(dx,dy);wrk1(dx,dy,c);wrk2(dx,dy,c);}}
}
int main(){rd(n);rd(m);rd(q);build(1,1,n*m);int x,y;for(reg i=1;i<=n*m;++i){rd(x);rd(y);++x;++y;pos[i][0]=x;pos[i][1]=y;id[num(x,y)]=i;}for(reg i=1;i<=n;++i){for(reg j=1;j<=m;++j){wrk1(i,j,1);wrk2(i,j,1);}}//cout<<t[1].mi<<" "<<t[1].mx<<" "<<t[1].cnt<<endl;int A,B;while(q--){rd(A);rd(B);        ++A;++B;top=0;x=pos[A][0],y=pos[A][1];sol(x,y,-1);x=pos[B][0],y=pos[B][1];sol(x,y,-1);while(top) vis[sta[top--]]=0;swap(id[num(pos[A][0],pos[A][1])],id[num(pos[B][0],pos[B][1])]);swap(pos[A][0],pos[B][0]);swap(pos[A][1],pos[B][1]);x=pos[A][0],y=pos[A][1];sol(x,y,1);x=pos[B][0],y=pos[B][1];sol(x,y,1);while(top) vis[sta[top--]]=0;int ans=0;if(t[1].mi==1) ans=t[1].cnt;printf("%d\n",ans);}return 0;
}}
signed main(){Miracle::main();return 0;
}/*Author: *Miracle*Date: 2019/2/10 17:53:31
*/

转载于:https://www.cnblogs.com/Miracevin/p/10360146.html

[IOI2018] seats 排座位相关推荐

  1. 【IOI2018】【luoguP4898】 seats 排座位 (线段树)

    题面

  2. pat天梯赛L2-010. 排座位

    L2-010. 排座位 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位. ...

  3. C++学习之路 | PTA(天梯赛)—— L2-010 排座位 (25分)(带注释)(并查集)(精简)

    L2-010 排座位 (25分) 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他 ...

  4. 某剧院有33排座位java_2018湖南省考行测数学题“拍档”:等差数列和等比数列...

    随着八月份的到来,同学们的暑假也接近尾声,开学之后,就有一部分同学马上就要面临就业的压力,对于应届毕业生来生,参加公务员考试不失为一种好的选择,而在银行秋招中,数量关系也是考试内容之一,所以大家也需要 ...

  5. 7-14 排座位 (25 分)

    7-14 排座位 (25 分) 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们 ...

  6. c语言程序设计考场排座位,“听说学霸座位是这个?”老师揭秘排座,真正的C位其实在这里……...

    来源:小学数学(ID:xxsx100) 新学期,每个班级都要排座位. 关于教室中所谓"抢C位",每年都是不少家长心里相当关切的事儿,尤其在新学期开始,常有家长悄悄找到老师,或直接或 ...

  7. 【CCCC】L2-010 排座位 (25分),,并查集+二维矩阵判定关系

    problem L2-010 排座位 (25分) 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编 ...

  8. 某剧院有33排座位java_行测备考资料:数量关系深处隐藏的整除技巧

    原标题:行测备考资料:数量关系深处隐藏的整除技巧 数量关系中,整除思想的常规运用其实大家并不陌生,比如:文字直接描述整除:题干中出现"平均"."每"." ...

  9. 排座系统c语言,2008noip排座位C语言详解.doc

    2008noip排座位C语言详解 2008noip排座位C语言详解 2.排座椅 (seat.pas/c/cpp)D对同学上课时会交头接耳.同学们在教室中坐成了M行N列,坐在第i行第j列 的同学的位置是 ...

最新文章

  1. ALD和CVD晶体管薄膜技术
  2. java用递归的方式写n_java-使用递归将其元素加起来为n的子集的列表
  3. 420一个像素多少个字节_一个Java方法能有多少个参数类型?这个好奇coder做了个实验...
  4. 【读书笔记】编写高质量的代码Web前端开发修炼之道——曹刘阳
  5. 设计模式---组合模式
  6. 疫情期间,在家使用java的SSH框架实现一个简单的任务调度系统
  7. SQL server USE GO语句学习总结
  8. I/O多路复用之select
  9. Silverlight+WCF 新手实例 象棋 该谁下棋-A下B停(二十八)
  10. 【一】高等数学上册第一章笔记。
  11. webqq协议分析之~~~~登陆
  12. win10 使用苹果耳机没有声音解决方案
  13. css里外边框与内边框_基本CSS边框
  14. php内外边距,CSS 内边距
  15. 01 PhantomReference没有进入ReferenceQueue
  16. Python|用turtle画笔制作奥运五环
  17. js 毫秒 微秒 转为 时分秒
  18. 安卓系统管理软件_BlackBerry为部署车载安卓系统保驾护航
  19. 批量训练pytorch练习
  20. 订单中心,究竟是分还是合?

热门文章

  1. Android ProgressBar示例
  2. 文件和目录(二)--unix环境高级编程读书笔记
  3. 成为数据分析师需要具备的知识体系
  4. MySql按字段分组取最大值记录 [此博文包含图片]
  5. 【C#】【Thread】BackgroundWorker的使用
  6. 数据库信息 (表名 行数 堆 集群 非聚集)的查询
  7. javascript-从toString方法在判断复杂数据类型上的妙用,引申到对原型链的理解...
  8. Android UI 之WaterFall瀑布流效果 [复制链接]
  9. 在Sublime Text 2下面开发Sass
  10. 线性表--算法设计题2.25