Codeforces Round #539 (Div. 1) 1109F. Sasha and Algorithm of Silence's Sounds LCT+线段树 (two pointers)
题解请看 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)的更多相关文章
- Codeforces Round #539 (Div. 1) C. Sasha and a Patient Friend 动态开点线段树
		题解看这里 liouzhou_101的博客园 更简洁的代码看这里: #include <bits/stdc++.h> using namespace std; typedef long l ... 
- 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 ... 
- 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 ... 
- 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 ... 
- Codeforces 1109F - Sasha and Algorithm of Silence's Sounds(LCT)
		Codeforces 题面传送门 & 洛谷题面传送门 讲个笑话,这题是 2020.10.13 dxm 讲题时的一道例题,而我刚好在一年后的今天,也就是 2021.10.13 学 LCT 时做到 ... 
- 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 ... 
- 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 ... 
- Codeforces Round #539 (Div. 1) E - Sasha and a Very Easy Test  线段树
		如果mod是质数就好做了,但是做除法的时候对于合数mod可能没有逆元.所以就只有存一下mod的每个质因数(最多9个)的幂,和剩下一坨与mod互质的一部分.然后就能做了.有点恶心. CODE #incl ... 
- 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 ... 
随机推荐
- ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file '/u01/app/oracle/product/19.2.0/db_1/dbs/initsanshi.ora'报错
			本人是在Linux安装Oracle19C之后,启动数据库时,XSHELL命令行窗口报的该错误,看了几个解决方案之后,总结如下 从字面的意思来看,是在dbs目录当中没有这个initsanshi.ora文 ... 
- [转帖]Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇)
			Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇) https://www.infoq.cn/article/3IJ7L8HVR2MXhqaqI2RA 学长的文章.. ... 
- 多文件上传,添加重复文件时无法触发onchange事件。
			<input type="file" id="upload" @change="getFile($event)" multiple=& ... 
- Python 的 Mixin 类(转)
			转1:https://www.cnblogs.com/aademeng/articles/7262520.html 转2:https://blog.csdn.net/u010377372/articl ... 
- react中jsx文件是如何转换成js对象的
			通过在线babel转换器,转换出jsx是如何变成js对象的 jsx文件 加入了正常的标签以及嵌套标签以及方法属性 function hello() { click=()=>{ console.l ... 
- 【转载】Java枚举的使用
			枚举类型可以取代以往常量的定义方式,即将常量封装在类或接口中.此外,枚举类型还提供了安全检查功能.枚举类型本质上还是以类的形式存在. 1.使用枚举类型设置常量以往设置常量,通常将常量放置在接口中,这样 ... 
- SQL logic error no such module: fts5 解决方案
			因项目原因,需要使用SQLite的全文索引,用到了最新的fts5模块 但在咱们.net framwork中却会提示“SQL logic error no such module: fts5”:找不到f ... 
- gin框架初识(先跑一个简单demo)   ①
			Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 先跑一个demo(先安装gin框架,具体见官方地址): 1.vs ... 
- CSS图片Img等比例缩放且居中显示
			常用来做图片放大显示的遮罩层imgScale HTML <div id="imgScale" > <img src=""> </d ... 
- <s:bean>标签的使用
			今天在使用<s:bean>时出了一个问题,感觉有意思的就记录下来吧,以备学习 在使用这个标签的时候需要注意两个事项: 1.<s:bean>的三个属性 id,name,var,在 ... 
