Submission #1023173

#TimeUsernameProblemLanguageResultExecution timeMemory
1023173UnforgettableplReconstruction Project (JOI22_reconstruction)C++17
100 / 100
576 ms30996 KiB
#pragma GCC optimize("Ofast","unroll-loops")
#include <bits/stdc++.h>
using namespace std;

// #define int long long


int32_t main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n,m;
	cin >> n >> m;
	vector<pair<int,pair<int,int>>> edges(m);
	for(auto&[a,b]:edges)cin>>b.first>>b.second>>a;
	sort(edges.begin(),edges.end());
	vector<set<pair<int,int>>> adj(n+1);
	// Calculation from the front
	int tar;
	function<pair<bool,int>(int,int)> dfs = [&](int x,int p){
		if(x==tar)return make_pair(true,(int)1e15);
		for(auto[v,i]:adj[x])if(v!=p){
			auto res = dfs(v,x);
			if(res.first)return make_pair(true,min(res.second,i));
		}
		return make_pair(false,(int)0);
	};
	vector<tuple<int,bool,int>> events;
	for(int i=0;i<m;i++){
		tar = edges[i].second.second;
		auto res = dfs(edges[i].second.first,-1);
		if(res.first){
			//res.second is the edge which is replaced by i
			int diffpoint = (edges[i].first+edges[res.second].first+1)/2;
			events.emplace_back(diffpoint,true,+edges[i].first);
			events.emplace_back(diffpoint,false,-edges[res.second].first);
			adj[edges[res.second].second.first].erase({edges[res.second].second.second,res.second});
			adj[edges[res.second].second.second].erase({edges[res.second].second.first,res.second});
		} else {
			events.emplace_back(0,true,+edges[i].first);
		}
		events.emplace_back(edges[i].first,true,-edges[i].first);
		events.emplace_back(edges[i].first,false,+edges[i].first);
		adj[edges[i].second.first].insert({edges[i].second.second,i});
		adj[edges[i].second.second].insert({edges[i].second.first,i});
	}
	events.emplace_back(2e9,false,0);
	sort(events.begin(),events.end());
	long long smallersum = 0;
	long long biggersum = 0;
	long long smallercnt = 0;
	long long biggercnt = 0;
	auto iter = events.begin();
	int q;
	cin >> q;
	for(int i=1;i<=q;i++){
		long long query;
		cin >> query;
		while(get<0>(*iter)<=query){
			auto [a,b,c] = *iter;
			if(b){
				biggersum+=c;
				if(c<0)biggercnt--;
				else biggercnt++;
			} else {
				smallersum+=c;
				if(c<0)smallercnt--;
				else smallercnt++;
			}
			iter++;
		}
		cout << biggersum-query*biggercnt+query*smallercnt-smallersum << '\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...