首页 > 其他分享 >【大联盟】20230701 传送(b) QOJ1878 【No Rest for the Wicked】

【大联盟】20230701 传送(b) QOJ1878 【No Rest for the Wicked】

时间:2023-07-22 17:34:40浏览次数:46  
标签:20230701 tx No int QOJ1878 back tot read lst

题目描述

here

题解

考虑一条路径上只有 \(a\) 的前缀 \(\max\) 才是有用的,不妨考虑按照前缀 \(\max\) 来划分。可以发现,这些连续段直接存在单向边连接。

现在,我们考虑如何求出这些连续段。一个点 \(i\) 可以接在前缀 \(\max\) 为 \(a_j\) 的后面当且仅当 \(a_j\le a_i\le b_j\),所以,对于 \(j\) 可行的前缀 \(\max\) 的值是一个区间。

于是,我们考虑线段树分治来维护出可行的连通块。并且,我们先递归右子树、再递归左子树,类似拓扑排序一样从大往小更新答案。

时间复杂度 \(O(n\log^2 n)\)。

代码

记录

#include <bits/stdc++.h>
#define ls num << 1
#define rs ls | 1
#define li ls, l, mid
#define ri rs, mid + 1, r
#define SZ(x) (int) x.size() - 1
#define all(x) x.begin(), x.end()
#define ms(x, y) memset(x, y, sizeof x)
#define F(i, x, y) for (int i = (x); i <= (y); i++)
#define DF(i, x, y) for (int i = (x); i >= (y); i--)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template <typename T> void chkmax(T& x, T y) { x = max(x, y); }
template <typename T> void chkmin(T& x, T y) { x = min(x, y); }
template <typename T> void read(T &x) {
	x = 0; int f = 1; char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
	for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	x *= f;
}
const int N = 2e5 + 10;
int n, m, a[N], b[N], c[N], fa[N], sz[N], ans[N], t[N << 1], tot;
vector <int> v[N], seg[N << 3], qq[N << 3];
void change(int num, int l, int r, int L, int R, int x) {
	if (L <= l && r <= R) {
		seg[num].push_back(x);
		return;
	} int mid = (l + r) >> 1;
	if (mid >= L) change(li, L, R, x);
	if (mid < R) change(ri, L, R, x);
}
void modify(int num, int l, int r, int x, int y) {
	if (l == r) {
		qq[num].push_back(y);
		return;
	} int mid = (l + r) >> 1;
	if (mid >= x) modify(li, x, y);
	else modify(ri, x, y);
}
bool vis[N];
int find(int x) { return fa[x] == x ? x : find(fa[x]); }
void query(int num, int l, int r) {
	vector <pair <int, int>> lst;
	for (int i: seg[num]) {
		vis[i] = true;
		for (int j: v[i]) if (vis[j]) {
			int tx = find(i), ty = find(j);
			if (tx == ty) continue;
			if (sz[tx] < sz[ty]) swap(tx, ty);
			lst.emplace_back(tx, ty);
			sz[tx] += sz[ty];
			chkmax(c[tx], c[ty]);
			fa[ty] = tx;
		}
	}
	if (l == r) {
		for (int i: qq[num]) {
			int id = find(i);
			ans[i] = c[id];
			for (int j: v[i]) chkmax(c[find(j)], c[id]);
		}
	} else {
		int mid = (l + r) >> 1;
		query(ri);
		query(li);
	}
	while (lst.size()) {
		fa[lst.back().second] = lst.back().second;
		sz[lst.back().first] -= sz[lst.back().second];
		chkmax(c[lst.back().second], c[lst.back().first]);
		lst.pop_back();
	}
	for (int i: seg[num]) vis[i] = false;
}
signed main() {
	//freopen("b.in", "r", stdin);
	//freopen("b.out", "w", stdout);
	read(n), read(m);
	F(i, 1, n) read(a[i]), read(b[i]), read(c[i]), t[++tot] = a[i], t[++tot] = b[i], fa[i] = i, sz[i] = 1;
	sort(t + 1, t + tot + 1);
	tot = unique(t + 1, t + tot + 1) - t - 1;
	F(i, 1, n) a[i] = lower_bound(t + 1, t + tot + 1, a[i]) - t, b[i] = lower_bound(t + 1, t + tot + 1, b[i]) - t, change(1, 1, tot, a[i], b[i], i), modify(1, 1, tot, a[i], i);
	F(i, 1, m) {
		int x, y; read(x), read(y);
		v[x].push_back(y);
		v[y].push_back(x);
	} query(1, 1, tot);
	F(i, 1, n) cout << ans[i] << ' ';
	return 0;
}

