[IOI2018] seats 排座位
[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 排座位相关推荐
- 【IOI2018】【luoguP4898】 seats 排座位 (线段树)
题面
- pat天梯赛L2-010. 排座位
L2-010. 排座位 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位. ...
- C++学习之路 | PTA(天梯赛)—— L2-010 排座位 (25分)(带注释)(并查集)(精简)
L2-010 排座位 (25分) 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他 ...
- 某剧院有33排座位java_2018湖南省考行测数学题“拍档”:等差数列和等比数列...
随着八月份的到来,同学们的暑假也接近尾声,开学之后,就有一部分同学马上就要面临就业的压力,对于应届毕业生来生,参加公务员考试不失为一种好的选择,而在银行秋招中,数量关系也是考试内容之一,所以大家也需要 ...
- 7-14 排座位 (25 分)
7-14 排座位 (25 分) 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们 ...
- c语言程序设计考场排座位,“听说学霸座位是这个?”老师揭秘排座,真正的C位其实在这里……...
来源:小学数学(ID:xxsx100) 新学期,每个班级都要排座位. 关于教室中所谓"抢C位",每年都是不少家长心里相当关切的事儿,尤其在新学期开始,常有家长悄悄找到老师,或直接或 ...
- 【CCCC】L2-010 排座位 (25分),,并查集+二维矩阵判定关系
problem L2-010 排座位 (25分) 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编 ...
- 某剧院有33排座位java_行测备考资料:数量关系深处隐藏的整除技巧
原标题:行测备考资料:数量关系深处隐藏的整除技巧 数量关系中,整除思想的常规运用其实大家并不陌生,比如:文字直接描述整除:题干中出现"平均"."每"." ...
- 排座系统c语言,2008noip排座位C语言详解.doc
2008noip排座位C语言详解 2008noip排座位C语言详解 2.排座椅 (seat.pas/c/cpp)D对同学上课时会交头接耳.同学们在教室中坐成了M行N列,坐在第i行第j列 的同学的位置是 ...
最新文章
- ALD和CVD晶体管薄膜技术
- java用递归的方式写n_java-使用递归将其元素加起来为n的子集的列表
- 420一个像素多少个字节_一个Java方法能有多少个参数类型?这个好奇coder做了个实验...
- 【读书笔记】编写高质量的代码Web前端开发修炼之道——曹刘阳
- 设计模式---组合模式
- 疫情期间,在家使用java的SSH框架实现一个简单的任务调度系统
- SQL server USE GO语句学习总结
- I/O多路复用之select
- Silverlight+WCF 新手实例 象棋 该谁下棋-A下B停(二十八)
- 【一】高等数学上册第一章笔记。
- webqq协议分析之~~~~登陆
- win10 使用苹果耳机没有声音解决方案
- css里外边框与内边框_基本CSS边框
- php内外边距,CSS 内边距
- 01 PhantomReference没有进入ReferenceQueue
- Python|用turtle画笔制作奥运五环
- js 毫秒 微秒 转为 时分秒
- 安卓系统管理软件_BlackBerry为部署车载安卓系统保驾护航
- 批量训练pytorch练习
- 订单中心,究竟是分还是合?
热门文章
- Android ProgressBar示例
- 文件和目录(二)--unix环境高级编程读书笔记
- 成为数据分析师需要具备的知识体系
- MySql按字段分组取最大值记录 [此博文包含图片]
- 【C#】【Thread】BackgroundWorker的使用
- 数据库信息 (表名 行数 堆 集群 非聚集)的查询
- javascript-从toString方法在判断复杂数据类型上的妙用,引申到对原型链的理解...
- Android UI 之WaterFall瀑布流效果 [复制链接]
- 在Sublime Text 2下面开发Sass
- 线性表--算法设计题2.25