神题,使我原神都不想启动
查看原帖
神题,使我原神都不想启动
741169
Xlw6friend楼主2024/4/13 01:21

非常难绷boss打的我原地升天,8pts on#11。 警示后人翻了一万年了属于是。 见者玄关

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
const int N = 2e5+5;
inline int read() {
	int x=0,f=1;char C=getchar();
	while(C<'0'||C>'9'){if(C=='-') f=-1;C=getchar();}
	while(C>='0'&&C<='9') x=(x<<3)+(x<<1)+(C^48),C=getchar();
	return x*f;
}
inline char get() {
	char C=getchar();
	while ((C<'a'||C>'z')&&(C<'A'||C>'Z')) C=getchar();
	return C;
}
inline void write(int x){
    if(x<0){putchar('-'); x=-x;}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
int n, q, u, v, w, x, y;
char op;
pii E[N];
vector<pii> e[N];
int de[N], sz[N], dfn[N], f[N], a[N], t[N], top[N], cnt;
void dfs1(int u, int fa)
{
	de[u] = de[fa]+1;
	sz[u] = 1;
	f[u] = fa;
	for (auto v : e[u])
	{
		if (v.first == fa) continue;
		t[v.first] = v.second;
		dfs1(v.first, u);
		sz[u] += sz[v.first]; 
	}
}
void dfs2(int u, int fir)
{
	dfn[u] = ++cnt;
	a[cnt] = t[u];
	top[u] = fir;
	int hson = 0;
	for (auto v : e[u])
	{
		if (v.first != f[u] && sz[v.first] > sz[hson])
			hson = v.first;
	}
	if (!hson) return;
	dfs2(hson, fir);
	for (auto v : e[u])
	{
		if (v.first != f[u] && v.first != hson)
			dfs2(v.first, v.first);
	}
}
int sum[N<<2], maxx[N<<2], minn[N<<2];
bool tag[N<<2];
void push_down(int rt)
{
	if (tag[rt])
	{
		sum[rt<<1] = -sum[rt<<1];
		maxx[rt<<1] = -maxx[rt<<1];
		minn[rt<<1] = -minn[rt<<1];
		swap(maxx[rt<<1], minn[rt<<1]);
		sum[rt<<1|1] = -sum[rt<<1|1];
		maxx[rt<<1|1] = -maxx[rt<<1|1];
		minn[rt<<1|1] = -minn[rt<<1|1];
		swap(maxx[rt<<1|1], minn[rt<<1|1]);
		
		tag[rt<<1] ^= 1;
		tag[rt<<1|1] ^= 1;
		tag[rt] = 0;
	}
}
void push_up(int rt)
{
	sum[rt] = sum[rt<<1]+sum[rt<<1|1];
	maxx[rt] = max(maxx[rt<<1], maxx[rt<<1|1]);
	minn[rt] = min(minn[rt<<1], minn[rt<<1|1]);
}
void build(int rt, int l, int r)
{
	if (l == r)
	{
		sum[rt] = maxx[rt] = minn[rt] = a[l];
		return;
	}
	int mid = (l+r)>>1;
	build(rt<<1, l, mid);
	build(rt<<1|1, mid+1, r);
	push_up(rt);
}
void re(int rt, int l, int r, int ql, int qr)
{
	if (ql <= l && r <= qr)
	{
		sum[rt] = -sum[rt];
		maxx[rt] = -maxx[rt];
		minn[rt] = -minn[rt];
		swap(maxx[rt], minn[rt]);
		tag[rt] ^= 1;
		return;
	}
	push_down(rt);
	int mid = (l+r)>>1;
	if (ql <= mid)
		re(rt<<1, l, mid, ql, qr);
	if (qr >= mid+1)
		re(rt<<1|1, mid+1, r, ql, qr);
	push_up(rt);
}
void update(int rt, int l, int r, int pos)
{
	if (l == r)
	{
		sum[rt] = maxx[rt] = minn[rt] = a[l];
		return;
	}
	push_down(rt);
	int mid = (l+r)>>1;
	if (pos <= mid)
		update(rt<<1, l, mid, pos);
	else
		update(rt<<1|1, mid+1, r, pos);
	push_up(rt);
}
int qsum(int rt, int l, int r, int ql, int qr)
{
	if (ql <= l && r <= qr)
	{
		return sum[rt];
	}
	push_down(rt);
	int mid = (l+r)>>1;
	int res = 0;
	if (ql <= mid)
		res += qsum(rt<<1, l, mid, ql, qr);
	if (qr >= mid+1)
		res += qsum(rt<<1|1, mid+1, r, ql, qr);
	return res;
}
int qmax(int rt, int l, int r, int ql, int qr)
{
	if (ql <= l && r <= qr)
	{
		return maxx[rt];
	}
	push_down(rt);
	int mid = (l+r)>>1;
	int res = -1e9;
	if (ql <= mid)
		res = max(res, qmax(rt<<1, l, mid, ql, qr));
	if (qr >= mid+1)
		res = max(res, qmax(rt<<1|1, mid+1, r, ql, qr));
	return res;
}
int qmin(int rt, int l, int r, int ql, int qr)
{
	if (ql <= l && r <= qr)
	{
		return minn[rt];
	}
	push_down(rt);
	int mid = (l+r)>>1;
	int res = 1e9;
	if (ql <= mid)
		res = min(res, qmin(rt<<1, l, mid, ql, qr));
	if (qr >= mid+1)
		res = min(res, qmin(rt<<1|1, mid+1, r, ql, qr));
	return res;
}
vector<pii> p;
void path(int x, int y)
{
	p.clear();
	while (top[x] != top[y])
	{
		if (de[top[x]] < de[top[y]]) swap(x, y);
		p.push_back({dfn[top[x]], dfn[x]});
		x = f[top[x]];
	}
	if (de[top[x]] > de[top[y]]) swap(x, y);
	if (x != y)
		p.push_back({dfn[x]+1, dfn[y]});
}
signed main()
{
	//freopen("P1505_1.in", "r", stdin);
	n = read();
	for (int i = 1; i < n; i++)
	{
		u = read()+1;
		v = read()+1;
		w = read();
		e[u].push_back({v, w});
		e[v].push_back({u, w});
		E[i] = {u, v};
	}
	dfs1(1, 0);
	dfs2(1, 1); 
	build(1, 1, n);
	q = read();
	while (q--)
	{
		op = get();
		if (op == 'C')
		{
			x = read();
			y = read();
			if (de[E[x].first] > de[E[x].second]) v = E[x].first;
			else v = E[x].second;
			t[v] = y;
			a[dfn[v]] = y;
			update(1, 1, n, dfn[v]);
		}
		else if (op == 'N')
		{
		 	x = read()+1;
		 	y = read()+1;
		 	path(x, y);
		 	for (auto i : p)
		 		re(1, 1, n, i.first, i.second);	
		}
		else
		{
			op = get();
			x = read()+1;
		 	y = read()+1;
		 	path(x, y);
		 	int res;
		 	if (op == 'U')
		 	{
		 		res = 0;
		 		for (auto i : p)
		 			res += qsum(1, 1, n, i.first, i.second);
			}
			else if (op == 'A')
			{
				res = -1e9;
				for (auto i : p)
		 			res = max(res, qmax(1, 1, n, i.first, i.second));
			}
			else
			{
				res = 1e9;
				for (auto i : p)
		 			res = min(res, qmin(1, 1, n, i.first, i.second));
			}
			write(res);
			putchar('\n');
		}
	}
 	return 0;
}
2024/4/13 01:21
加载中...