Description

给出一个 n∗mn*mn∗m 的网格图,保证所有位置上的数形成一个 1−n∗m1 -n*m1−n∗m 的排列。

问有多少个值域区间 [l,r][l,r][l,r] 满足,在 [l,r][l,r][l,r] 中的数在网格图上的位置形成一棵树。

n∗m≤200000,n,m≤1000n*m\leq200000,n,m\leq1000n∗m≤200000,n,m≤1000

题目链接:Codeforces 1109F. Sasha and Algorithm of Silence’s Sounds

Solution

  • 考虑到形成一棵树要同时满足两个条件:无环、连通

  • 维护两个指针 l,rl,rl,r ,表示当前做到的值域范围。

  • 每次将 rrr 右移一位,用 LCT 维护最小的 lll 使得将 [l,r][l,r][l,r] 的点加入后没有成环,即森林(条件①)。

  • 那么我们要计算的就是这个区间内有多少个 l′l'l′ 使得 [l′,r][l',r][l′,r] 满足条件。

  • 由于 连通块个数 = 点数 - 边数 ,那么我们维护一棵线段树记录每个位置的 “点数 - 边数” 。

  • 注意到这个值是非负的,于是线段树统计区间最小值及其个数,支持区间加减和区间查询即可。

  • 我们看看区间 [l,r][l,r][l,r] 内的最小值是不是 111 ,是就加上其个数就可以了(条件②)。

  • 时间复杂度 O(nmlog(nm))O(nm\ log\ (nm))O(nm log (nm)) 。

Code

#include<cstdio>
#include<algorithm>
#include<cctype>
using namespace std;
typedef pair<int,int> PI;
const int N=2e5+5,M=1005;
const int way[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
struct node
{int x,y;
}a[N];
int n,m,up,top,qx,qy,qz;
long long ans;
int fa[N],s[N][2],st[N];
bool rev[N];
PI f[N<<2];
int b[M][M],c[N<<2];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline bool pd(int x)
{return x==s[fa[x]][1];
}
inline bool isroot(int x)
{return x^s[fa[x]][0] && x^s[fa[x]][1];
}
inline void rotate(int x)
{int y=fa[x],w=pd(x);if((fa[x]=fa[y]) && !isroot(y)) s[fa[y]][pd(y)]=x;if(s[y][w]=s[x][w^1]) fa[s[y][w]]=y;s[fa[y]=x][w^1]=y;
}
inline void reverse(int x)
{if(x) swap(s[x][0],s[x][1]),rev[x]^=1;
}
inline void down(int x)
{if(rev[x]){reverse(s[x][0]),reverse(s[x][1]);rev[x]=false;}
}
inline void splay(int x)
{for(int y=st[top=1]=x;!isroot(y);y=fa[y]) st[++top]=fa[y];while(top) down(st[top--]);for(int y;!isroot(x);rotate(x))if(!isroot(y=fa[x])) rotate(pd(x)==pd(y)?y:x);
}
inline void access(int x)
{for(int y=0;x;x=fa[y=x]) splay(x),s[x][1]=y;
}
inline void mkroot(int x)
{access(x),splay(x),reverse(x);
}
inline void link(int x,int y)
{mkroot(x),fa[x]=y;
}
inline void cut(int x,int y)
{mkroot(x),access(y),splay(y);s[y][0]=fa[x]=0;
}
inline bool connect(int x,int y)
{mkroot(x),access(y),splay(y);while(s[y][0]) y=s[y][0];return x==y;
}
inline void down1(int v)
{if(c[v]){f[v<<1].first+=c[v];f[v<<1|1].first+=c[v];c[v<<1]+=c[v];c[v<<1|1]+=c[v];c[v]=0;}
}
void make(int v,int l,int r)
{if(l==r){f[v].second=1;return;}int mid=l+r>>1;make(v<<1,l,mid);make(v<<1|1,mid+1,r);f[v].second=f[v<<1].second+f[v<<1|1].second;
}
PI cmin(PI x,PI y)
{if(x.first<y.first) return x;if(x.first>y.first) return y;return make_pair(x.first,x.second+y.second);
}
void change(int v,int l,int r)
{if(qx<=l && r<=qy){f[v].first+=qz;c[v]+=qz;return;}down1(v);int mid=l+r>>1;if(qx<=mid) change(v<<1,l,mid);if(qy>mid) change(v<<1|1,mid+1,r);f[v]=cmin(f[v<<1],f[v<<1|1]);
}
PI find(int v,int l,int r)
{if(qx<=l && r<=qy) return f[v];down1(v);int mid=l+r>>1;PI val(N,0);if(qx<=mid) val=find(v<<1,l,mid);if(qy>mid) val=cmin(val,find(v<<1|1,mid+1,r));return val;
}
inline bool judge(int l,int r)
{for(int i=0;i<3;i++){int x=a[r].x+way[i][0],y=a[r].y+way[i][1];if(!x || x>n || !y || y>m) continue;if(b[x][y]<l || b[x][y]>r) continue;for(int j=i+1;j<4;j++){int xx=a[r].x+way[j][0],yy=a[r].y+way[j][1];if(!xx || xx>n || !yy || yy>m) continue;if(b[xx][yy]<l || b[xx][yy]>r) continue;if(connect(b[x][y],b[xx][yy])) return true;}}return false;
}
inline void del(int l)
{for(int i=0;i<4;i++){int x=a[l].x+way[i][0],y=a[l].y+way[i][1];if(!x || x>n || !y || y>m) continue;if(connect(b[x][y],l))cut(b[x][y],l);}
}
inline void add(int l,int r)
{for(int i=0;i<4;i++){int x=a[r].x+way[i][0],y=a[r].y+way[i][1];if(!x || x>n || !y || y>m) continue;if(l<=b[x][y] && b[x][y]<r){link(b[x][y],r);qx=1,qy=b[x][y],qz=-1;change(1,1,up);}}qx=l,qy=r,qz=1;change(1,1,up);
}
int main()
{n=read(),m=read(),up=n*m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){b[i][j]=read();a[b[i][j]]=(node){i,j};}make(1,1,up);for(int i=1,j=1;i<=up;i++){while(judge(j,i)) del(j++);add(j,i);qx=j,qy=i;PI sum=find(1,1,up);ans+=sum.first==1?sum.second:0;}printf("%I64d",ans);return 0;
}

