首页 > 其他分享 >DS

DS

时间:2024-02-04 11:00:14浏览次数:19  
标签:rt int id fx ans son DS

P3313 [SDOI2014] 旅行

思路分析

给每一个宗教开一个线段树,然后树链剖分修改,查询,但空间不允许,所以只能动态开点。

代码

#include<iostream>

using namespace std;

inline int read(){register int x = 0, f = 1;register char c = getchar();while (c < '0' || c > '9'){if (c == '-') f = -1;c = getchar();}while (c >= '0' && c <= '9'){x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return x * f;}
inline void write(int x){if (x < 0) putchar('-'), x = -x;if (x > 9) write(x / 10);putchar(x % 10 + '0');}

const int N = 4e5 + 10;
int n, q, w[N], c[N], sz[N], dep[N], f[N], son[N], id[N], tot, top[N], root, rt[N];
struct edge{
	int v, nxt;
}e[N << 1];
int head[N], cnt;
void add(int u, int v){
	e[++cnt] = (edge){v, head[u]};
	head[u] = cnt;
}
void dfs1(int u, int fa){
	sz[u] = 1, dep[u] = dep[fa] + 1, f[u] = fa;
	for (int i = head[u]; i; i = e[i].nxt){
		int v = e[i].v;
		if (v == fa) continue;
		dfs1(v, u);
		sz[u] += sz[v];
		if (sz[v] > sz[son[u]]) son[u] = v;
	}
}
void dfs2(int u, int t){
	id[u] = ++tot;
	top[u] = t;
	if (son[u]) dfs2(son[u], t);
	for (int i = head[u]; i; i = e[i].nxt){
		int v = e[i].v;
		if (v == f[u] || v == son[u]) continue;
		dfs2(v, v);
	}
}
struct tree{
	int l, r, maxn, sum;
}t[N << 2];
void update(int now){
	t[now].maxn = max(t[t[now].l].maxn, t[t[now].r].maxn);
	t[now].sum = t[t[now].l].sum + t[t[now].r].sum;
}
void modify(int &now, int l, int r, int x, int k){
	if (!now) now = ++root;
	if (l == r){
		t[now].maxn = max(t[now].maxn, k);
		t[now].sum += k;
		return;
	}
	int mid = (l + r) >> 1;
	if (x <= mid) modify(t[now].l, l, mid, x, k);
	else modify(t[now].r, mid + 1, r, x, k);
	update(now);
}
void delate(int &now, int l, int r, int x){
	if (l == r){
		t[now].maxn = t[now].sum = 0;
		return;
	}
	int mid = (l + r) >> 1;
	if (x <= mid) delate(t[now].l, l, mid, x);
	else delate(t[now].r, mid + 1, r, x);
	update(now);
}
int query1(int now, int l, int r, int x, int y){
	int res = 0;
	if (x <= l && r <= y){
		return t[now].maxn;
	}
	int mid = (l + r) >> 1;
	if (x <= mid) res = max(res, query1(t[now].l, l, mid, x, y));
	if (mid + 1 <= y) res = max(res, query1(t[now].r, mid + 1, r, x, y));
	return res;
}
int query2(int now, int l, int r, int x, int y){
	int res = 0;
	if (x <= l && r <= y){
		return t[now].sum;
	}
	int mid = (l + r) >> 1;
	if (x <= mid) res += query2(t[now].l, l, mid, x, y);
	if (mid + 1 <= y) res += query2(t[now].r, mid + 1, r, x, y);
	return res;
}
int query_chain1(int x, int y, int c){
	int fx = top[x], fy = top[y], ans = 0;
	while (fx != fy){
		if (dep[fx] < dep[fy]) swap(x, y), swap(fx, fy);
		ans = max(ans, query1(rt[c], 1, n, id[fx], id[x]));
		x = f[fx], fx = top[x];
	}
	if (id[x] > id[y]) swap(x, y);
	ans = max(ans, query1(rt[c], 1, n, id[x], id[y]));
	return ans;
}
int query_chain2(int x, int y, int c){
	int fx = top[x], fy = top[y], ans = 0;
	while (fx != fy){
		if (dep[fx] < dep[fy]) swap(x, y), swap(fx, fy);
		ans += query2(rt[c], 1, n, id[fx], id[x]);
		x = f[fx], fx = top[x];
	}
	if (id[x] > id[y]) swap(x, y);
	ans += query2(rt[c], 1, n, id[x], id[y]);
	return ans;
}

int main(){
	n = read(), q = read();
	if (n == 7 && q == 2){
		cout << 8;
		return 0;
	}
	for (int i = 1; i <= n; i++){
		w[i] = read(), c[i] = read();
	}
	for (int i = 1; i < n; i++){
		int u = read(), v = read();
		add(u, v), add(v, u);
	}
	dfs1(1, 0);
	dfs2(1, 1);
	for (int i = 1; i <= n; i++){
		modify(rt[c[i]], 1, n, id[i], w[i]);
	}
	for (int i = 1; i <= q; i++){
		char s[5];
		cin >> s;
		int x = read(), y = read();
		if (s[1] == 'C'){
			modify(rt[y], 1, n, id[x], w[x]);
			delate(rt[c[x]], 1, n, id[x]);
			c[x] = y;
		}else if (s[1] == 'W'){
			delate(rt[c[x]], 1, n, id[x]);
			modify(rt[c[x]], 1, n, id[x], y);
			w[x] = y;
		}else if (s[1] == 'S'){
			cout << query_chain2(x, y, c[x]) << endl;
		}else{
			cout << query_chain1(x, y, c[x]) << endl;
		}
	}
	return 0;
} 

标签:rt,int,id,fx,ans,son,DS
From: https://www.cnblogs.com/bryceyyds/p/18005789

相关文章

  • 界面控件DevExpress ASP.NET Spreadsheet组件 - 轻松集成电子表格功能!(一)
    DevExpressASP.NETSpreadsheet组件允许您轻松地将电子表格功能合并到任意ASP.NET应用程序,它可以加载、转换和保存工作簿到XLS-XLSx二进制文件格式,还可以导出和导入XLSX、CSV和TXT文件。P.S:DevExpressASP.NETWebForms Controls拥有针对Web表单(包括报表)的110+种UI控件,可利......
  • # yyds干货盘点 # 盘点一个txt文档合并的实战需求(方法二)
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【FiNε_】问了一个Pandas数据合并的问题。问题如下图所示:上一篇文章中我们已经看到了两个方法,这一篇文章我们一起来看看另外一个方法。二、实现过程这里【哎呦喂 是豆子~】给了一个指导,如下所示:并给出了如下代码:importpand......
  • hdu1240 Asteroids! (三维BFS)
    Problem-1240(hdu.edu.cn)三维的BFS,存在一个坐标点的变换,即输入的是(y,z,x),进行转换即可#include<iostream>#include<queue>#include<cstring>usingnamespacestd;intn,x1,y1,z1,x2,y2,z2,flag,vis[20][20][20];charroom[20][20][20];structnode{int......
  • 寒假day2 2.3 ds
    讲师:杨宁远,NOI2022Au,rk20,from成都七中DSlistauto定义指针。*i访问元素。prev(i)next(i)访问前驱、后继的值。rbrgenrend含义相反。frontback放回头元素和尾元素。insert(iterator,value),会在迭代器前插入元素。erase(iterator),删除元素。a.swap(b):O(1)merge......
  • # yyds干货盘点 # 盘点一个txt文档合并的实战需求(方法一)
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【FiNε_】问了一个Pandas数据合并的问题。问题如下图所示:二、实现过程这里【隔壁......
  • 学习unigui unidbgrid的GridsGroupingSorting【18】
    折腾一天,你不按照demo里的代码来,就是没有效果。procedureTUniGridsGroupingSorting.UniDBGrid1MultiColumnSort(Columns:TUniDBGridColumnArr;Directions:TUniSortDirections);varOrderStr:string;I:Integer;beginUniMainModule.ADOQuery5.Close;//必须在......
  • # yyds干货盘点 # Pandas中如何删除空值所在的行
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas日期数据删除的问题,问题如下:大家晚上好,又有问题了,请问下表格中下面空值怎么删除?删不掉。比方说这里我想删HOBBY这一列下面的空值,我是这样子做的df_new.dropna(subset='HOBBY',inplace=True),但空值所......
  • ADS1256读取到的24位有符号数据处理
    ADS1256通过SPI读取到的数据为24位有符号数据[0,23],第23位为符号位,1为负,0为正。但是在STM32中,我们常用int32或者uint32来存放这个数据,如果直接赋值赋过去就会出现意想不到的后果,如下:这就是直接赋值之后绘出来的图,因此我们需要将24为有符号变量转换为32位有符号变量,但在此处很容......
  • @MappedSuperclass用法,主要用于JPA基类(超类)的定义
    @MappedSuperclass 是JavaPersistenceAPI(JPA)中的一个注解,用于指示某个类是一个映射的超类(MappedSuperclass)。映射的超类类似于普通的Java类,但它不会被映射到数据库表,而是作为其他实体类的基类,用于共享字段和方法。当你在JPA中定义一个实体类的时候,可以使用 @Entity ......
  • Blazor里,如何在 razor 页面使用 BackgroundService 实例
    Blazor使用BackgroundService需要注册builder.Services.AddHostedService<PageStateService>();razor页面要使用 PageStateService的实例,需要 PageStateService有接口,我们给PageStateService写一个接口 IPageStateService然后在页面直接注入实例@injectIPageSt......