题解请看 Felix-Lee的CSDN博客

写的很好,不过最后不用判断最小值是不是1,因为[i,i]只有一个点,一定满足条件,最小值一定是1。

CODE

写完就A,刺激。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define X first
#define Y second
inline void read(int &x) {
int flag = 1; char ch;
while(!isdigit(ch=getchar()))if(ch=='-')flag=-flag;
for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
x*=flag;
}
const int MAXN = 1005;
const int MAXP = 1000005;
const int INF = 1e9;
namespace LCT {
#define ls ch[x][0]
#define rs ch[x][1]
int ch[MAXP][2], fa[MAXP];
bool rev[MAXP];
inline bool isr(int x) { return ch[fa[x]][0] != x && ch[fa[x]][1] != x; }
inline bool get(int x) { return ch[fa[x]][1] == x; }
inline void mt(int x) { if(rev[x]) rev[x]^=1, rev[ls]^=1, rev[rs]^=1, swap(ls, rs); }
void mtpath(int x) { if(!isr(x)) mtpath(fa[x]); mt(x); }
inline void rot(int x) {
int y = fa[x], z = fa[y]; bool l = get(x), r = l^1;
if(!isr(y)) ch[z][get(y)] = x;
fa[ch[x][r]] = y; fa[y] = x; fa[x] = z;
ch[y][l] = ch[x][r]; ch[x][r] = y;
}
inline void splay(int x) {
mtpath(x);
for(; !isr(x); rot(x))
if(!isr(fa[x])) rot(get(fa[x]) == get(x) ? fa[x] : x);
}
inline void access(int x) { int y = 0;
for(; x; x = fa[y=x]) splay(x), ch[x][1] = y;
}
inline void bert(int x) { access(x), splay(x), rev[x]^=1; }
inline int sert(int x) { access(x), splay(x); for(; ch[x][0]; x=ch[x][0]); return x; }
inline void link(int x, int y) { bert(x); if(sert(y) != x) fa[x] = y; }
inline void cut(int x, int y) { bert(x); sert(y); fa[x] = ch[y][0] = 0; }
inline bool connect(int x, int y) { bert(x); return sert(y) == x; }
}
using namespace LCT;
int n, m, a[MAXN][MAXN], tot;
#define pii pair<int, int>
pii pos[MAXP], val[MAXP<<2]; int lz[MAXP<<2];
inline pii merge(pii A, pii B) {
if(A.X < B.X) return A;
else if(A.X > B.X) return B;
return pii(A.X, A.Y + B.Y);
}
inline void upd(int i) { val[i] = merge(val[i<<1], val[i<<1|1]); }
inline void pd(int i) {
if(lz[i]) {
val[i<<1].X += lz[i], lz[i<<1] += lz[i];
val[i<<1|1].X += lz[i], lz[i<<1|1] += lz[i];
lz[i] = 0;
}
}
void build(int i, int l, int r) {
if(l == r) { val[i] = pii(0, 1); return; }
int mid = (l + r) >> 1;
build(i<<1, l, mid);
build(i<<1|1, mid+1, r);
upd(i);
}
void modify(int i, int l, int r, int x, int y, int v) {
if(x <= l && r <= y) { val[i].X += v, lz[i] += v; return; }
pd(i);
int mid = (l + r) >> 1;
if(x <= mid) modify(i<<1, l, mid, x, y, v);
if(y > mid) modify(i<<1|1, mid+1, r, x, y, v);
upd(i);
}
pii query(int i, int l, int r, int x, int y) {
if(x <= l && r <= y) return val[i];
pd(i);
int mid = (l + r) >> 1;
pii re = pii(INF, 0);
if(x <= mid) re = merge(re, query(i<<1, l, mid, x, y));
if(y > mid) re = merge(re, query(i<<1|1, mid+1, r, x, y));
return re;
}
const int dx[4] = { 0, 0, 1, -1 };
const int dy[4] = { 1, -1, 0, 0 };
inline bool chkout(int x, int y) {
return x < 1 || y < 1 || x > n || y > m;
}
inline bool check(int l, int r) {
for(int i = 0; i < 3; ++i) {
int x = pos[r].X + dx[i];
int y = pos[r].Y + dy[i];
if(chkout(x, y) || a[x][y] < l || a[x][y] > r) continue;
for(int j = i+1; j < 4; ++j) {
int u = pos[r].X + dx[j];
int v = pos[r].Y + dy[j];
if(chkout(u, v) || a[u][v] < l || a[u][v] > r) continue;
if(connect(a[x][y], a[u][v])) return 0;
}
}
return 1;
}
inline void del(int l) {
for(int i = 0; i < 4; ++i) {
int x = pos[l].X + dx[i];
int y = pos[l].Y + dy[i];
if(chkout(x, y) || !connect(l, a[x][y])) continue;
cut(l, a[x][y]);
}
}
inline void solve(int l, int r) {
for(int i = 0; i < 4; ++i) {
int x = pos[r].X + dx[i];
int y = pos[r].Y + dy[i];
if(chkout(x, y) || a[x][y] < l || a[x][y] > r) continue;
link(a[x][y], r);
modify(1, 1, tot, 1, a[x][y], -1);
}
modify(1, 1, tot, l, r, 1);
}
int main () {
scanf("%d%d", &n, &m); tot = n*m;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
scanf("%d", &a[i][j]), pos[a[i][j]] = pii(i, j);
build(1, 1, tot);
LL ans = 0;
for(int i = 1, j = 1; i <= tot; ++i) {
while(!check(j, i)) del(j++);
solve(j, i);
ans += query(1, 1, tot, j, i).second;
}
printf("%I64d\n", ans);
}

