首页 > 其他分享 >【LCT、树状数组】CF1137F Matches Are Not a Child's Play

【LCT、树状数组】CF1137F Matches Are Not a Child's Play

时间:2023-10-19 11:24:10浏览次数:39  
标签:LCT CF1137F rep tr Play tn int makeroot query

哈人*3400,是不是贺过了个 1F (?

单点编号 \(\to max + 1\),动态维护 prufer 序列删除了哪些点。

看似不可做,但是不难发现我们一个点被更改其他点的相对次序不会改变,反而 \(x \to max\) 这条链的删除次序到了最后面。

然后我们以权值最大点为根,不难发现每次只是对根到该点的链更改了顺序,且顺序是从根到该点。

这个不就是 access 咩!!考虑树状数组维护每个颜色即可,考虑 makeroot 后,然后链上深度比该点大的点先删,所以加上右儿子即可。

时间复杂度 \(O(n \log^2 n)\),没想到竟然跑的过去!有点快。

#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l; i <= r; i ++)
#define per(i, r, l) for (int i = r; i >= l; i --)
/*为了芋泥啵啵我抽胖了双脸*/
#define lowbit(x) (x & -x)
using namespace std;
typedef long long ll;
const int _ = 5e5 + 5;

int n, m, tn;
vector <int> e[_];

struct Fenwick { 
	int c[_];
	void clr () {
		rep(i, 1, n) c[i] = 1;
		rep(i, 1, n + m) if (i + lowbit(i) <= n + m) c[i + lowbit(i)] += c[i]; 
	}
	void add (int x, int k) {
		while (x <= n + m) {
			c[x] += k, x += lowbit(x);
		}
		return ;
	}
	int query (int x) {
		int ret = 0;
		while (x) ret += c[x], x -= lowbit(x);
		return ret;
	}
} tr;

namespace LinkCutTree {
	int fa[_], ch[_][2], v[_], sz[_], cov[_], flip[_];
	#define lc(x) ch[x][0]
	#define rc(x) ch[x][1]
	bool isr (int x) { return (x == lc(fa[x]) || x == rc(fa[x])); }
	int idx (int x) { return x == rc(fa[x]); }
	void pushup (int x) { sz[x] = sz[lc(x)] + sz[rc(x)] + 1; }
	void rev (int x) { flip[x] ^= 1, swap(lc(x), rc(x)); }
	void pushdown (int x) {
		if (flip[x]) {
			flip[x] = 0;
			if (lc(x)) rev(lc(x));
			if (rc(x)) rev(rc(x));
		}
		if (cov[x]) {
			if (lc(x)) cov[lc(x)] = v[lc(x)] = cov[x];
			if (rc(x)) cov[rc(x)] = v[rc(x)] = cov[x];
			cov[x] = 0;
		}
	}
	void update (int x) { if (isr(x)) update(fa[x]); pushdown(x); }
	void rotate (int x) {
		int y = fa[x], z = fa[y], fp = idx(y), p = idx(x);
		if (isr(y)) ch[z][fp] = x; 
		ch[y][p] = ch[x][!p], ch[x][!p] = y;
		fa[y] = x, fa[x] = z;
		if (ch[y][p]) fa[ch[y][p]] = y;
		pushup(y), pushup(x);
	}
	void splay (int x) {
		update(x);
		while (isr(x)) {
			int y = fa[x];
			if (isr(y)) rotate(idx(y) == idx(x) ? y : x);
			rotate(x);
		} pushup(x);
	}
	void access (int x) {
		int lst = 0;
		for (int y = 0; x; x = fa[y = x]) {
			splay(x), rc(x) = y, pushup(x);
			tr.add(v[x], lst - sz[x]);
			lst = sz[x];
		}
	}
	void makeroot (int x, int col) {
		access(x), splay(x), rev(x);
		tr.add(col, sz[x]), 
		v[x] = cov[x] = col;
	}
}
using namespace LinkCutTree;
void dfs (int x, int pa) {
	sz[x] = 1, v[x] = x;
	for (int y : e[x]) if (y != pa) fa[y] = x, dfs(y, x);
}

string op;
int main () {
	//freopen("example.in", "r", stdin);
	//freopen("fk.out", "w", stdout);
	cin >> n >> m;
	tn = n;
	tr.clr();
	rep(i, 1, n - 1) {
		int x, y;
		scanf("%d%d", & x, & y);
		e[x].push_back(y), e[y].push_back(x);
	}
	dfs(1, 0);
	rep(i, 2, n) makeroot(i, i - 1);
	rep(i, 1, m) {
		cin >> op;
		int x, y;
		scanf("%d", & x);
		if (op[0] == 'c') {
			scanf("%d", & y);
			splay(x);
			int rnkx = sz[rc(x)] + 1 + tr.query(v[x] - 1);
			splay(y);
			int rnky = sz[rc(y)] + 1 + tr.query(v[y] - 1);
			if (rnkx < rnky) printf("%d\n", x);
			else printf("%d\n", y);
		} else if (op[0] == 'w') {
			splay(x);
			int rnk  = sz[rc(x)] + 1 + tr.query(v[x] - 1);
			printf("%d\n", rnk);
		} else makeroot(x, tn ++);
	}
	return 0;
}

标签:LCT,CF1137F,rep,tr,Play,tn,int,makeroot,query
From: https://www.cnblogs.com/Custlo/p/17774295.html

相关文章

  • 易语言利用ckplayer写m3u8看片神器随聊
    也不知道什么时候开始,现在视频网站都是用m3u8格式,而且我对这个格式也不了解。不过,是真的不错,以前你想拖动看(拖着看爽),需要等视频前面都加载好,加载到你这里才能看。现在好了,m3u8因为是切片播放的,它只加载你拖动到的那一小节即可播放,确实先进不少。其实据我观察,现在大部分主流......
  • python+playwright 学习-39.登录页面滑动解锁
    前言登录页面会遇到滑块解锁,滑动解锁的目的就是为了防止别人用代码登录(也就是为了防止你自动化登录),有些滑动解锁是需要去拼图这种会难一点。有些直接拖到最最右侧就可以了,本篇讲下最简单的直接滑动最右侧的滑块解锁。滑动解锁场景看下图,是我本地写的一个slider.html网页 ......
  • 关于流媒体播放器EasyPlayer和EasyPlayerPro的介绍以及其区别
    EasyPlayer是一款流媒体播放器系列项目,它支持多种流媒体协议的播放,包括但不限于RTSP、RTMP、HTTP、HLS、UDP、RTP、File等。除此之外,EasyPlayer还支持本地文件播放和多种功能特性,包括本地抓拍、本地录像、播放旋转、多屏播放、倍数播放等。EasyPlayer核心基于ffmpeg,稳定、......
  • Playwright- python 快速开始
    Playwright模块提供了一种启动浏览器实例的方法。以下是使用Playwright驱动自动化的典型示例:fromplaywright.sync_apiimportsync_playwrightdefrun(playwright):chromium=playwright.chromium#or"firefox"or"webkit".browser=chromium.launch()pa......
  • 使用开源播放器VLC media player进行视频格式转换
    VLC是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及DVD、音频CD、VCD及各类流媒体协议。---摘自官网一般用它来播放视频,但其实它也可以转换视频.虽然官网没有明说,我估计转换功能是调用了大佬程序员 法布里斯•贝拉(FabriceBellard)的开源项目FFmpe......
  • Display volume of alsa card on i3status
    Displayvolumeofalsaoni3statusSystem:gentooDesktop:i3wmhereismyi3statusconfigofvolumes:order+="volumemaster"order+="volumespeaker"volumemaster{format="♪%volume"format_muted=......
  • splay
    splay是一种能支持区间操作的平衡树。建树:structsplay_tree{ intf,c[2],cnt,size,val,la;//父亲、儿子、节点数量、子树大小、节点权值、懒标记}t[N];pushup和pushdown操作:voidpushup(intp){ t[p].size=t[t[p].c[0]].size+t[t[p].c[1]].size+t[p].cnt;}voidpu......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-20-处理鼠标拖拽-下篇
    1.简介上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,其次有人私信宏哥说是有那种类似拼图的验证码如何处理。于是写了这一篇文章,另外也是相对前边做一个简单的总结......
  • 使用 QuickTime Player 将手机投屏到旧版 Macbook pro
    由于旧版的MacBookPro不支持AirPlay,我们可以通过Mac系统自带的应用程序【QuickTimePlayer】来进行投屏操作。以下是具体的步骤:首先,使用USB数据线将你的iPhone和Mac连接起来。此时,手机屏幕上会出现一个是否信任此电脑的提示,你应当选择信任。接着,在Mac的菜单栏中......
  • python+playwright 学习-61 Playwright 和 Selenium 的区别是什么?
    前言最近有不少同学问到Playwright和Selenium的区别是什么?有同学可能之前学过selenium了,再学一个playwright感觉有些多余,可能之前有项目已经是selenium写的了,换成playwright需要时间成本,并且可能有未知风险。也有同学之前可能没学过selenium,现在正准备入手一个web......