标签:20230701,tx,No,int,QOJ1878,back,tot,read,lst
From: https://www.cnblogs.com/zhaohaikun/p/17573770.html

相关文章

  • 7/22·afternoon
    1272:【例9.16】分组背包  http://ybt.ssoier.cn:8088/problem_show.php?pid=1272#include<bits/stdc++.h>usingnamespacestd;structqwert{intw,v;}a[13][31];intV,N,T;intcnt[13],f[203];intmain(){cin>>V>>N>>T;for(inti=1......
  • notebook目录显示设置
    打开AnacondaPrompt窗口,执行第一个命令,用于安装nbextensions:pipinstalljupyter_contrib_nbextensions再执行第二个命令,用于安装javascriptandcssfilesjupytercontribnbextensioninstall--user如果这个报错,就换成下面这个jupytercontrib-nbextensioninstal......
  • JavaNote-概述及安装
    1.Java语言概述1.1Java概述是SUN(StanfordUniversityNetwork,斯坦福大学网络公司)1995年推出的一门高级编程语言。是一种面向Internet的编程语言。Java一开始富有吸引力是因为Java程序可以在Web浏览器中运行。这些Java程序被称为Java小程序(Applet),内嵌在HTML代码中。伴......
  • P1060 [NOIP2006 普及组] 开心的金明 题解
    思路01背包模版题,唯一不同的是加了一个条件就是价格与重要度的乘积。转移方程为:dp[j]=max(dp[j],dp[j-w[i]]+w[i]*v[i]);这里加了滚动数组优化。代码#include<bits/stdc++.h>#definelllonglong#defineldlongdoubleusingnamespacestd;inlinevoidread(int&x){......
  • MCU之Microchip PIC16F17146 Curiosity NANO Evaluation Kit评测报告
    对比完RISC(Proprietary)与RISC-V(OpenSource),来点Microchip的PIC16F17146CuriosityNano(Revision4hasPIC16F17146revB2)EvaluationKit的实测:这块板是多层PCB设计,大量使用SMD贴片元器件,使整板轻而小(51mm20mm5mm,包括按钮开关高度),整个大拇指大小,最重要的是......
  • MCU之Microchip PIC16F17146 Curiosity NANO Evaluation Kit申请与收到有感
    申请到寄到已过去好长时间(三个月):2023-04-22提交发布申请;2023-07-21收到批准包裹.对比十多年以前,ADI美国模拟器件公司与TI美国德州仪器公司的Samples/EvaluationKit,是从美国的Sample/EvaluationKit管理中心,直接用UPS/FedEx/DHL(这三个都有收到过)的AirMail或AirP......
  • Note02: DOS命令
    DOS命令打开CMD的方式(Windows)1.开始+系统+命令提示符2.Win+R,输入cmd打开控制台(推荐)3.在任意的文件夹下面,shift+右键,在此处打开powershell4.资源管理器的地址栏前面加上cmd路径,cmd+空格+地址,例如cmdE:/kdiek5.以管理员方式运行常用的dos命令#盘符切换直接是对应......
  • 【雕爷学编程】Arduino动手做(100)---MAX30102手腕心率模块2
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 【雕爷学编程】Arduino动手做(52)---MicroSD卡读写模块3
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问......
  • 【雕爷学编程】Arduino动手做(52)---MicroSD卡读写模块4
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题......