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

[IOI2018] seats 排座位的更多相关文章

  1. 团体程序设计天梯赛-练习集L2-010. 排座位

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

  2. L2-010. 排座位

    L2-010. 排座位 题目链接:https://www.patest.cn/contests/gplt/L2-010 并查集 相关题目:L2-007. 家庭房产,L3-003. 社交集群 下午打的时 ...

  3. L2-010. 排座位(并查集)*

    L2-010. 排座位 参考博客 #include<iostream> #include<math.h> using namespace std; ]; ][]; int fi ...

  4. pta l2-10(排座位)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805066135879680 题意:给宴席排座位,有n个人,m个 ...

  5. CCCC 排座位 图着色问题

    1排座位:https://www.patest.cn/contests/gplt/L2-010 2图着色问题 https://www.patest.cn/contests/gplt/L2-023 建图 ...

  6. 排座位&&Little Elephant And Permutation——排列dp的处理

    排列的问题,就是要把序列排个序,使之达到某种最优值或者统计方案数 dp可以解决部分排列问题. 通常的解决方案是,按照编号(优先级)排序决策,从左到右决策两种. 这里主要是第一个. 排座位• 有

  7. pat 团体天梯赛 L2-010. 排座位

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

  8. CCCC L2-010. 排座位【并查集/分类讨论】

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

  9. 天梯杯 L2-010. 排座位

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

随机推荐

  1. Python代码转c#部分参考样例

    最近在做一部分Pyhton代码转c#代码的工作,以下案例亲自都测试过,现整理出来希望对有帮助的同学提供参考: Python | C# *:first-child{margin-top:0 !impor ...

  2. 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--目录(8/8 完结)

    为什么要做这个 在使用nodejs开发过程中,总是发现需要做很多重复性的体力劳动,且因为自身是服务端程序员出身,感觉有一些服务端好的东西其实可以在nodejs上得到应用并能提高一些开发工作效率. 本系 ...

  3. 跨平台、跨语言应用开发,Elements 介绍

    目录 1,Elements 介绍 2,Elements 版本 3,Elements 能干嘛 4,Elements  IDES 5,Elements 工具 1,Elements 介绍 RemObject ...

  4. 记录:EM 算法估计混合高斯模型参数

    当概率模型依赖于无法观测的隐性变量时,使用普通的极大似然估计法无法估计出概率模型中参数.此时需要利用优化的极大似然估计:EM算法. 在这里我只是想要使用这个EM算法估计混合高斯模型中的参数.由于直观原 ...

  5. SQLServer 中发布与订阅

    在对数据库做迁移的时候,会有很多方法,用存储过程,job,也可以用开源工具kettle,那么今天这些天变接触到了一种新的方法,就是SqlServer中自带的发布与订阅. 首先说明一下数据复制的流程.如 ...

  6. BETA 版冲刺前准备

    任务博客 组长博客 总的来讲Alpha阶段我们计划中的工作是如期完成的.不过由于这样那样的原因,前后端各个任务完成度不算非常高,距离完成一个真正好用.完美的软件还有所差距. 过去存在的问题 测试工作未 ...

  7. Oracle 控制文件管理

    控制文件是一个很小的二进制文件(10MB左右),含有数据库结构信息,包括数据文件和日志文件信息.控制文件在数据库创建时被自动创建,并在数据库发生物理变数时更新.控制文件被不断更新,在任何时候都要保证控 ...

  8. Oracle 数据表误删恢复 Flashback

    1. 前提条件. recyclebin 参数打开. 验证参数是否打开: SHOW PARAMETER RECYCLEBIN 2. 如果参数没有打开的话 需要打开,并且重启一下数据库方法为 alter ...

  9. U9财务体系

  10. jdk1.8 HashMap红黑树操作详解-putTreeVal()

    以前也看过hashMap源码不过是看的jdk1.7的,由于时间问题看的也不是太深入,只是大概的了解了一下他的基本原理:这几天通过假期的时间就对jdk1.8的hashMap深入了解了下,相信大家都是对红 ...