Codeforces Round #539 (Div. 1) 1109F. Sasha and Algorithm of Silence's Sounds LCT+线段树 (two pointers)的更多相关文章

  1. Codeforces Round #539 (Div. 1) C. Sasha and a Patient Friend 动态开点线段树

    题解看这里 liouzhou_101的博客园 更简洁的代码看这里: #include <bits/stdc++.h> using namespace std; typedef long l ...

  2. Codeforces Round #539 (Div. 2) - D. Sasha and One More Name(思维)

    Problem   Codeforces Round #539 (Div. 2) - D. Sasha and One More Name Time Limit: 1000 mSec Problem ...

  3. Codeforces Round #539 (Div. 2) - C. Sasha and a Bit of Relax(思维题)

    Problem   Codeforces Round #539 (Div. 2) - C. Sasha and a Bit of Relax Time Limit: 2000 mSec Problem ...

  4. Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 【区间更新 线段树】

    传送门:http://codeforces.com/contest/1108/problem/E2 E2. Array and Segments (Hard version) time limit p ...

  5. Codeforces 1109F - Sasha and Algorithm of Silence's Sounds(LCT)

    Codeforces 题面传送门 & 洛谷题面传送门 讲个笑话,这题是 2020.10.13 dxm 讲题时的一道例题,而我刚好在一年后的今天,也就是 2021.10.13 学 LCT 时做到 ...

  6. Codeforces Round #539 (Div. 2) C. Sasha and a Bit of Relax(前缀异或和)

    转载自:https://blog.csdn.net/Charles_Zaqdt/article/details/87522917 题目链接:https://codeforces.com/contest ...

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

    题中意思显而易见,即求满足al⊕al+1⊕…⊕amid=amid+1⊕amid+2⊕…⊕ar且l到r的区间长为偶数的这样的数对(l,r)的个数. 若al⊕al+1⊕…⊕amid=amid+1⊕amid ...

  8. Codeforces Round #539 (Div. 1) E - Sasha and a Very Easy Test 线段树

    如果mod是质数就好做了,但是做除法的时候对于合数mod可能没有逆元.所以就只有存一下mod的每个质因数(最多9个)的幂,和剩下一坨与mod互质的一部分.然后就能做了.有点恶心. CODE #incl ...

  9. Codeforces Round #169 (Div. 2) E. Little Girl and Problem on Trees dfs序+线段树

    E. Little Girl and Problem on Trees time limit per test 2 seconds memory limit per test 256 megabyte ...

随机推荐

  1. [转帖]AIDA64 6.10版发布:全面支持中国兆芯、海光x86 CPU

    AIDA64 6.10版发布:全面支持中国兆芯.海光x86 CPU https://www.cnbeta.com/articles/soft/892877.htm 支持国产x86了 作为硬件识别工具领 ...

  2. java访问磁盘文件

    转载,务必写上原文链接 !(尊重与你分享知识的人) 目录 文件 File 对象 VS FileDescriptor 对象 文件讲解java访问磁盘文件过程 fileReader.read() 图解ja ...

  3. PAT(B) 1018 锤子剪刀布(C:20分,Java:18分)

    题目链接:1018 锤子剪刀布 分析 用一个二维数组保存两人所有回合的手势 甲乙的胜,平,负的次数刚好相反,用3个变量表示就可以 手势单独保存在signs[3]中,注意顺序.题目原文:如果解不唯一,则 ...

  4. go 函数 命名返回值

    Go 的返回值可以被命名,并且像变量那样使用. 返回值的名称应当具有一定的意义,可以作为文档使用. 没有参数的 return 语句返回结果的当前值.也就是`直接`返回. 直接返回语句仅应当用在像下面这 ...

  5. MyBatis_02 框架

    今日内容 动态SQL语句 Xml方式 注解方式 MyBatis的缓存 MyBatis的关联查询 MyBatis逆向工程 动态SQL语句 动态SQL是什么 就是相对与固定SQL.就是通过传入的参数不一样 ...

  6. shell习题第24题:杀进程

    [题目要求] 一台机器负载高,top查看到有很多sh的进程,然后top -c查看可以看到对应的进程命令是sh -c /bin/clear.sh 经分析后发现是因为该脚本执行时间太长,导致后续执行时,上 ...

  7. redis 缓存对象、列表

    在spring boot环境下有个StringRedisTemplate对象,默认已经为我们配置好了,只需要自动注入过来就能用,但是使用它只能在Redis中存放字符串.具体操作如下: @RunWith ...

  8. 怎样用sql语句复制表table1到表table2的同时复制主键

    原文:怎样用sql语句复制表table1到表table2的同时复制主键 在从table1表复制到table2的时候,我们会用语句: select * into table2 from table1 但 ...

  9. MySQL高版本默认密码查找

    解决方式如下: 1:找到mysql的安装目录到跟目录下找到Data文件夹 2:打开Data/文件夹找到一个以.err结尾的文件用记事本打开,里面记录了你安装Mysql的一些日志,其中就记录了你的初始密 ...

  10. Sublime Text 添加java环境

    jre/bin/ 目录下添加 runJava.bat @ECHO OFF cd %~dp1 ECHO Compiling %~nx1....... IF EXIST %~n1.class ( DEL ...