来源:Comet OJ - Contest #13

一眼并查集,然后发现这题 tmd 要卡常数的说卧槽...

发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了

一开始 XJB 搞了两个并查集建了个完全的连接方式,然后 xjb 写了堆合并,调了一会儿交上去喜见 TLE (自闭现场)

挺好的啊,然后改成动态开点并且访问点跳过的操作也优化了一下,终于爬过去了 ORZ

原 Code

代码挺好打&&极不清爽

//by Judge (zlw ak ioi)
#include<bits/stdc++.h>
#define P pair<int,int>
#define fi first
#define se second
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const int N=1003,M=N*N;
typedef int ARR[N][N];
typedef int arr[M];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline int read(){ int x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} inline int read1(){ char c=getchar();
while(!isdigit(c)) c=getchar(); return c-48;
} char sr[1<<21],z[20];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(int x,char chr='\n'){
if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
} int n,m,q,cnt,ans; ARR id,a; arr fa,f; P po[M];
inline int getf(int x){
return f[x]^x?f[x]=getf(f[x]):x;
}
inline bool merge(int x,int y){
return x=getf(x),y=getf(y),x^y?f[y]=x,1:0;
}
inline void newnode(int x,int y){ ++ans;
if(x>1&&a[x-1][y]&&merge(id[x][y],id[x-1][y])) --ans;
if(x<n&&a[x+1][y]&&merge(id[x][y],id[x+1][y])) --ans;
if(y>1&&a[x][y-1]&&merge(id[x][y],id[x][y-1])) --ans;
if(y<m&&a[x][y+1]&&merge(id[x][y],id[x][y+1])) --ans;
}
inline int find(int x){
return fa[x]^x?fa[x]=find(fa[x]):x;
}
#define X po[now].fi
#define Y po[now].se
inline void Out(){
cerr<<ans<<":\n";
fp(i,1,n){
fp(j,1,m) cerr<<a[i][j];
cerr<<"\n";
} cerr<<"\n\n";
}
int main(){ n=read(),m=read();
fp(i,1,n) fp(j,1,m+1) ++cnt,
fa[cnt]=f[cnt]=cnt,po[id[i][j]=cnt]=P(i,j);
fp(i,1,n) fp(j,1,m) if((a[i][j]=read1()))
newnode(i,j),fa[id[i][j]]=id[i][j+1];
q=read(); Rg int x1,x2,y1,y2,now,nxt;
while(q--){ x1=read(),y1=read(),x2=read(),y2=read();
fp(i,x1,x2){ now=find(id[i][y1]);
while(po[now].se<=y2) nxt=find(id[X][Y+1]),
a[X][Y]=1,newnode(X,Y),fa[now]=nxt,now=nxt;
} print(ans);
} return Ot(),0;
}

Code

代码挺好打

