Submission #1333762

#TimeUsernameProblemLanguageResultExecution timeMemory
1333762i271828Wind Turbines (EGOI25_windturbines)C++20
0 / 100
1 ms1348 KiB
#include <bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
using namespace std;

const int MAX=1e5+5;
const int LOG=20;

struct UFDS{
	int par[MAX],sz[MAX];
	UFDS(){
		for (int i=0;i<MAX;i++) par[i]=i,sz[i]=0;
	}
	int qry(int x){
		if (x==par[x]) return x;
		return par[x]=qry(par[x]);
	}
	int mrg(int x,int y){
		x=qry(x),y=qry(y);
		if (x==y) return y;
		if (sz[x]>sz[y]) swap(x,y);
		if (sz[x]==sz[y]) sz[y]++;
		par[x]=y;
		return y;
	}
} *ud=new UFDS();

int N,M,Q;

pair<ll,pii> edg[MAX];
vector<pair<ll,int>> adj[MAX];

ll le[LOG][MAX]; // Longest edge
ll lei[LOG][MAX]; // Longest edge index
int up[LOG][MAX];
int dst[MAX];

void dfs0(int x,int p,int d){
	up[0][x]=p;
	dst[x]=d;
	for (auto [w,y]:adj[x]) if (y!=p) le[0][y]=w,lei[0][y]=y,dfs0(y,x,d+1);
}

inline void ch(ll& ans,int& i,int k,int a){
	if (le[k][a]>ans) ans=le[k][a],i=lei[k][a];
}

int lcae(int a,int b){
	if (dst[b]>dst[a]) swap(a,b);
	ll ans=0;
	int i;
	for (int k=LOG-1;k>=0;k--) if (dst[up[k][a]]>=dst[b]) ch(ans,i,k,a),a=up[k][a];
	for (int k=LOG-1;k>=0;k--) if (up[k][a]!=up[k][b]) ch(ans,i,k,a),ch(ans,i,k,b),a=up[k][a],b=up[k][b];
	if (a!=b) ch(ans,i,0,a),ch(ans,i,0,b),a=up[0][a],b=up[0][b];
	return i;
}

bool X[MAX];
int rt[MAX];

void dfs1(int x,int p,int a){
	rt[x]=a;
	for (auto [_,y]:adj[x]) if (y!=p&&!X[y]) dfs1(y,x,a);
}

int main(){
	ios::sync_with_stdio(0);cin.tie(0);
	cin>>N>>M>>Q;
	assert(N<=200&&M<=2000&&Q<=2000);
	for (int i=0;i<M;i++){
		int a,b;ll c;cin>>a>>b>>c;
		edg[i]={c,{a,b}};
	}
	sort(edg,edg+M);
	ll tot=0;
	for (int i=0;i<M;i++){
		auto [w,pr]=edg[i];
		auto [a,b]=pr;
		if (ud->qry(a)==ud->qry(b)) continue;
		adj[a].push_back({w,b});
		adj[b].push_back({w,a});
		ud->mrg(a,b);
		tot+=w;
	}
	
	dfs0(0,0,0);
	for (int k=1;k<LOG;k++) for (int i=0;i<N;i++){
		int p=up[k-1][i];
		up[k][i]=up[k-1][p];
		if (le[k-1][i]>le[k-1][p]) le[k][i]=le[k-1][i],lei[k][i]=lei[k-1][i];
		else le[k][i]=le[k-1][p],lei[k][i]=lei[k-1][p];
	}
	
	while (Q--){
		int x,y;cin>>x>>y;
		fill_n(rt,N,x);
		fill_n(X,N,0);
		ll ans=tot;
		for (int a=x+1;a<=y;a++){
			int v=lcae(a,rt[a]);
			ans-=le[0][v];
			dfs1(v,up[0][v],a);
			X[a]=1;
		}
		cout<<ans<<'\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...