社区讨论

根号分治 TLE 求调

P10559[ICPC 2024 Xi'an I] The Last Cumulonimbus Cloud参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mll064rq
此快照首次捕获于
2026/02/13 22:48
6 天前
此快照最后确认于
2026/02/17 08:25
前天
查看原帖
rt,复杂度大概是 O(qm)O(q \sqrt m) 的,好像理论上可以水过去,但是我并没有通过并 TLE #2,复杂度应该没算错,所以求调。
CPP
#include<bits/stdc++.h>
#define ll int
#define db double
#define vec vector
#define pb push_back
#define pll pair<ll,ll>
#define mkp make_pair
#define il inline
#define endl "\n"
using namespace std;
const ll mod=998244353;
const ll inf=1e18;
ll n,m,q,B,a[300005],b[300005];vec<ll> G[300005],W[300005];bool vis[300005];
il void add(ll u,ll v){
	G[u].pb(v);
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>m>>q,B=sqrt(m);
    for(ll i=1,x,y;i<=m;i++) cin>>x>>y,add(x,y),add(y,x);
    for(ll i=1;i<=n;i++) cin>>a[i];
    for(ll i=1;i<=n;i++){
    	if(G[i].size()>=B) vis[i]=1;
	}
	for(ll i=1;i<=n;i++){
		for(auto p:G[i]){
			if(vis[p]) W[i].pb(p);
			b[i]+=a[p];
		}
	}
	for(ll _=1;_<=q;_++){
		ll op,x,y;cin>>op;
		if(op==1){
			cin>>x>>y,a[x]+=y;
			for(auto p:W[x]){
				b[p]+=y;
			}
		}else{
			cin>>x;
			if(vis[x]){
				cout<<b[x]<<endl;
			}else{
				ll ans=0;
				for(auto p:G[x]){
					ans+=a[p];
				}
				cout<<ans<<endl;
			}
		}
	}
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...