//by Judge (zlw ak ioi)
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const int N=3003,M=N*N;
typedef int ARR[N][N];
typedef int arr[M];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline int read(){ int x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} inline int read1(){ char c=getchar();
while(!isdigit(c)) c=getchar(); return c-48;
} char sr[1<<21],z[20];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(int x,char chr='\n'){
if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
} int n,m,q,cnt,ans; ARR a,id,fa; arr f;
int getf(int x){
return f[x]^x?f[x]=getf(f[x]):x;
}
inline void merge(int x,int y){
x=getf(x),y=getf(y); if(x^y) f[y]=x,--ans;
}
const int h[5]={0,-1,1,0,0},l[5]={0,0,0,-1,1};
inline bool in(int x,int y){
return x>0&&x<=n&&y>0&&y<=m&&a[x][y];
}
int find(int x,int y){
return fa[x][y]^y?fa[x][y]=find(x,fa[x][y]):y;
}
inline void newnode(int x,int y){
a[x][y]=1,++ans,++cnt,f[id[x][y]=cnt]=cnt;
fa[x][y]=find(x,fa[x][y+1]);
fp(i,1,4){ Rg int dx=x+h[i],dy=y+l[i];
if(in(dx,dy)) merge(id[x][y],id[dx][dy]);
}
}
inline void Out(){ cerr<<"\n\n"<<ans<<":\n";
fp(i,1,n){ fp(j,1,m) cerr<<a[i][j]; cerr<<"\n"; }
}
int main(){ n=read(),m=read(); fp(i,1,n) fp(j,1,m+1) fa[i][j]=j;
fp(i,1,n) fp(j,1,m) if((a[i][j]=read1())) newnode(i,j);
q=read(); Rg int x1,x2,y1,y2,now;
while(q--){ x1=read(),y1=read(),x2=read(),y2=read();
fp(i,x1,x2){ now=find(i,fa[i][y1]);
while(now<=y2) newnode(i,now),now=find(i,fa[i][y1]);
} print(ans);
} return Ot(),0;
}

Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)的更多相关文章

  1. Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(困难版) 并查集

    题意 给一个$ n \times m$ 的网格,每个格子里有一个数字,非 \(0\) 即 \(1\),行从上往下依次编号为 \(1, 2, \cdots, n\),列从左往右依次编号为 \(1, 2, ...

  2. Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」

    来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...

  3. Comet OJ Contest #13 D

    Comet OJ Contest #13 D \(\displaystyle \sum_{i=0}^{\left\lfloor\frac{n}{2}\right\rfloor} a^{i} b^{n- ...

  4. Comet OJ Contest #13 简要题解

    C2 首先用并查集维护\(1\)的连通块,然后用另外一个并查集维护第\(i\)行中,第\(j\)列之后的第一个\(0\)的位置,就是如果当前位置是\(1\)那么它的父亲是它右边的格子,否则是它自己. ...

  5. Comet OJ - Contest #13

    Rank53. 第一次打这种比赛.还是有不少问题的,以后改吧. A题WA了两次罚了不少时. C写到一半发现只能过1,就先弃了. D一眼没看出来.第二眼看出来就是一个类似于复数的快速幂. 然后B切了. ...

  6. Comet OJ - Contest #13-C2

    Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...

  7. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

  8. Comet OJ - Contest #2简要题解

    Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...

  9. Comet OJ - Contest #4--前缀和

    原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...

随机推荐

  1. python实现一个层次聚类方法

    层次聚类(Hierarchical Clustering) 一.概念 层次聚类不需要指定聚类的数目,首先它是将数据中的每个实例看作一个类,然后将最相似的两个类合并,该过程迭代计算只到剩下一个类为止,类 ...

  2. ReactJS 结合 antd-mobile 开发 h5 应用基本配置

    在 ReactJS 较为初级的使用 antd-mobile 使用时候直接加载 node_modules 文件中的相关 CSS,这个使用方法效率低:更高明的方法则按需加载,需要设置如下: 在 packa ...

  3. JavaWeb_(SSH论坛)_三、用户模块

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 User表 id ...

  4. R_Studio(教师经济信息)逻辑回归分析的方法和技巧

    使用R语言对"教师经济信息"进行逻辑回归分析 (1)按3:1的比例采用简单随机抽样方法,创建训练集和测试集 (2)用训练集创建逻辑回归模型 (3)用测试集预测贷款结果,并用tabl ...

  5. BruteXSS

    0X01安装 我是按照下面这位大牛的博客来的 https://www.cnblogs.com/Pitcoft/p/6341322.html 0X02使用BruteXSS的使用 #在目录 BruteXS ...

  6. sqlmap自动注入 --REQUEST

    --delay=“参数” 每次http(s)请求之间的延迟时间,浮点数,单位为秒,默认无延迟 --timeout=“参数” 请求超时,浮点数,默认为30秒 --retries=“参数” http(s) ...

  7. java知识查漏补缺

    一.重写(override)和重载(overload)的区别 二者除了名字相似,其实没什么联系 范围不同:重载发生在同一个类的不同方法之间.重写发生在父类和子类自荐. 前提: 重载要求:方法名相同,参 ...

  8. linux如何查看所有的用户和组信息(转载)

    [步骤一]cat /etc/passwdcat /etc/passwd查看所有的用户信息,详情如下图 [步骤二]cat /etc/passwd|grep 用户名 cat /etc/passwd|gre ...

  9. mysql的双主模式配置

    第一台:192.168.0.160 第二台:192.168.0.170 主从配置,第一步:192.168.0.160 作为主数据库,192.168.0.170作为从数据库,配置如下: ======== ...

  10. Firefox63以后 禁止自动更新方式

    参考:https://bbs.kafan.cn/thread-2135160-1-1.html 63版以后在prefs.js文件末尾加代码来禁止自动更新的方式失效 新方式: 使用DisableAppU ...