P9638 「yyOI R1」youyou 的军训

题目背景

在 youyou 的班上,身高可能是一个敏感的话题。

题目描述

youyou 的班上一共有 nn 位同学,mm 对朋友,第 ii 对朋友关系对于身高有一个敏感值 k_iki​,敏感值可能会改变。

我们定义两位同学如果互为朋友,那么必然存在某对关系,将两位同学直接相连。

我们定义两位同学如果互为好友,那么必然存在直接或间接的关系,将两位同学相连。

例如存在关系 (1,2)(1,2) 和 (2,3)(2,3),那么,11 与 22 是朋友,但 11 与 33 就是好友。

现在,马上就要军训了,同学们要去领军训的服装,如果一位同学领到了尺码为 pp 的服装,所有同学会与朋友关系敏感值小于 pp 的朋友断交。即对于所有的朋友关系,若其敏感值小于 pp,那么该朋友关系就会断开。不过在下一位同学领到服装时,所有之前的断开的朋友关系会恢复。

由于军训领服装是一个复杂的过程,而 youyou 对此十分感兴趣,所以给出 qq 次操作,且一共有三种操作:

  • 操作 11,形如 1 x,表示有一位同学领到尺码为 xx 的服装。

  • 操作 22,形如 2 x,表示询问第 xx 位同学还有多少位好友(包括自己)。

  • 操作 33,形如 3 x y,表示第 xx 对朋友的敏感值变为 yy,特别地,敏感值的相对大小不会变化^*∗(详情见下方),同时原来已经断开的关系不会恢复。

注意:好友跟朋友是两个概念,朋友一定是好友,但好友不一定是朋友。

^*∗:相对大小不会变化,指对于当前所有的敏感值而言,修改后的敏感值与原来的敏感值排名相同

例如,若原来所有对朋友之间敏感值是 \{1,2,3,5,6\}{1,2,3,5,6},33 的排名为 33,因此 33 只能修改为 3,43,4 中的一个,这样才能保证排名不变,即相对大小位置不会变换。

输入格式

第一行,输入三个正整数 n,m,qn,m,q。

后面 mm 行,给定 mm 对朋友关系,对于第 ii 行给定三个正整数 x_i,y_i,k_ixi​,yi​,ki​。

最后 qq 行,给定 qq 次操作。对于每次操作,给定一个正整数为 opop,即操作类型。

当 op=1op=1 时,再给定一个正整数 xx,表示有一位同学领到尺码为 xx 的服装;

当 op=2op=2 时,再给定一个正整数 xx,表示一次询问;

当 op=3op=3 时,再给定两个正整数 x,yx,y,表示一次修改。

输出格式

对于每次询问操作,输出一个 xx 表示询问的同学还有几位好友包括自己)。保证对于每一个测试点,都会有一个询问操作。

输入输出样例

输入 #1复制

4 3 3
1 2 156
1 4 42
2 3 0
1 26963
3 3 40
2 4

输出 #1复制

1

输入 #2复制

7 6 7
1 2 292
1 3 274
1 4 221
1 5 156
3 4 42
3 6 40
1 30
3 4 50
2 6
3 3 250
3 1 298
1 280
2 1

输出 #2复制

6
2

说明/提示

样例解释 #1

如图所示,这是初始的关系图。

第一次操作为:有一位同学领到尺码为 2696326963 的服装,这样,图中所有的边都会断开。

下一次操作:第三对朋友即边 (2,3)(2,3) 的权变为 4040。

下一次操作:询问同学 44 的好友数量,因为没有任何存在的边,因此答案为 11。

数据范围

测试点编号nnqq特殊性质
1,21,2\le 10≤10\le 4 \times 10^5≤4×105
33\le 10^3≤103\le 10^3≤103
44\le 10^5≤105\le 4 \times 10^5≤4×105没有操作 33
5,65,6\le 10^5≤105\le 10^3≤103
77\le 10^5≤105\le 4 \times 10^5≤4×105没有操作 11
8,9,108,9,10\le 4 \times 10^5≤4×105\le 4 \times 10^5≤4×105

用 c_ici​ 表示询问中同学领到服装尺码的大小,e_iei​ 表示修改后敏感值的大小。

对于 100\%100% 的数据,1 \le n,m,q,x_i,y_i \le 4 \times 10^51≤n,m,q,xi​,yi​≤4×105,1 \le k_i,c_i,e_i \le 1 \times 10^91≤ki​,ci​,ei​≤1×109,m\le \min\{\frac{n(n-1)}{2},4 \times 10^5\}m≤min{2n(n−1)​,4×105}。

同时数据保证在任何时刻,所有对朋友关系之间的敏感值互不相同

请注意常数因子对时间和空间产生的影响。

由于敏感值相对大小不会变化,所以图的形态最多只有 nn 种。即按敏感值从小到大排序后断开一段前缀边。

先离线下来所有读入,每次 1 操作和 3 操作更新当前图的形态,对于询问操作直接在当前形态存储下来这次询问。最后利用并查集依次加边并处理询问即可。更新图的形态的时候可以使用二分法,总时间复杂度 O((n+q)\log n)O((n+q)logn)

signed main(){
	n=read(),m=read(),q=read();
	for(int i=1;i<=m;i++){
		e[i].x=read(),e[i].y=read(),e[i].k=read();
		e[i].bh=i;
	}
	sort(e+1,e+m+1);
	for(int i=1;i<=n;i++){
		fa[i]=i;sz[i]=1;
	}
	for(int i=1;i<=m;i++){
		pos[e[i].bh]=i;
	}
	ll nws=0,nwpos=0;
	while(q--){
		ll opt=read();
		if(opt==1){
			nws=read();
			nwpos=upper_bound(e+1,e+m+1,(Edge){0,0,nws,0})-e-1;
//			printf("%lld\n",nwpos);
		}	
		else if(opt==2){
			ll x=read();
			v[nwpos].push_back(mp(x,++cnt));
		}
		else{
			ll x=read(),nwf=read();
			e[pos[x]].k=nwf;
			nwpos=upper_bound(e+1,e+m+1,(Edge){0,0,nws,0})-e-1;
//			printf("%lld\n",nwpos);
		}
	}
	for(int i=m;i>=0;i--){
		for(int j=0;j<v[i].size();j++){
			ans[v[i][j].se]=sz[get(v[i][j].fi)];
		}
		if(i!=0)	merge(e[i].x,e[i].y);
	}
	for(int i=1;i<=cnt;i++){
		printf("%lld\n",ans[i]);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值