Codeforces 1109F. Sasha and Algorithm of Silence's Sounds相关推荐

  1. CodeForces - 1109A Sasha and a Bit of Relax(思维+异或和,好题)

    题目链接:点击查看 题目大意:给出n个数,现在求满足下面条件的区间数: 对于区间[l,r],r-l+1为偶数 对于中点mid=(r-l+1)/2,满足 求满足条件的区间对数(l,r) 题目分析:一开始 ...

  2. Codeforces Round #539 (Div. 1)

    有史以来打的最烂的一场...B题都WA了两发,D题数树不知道结论不会做,E题没调出来...GG了. 也说明我实力其实还不够吧...再多加练习,我还有机会继续努力. 题目链接 A. Sasha and ...

  3. Sasha and a Bit of Relax K倍区间 (前缀和异或 前缀和计数 思维)

    (29条消息) CodeForces - 1109A Sasha and a Bit of Relax(思维+异或和,好题)_Frozen_Guardian的博客-CSDN博客 Sasha and a ...

  4. Codeforces上几个非常妙的数据结构题

    Codeforces 833B The Bakery Codeforces 633H Fibonacci-ish II Codeforces 522D Closest Equals Codeforce ...

  5. 【CF 比赛记录】Roye_ack的艰难上分日常(35)

    目录 #792 Div1+Div2 AC  A1. Digit Minimization #Edu 129 Div2 !A2. Game with Cards #795 Div2 AC  A3. Be ...

  6. 【codeforces 718 CD】C. Sasha and ArrayD. Andrew and Chemistry

    C. Sasha and Array 题目大意&题目链接: http://codeforces.com/problemset/problem/718/C 长度为n的正整数数列,有m次操作,$o ...

  7. Codeforces #539 (Div. 1) A. Sasha and a Bit of Relax (异或 前缀和)

    题目连接: https://codeforces.com/problemset/problem/1109/A 题目大意: 给定n个数 问有多少个偶数长度的区间l,r 使得mid=(l+r-1)/2,l ...

  8. Codeforces Round #539 (Div. 2) C. Sasha and a Bit of Relax

    链接:https://codeforces.com/problemset/problem/1113/C 题意:长度为n的序列 ,若l,r满足,则称这对l,r为funny,其中mid=(r-l+)/2 ...

  9. Sasha and a Very Easy Test CodeForces - 1109E (数学,线段树)

    大意: 给定n元素序列, q个操作: (1)区间乘 (2)单点除(保证整除) (3)区间求和对m取模 要求回答所有操作(3)的结果 主要是除法难办, 假设单点除$x$, $x$中与$m$互素的素因子可 ...

最新文章

  1. 精心总结 Python『八宗罪』,邀你来吐槽
  2. C#和nodejs的互操作
  3. 关于软件测试第一次作业的几处提示
  4. Hive--优化参数
  5. CISA 已遭利用漏洞列表新增17项
  6. Problem 2128 最长子串
  7. dos系统功能调用的屏幕显示字符是( )号调用_linux混杂设备驱动模型分析(字符设备驱动模型使用篇)...
  8. java 把对象转成map_Java对象转换成Map
  9. EDA技术与应用课笔记
  10. 也来谈谈自己做为面试官的面试流程
  11. Java微信如何自动添加好友,微信自动加好友 模拟位置
  12. python二手房课程设计_基于python爬取链家二手房信息代码示例
  13. C# 读取写入Json文件
  14. 100部经典中国电影,你看过几部?
  15. 运营可能是一种思维方式
  16. 领英不能加人怎么办?
  17. HackTheBox –Craft实战
  18. 教你如何批量新建文件夹并命名?
  19. github+hexo搭建自己的博客【真正的从0到1】20180122为准
  20. 2021.3.2-3.8 人工智能行业每周技术动态

热门文章

  1. 标题要在3~5字之间-三年总结
  2. 吴恩达 coursera ML 第十七课总结+作业答案
  3. (转)谷歌公开dopamine
  4. 软件包管理 rpm yum apt-get dpkg
  5. 【Paper】研究论文不会写?先来学学怎么做西红柿炒鹌鹑蛋吧!
  6. 科大星云诗社动态20210216
  7. Go进阶(4): string接口函数+时间接口函数+内置函数+错误处理
  8. 普211标准三维EE零基础转CS申
  9. 期待着DELPHI的浴火重生
  10. 在数据库什么是主键与外键