답안 #974047

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
974047 2024-05-02T16:32:14 Z happy_node Reconstruction Project (JOI22_reconstruction) C++17
0 / 100
5000 ms 219628 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int MX=505;

int N,M,Q;

struct DSU {
	int par[MX], sz[MX];

	int fd(int v) {
		return par[v]==v?v:par[v]=fd(par[v]);
	}

	bool merge(int u, int v) {
		u=fd(u),v=fd(v);
		if(u==v) return false;
		if(sz[u]>sz[v]) swap(u,v);
		par[u]=v;
		sz[v]+=sz[u];
		return true;
	}

	void reset() {
		for(int i=1;i<=N;i++) par[i]=i,sz[i]=1;
	}
} ds;

set<pair<int,int>> adj[MX];

set<array<int,3>> E;

array<int,3> bfs(int S, int T) {
	queue<int> q;
	q.push(S);
	
	vector<array<int,3>> dist(N+1,{-1,-1,-1});
	dist[S]={(int)1e9,0,0};

	while(!q.empty()) {
		auto v=q.front(); q.pop();
		for(auto [u,w]:adj[v]) {
			if(dist[u][0]!=-1) continue;

			array<int,3> cur={w,u,v};
			dist[u]=min(cur,dist[v]);
			q.push(u);
		}
	}

	return dist[T];
}

array<int,3> BFS(int S, int T) {
	queue<int> q;
	q.push(S);
	
	vector<array<int,3>> dist(N+1,{-1,-1,-1});
	dist[S]={0,0,0};

	while(!q.empty()) {
		auto v=q.front(); q.pop();
		for(auto [u,w]:adj[v]) {
			if(dist[u][0]!=-1) continue;

			array<int,3> cur={w,u,v};
			dist[u]=max(cur,dist[v]);
			q.push(u);
		}
	}

	return dist[T];
}

array<int,3> e[100000+5];
vector<int> PF[100000+5], SF[100000+5];

map<array<int,3>, int> id;

int main() {
	cin.tie(0); ios_base::sync_with_stdio(0);

	cin>>N>>M;

	vector<array<int,3>> edges;

	for(int i=0;i<M;i++) {
		int u,v,w;
		cin>>u>>v>>w;
		e[i]={w,u,v};
		id[e[i]]=i;
		edges.push_back({w,u,v});
	}		

	sort(edges.begin(),edges.end());

	int i=0;
	for(auto [w,u,v]:edges) {
		assert(E.size()<N);
		auto [ww,uu,vv]=bfs(u,v);
		if(ww!=-1) {
			adj[uu].erase({vv,ww});
			adj[vv].erase({uu,ww});
			E.erase({ww,min(uu,vv),max(uu,vv)});
		}
		adj[u].insert({v,w});
		adj[v].insert({u,w});
		E.insert({w,min(u,v),max(u,v)});
		for(auto [ww,uu,vv]:E) {
			PF[i].push_back(id[{ww,min(uu,vv),max(uu,vv)}]);
		}
		reverse(PF[i].begin(),PF[i].end());
		i++;
	}

	reverse(edges.begin(),edges.end());
	E.clear();
	for(int i=1;i<=N;i++) adj[i].clear();

	i=M-1;
	for(auto [w,u,v]:edges) {
		assert(E.size()<N);
		auto [ww,uu,vv]=BFS(u,v);
		if(ww!=-1) {
			adj[uu].erase({vv,ww});
			adj[vv].erase({uu,ww});
			E.erase({ww,min(uu,vv),max(uu,vv)});
		}
		adj[u].insert({v,w});
		adj[v].insert({u,w});
		E.insert({w,min(u,v),max(u,v)});
		for(auto [ww,uu,vv]:E) {
			SF[i].push_back(id[{ww,min(uu,vv),max(uu,vv)}]);
		}
		i--;
	}

	reverse(edges.begin(),edges.end());

	cin>>Q;

	int p=-1;
	for(int i=0;i<Q;i++) {
		int x;
		cin>>x;
		
		while(p+1<edges.size() && x>=edges[p+1][0]) {
			p++;
		}

		ds.reset();
		ll res=0;
		if(p==(int)edges.size()-1) {
			// PF back()
			for(auto id:PF[p]) {
				auto [w,u,v]=e[id];
				res+=x-w;
			}
		} else if(p==-1) {
			// SF[0]
			for(auto id:SF[0]) {
				auto [w,u,v]=e[id];
				res+=w-x;
			}
		} else {
			// PF[p], Sf[p+1]
			int i=0,j=0; // 2 pointers
			while(i<PF[p].size()&&j<SF[p+1].size()) {
				int id=PF[p][i];
				auto [w,u,v]=e[id];
				int ID=SF[p+1][j];
				auto [ww,uu,vv]=e[ID];

				if(x-w<ww-x) {
					if(ds.merge(u,v))
						res+=x-w;
					i++;
				} else {
					if(ds.merge(uu,vv))
						res+=ww-x;
					j++;
				}
			}
			while(i<PF[p].size()) {
				int id=PF[p][i];
				auto [w,u,v]=e[id];
				if(ds.merge(u,v))
					res+=x-w;
				i++;
			}

			while(j<SF[p+1].size()) {
				int id=SF[p+1][j];
				auto [w,u,v]=e[id];
				if(ds.merge(u,v))
					res+=w-x;
				j++;
			}
		}

		cout<<res<<'\n';
	}
}

Compilation message

In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from reconstruction.cpp:1:
reconstruction.cpp: In function 'int main()':
reconstruction.cpp:100:18: warning: comparison of integer expressions of different signedness: 'std::set<std::array<int, 3> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  100 |   assert(E.size()<N);
      |          ~~~~~~~~^~
reconstruction.cpp:123:18: warning: comparison of integer expressions of different signedness: 'std::set<std::array<int, 3> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  123 |   assert(E.size()<N);
      |          ~~~~~~~~^~
reconstruction.cpp:148:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 3> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |   while(p+1<edges.size() && x>=edges[p+1][0]) {
      |         ~~~^~~~~~~~~~~~~
reconstruction.cpp:169:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  169 |    while(i<PF[p].size()&&j<SF[p+1].size()) {
      |          ~^~~~~~~~~~~~~
reconstruction.cpp:169:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  169 |    while(i<PF[p].size()&&j<SF[p+1].size()) {
      |                          ~^~~~~~~~~~~~~~~
reconstruction.cpp:185:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  185 |    while(i<PF[p].size()) {
      |          ~^~~~~~~~~~~~~
reconstruction.cpp:193:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  193 |    while(j<SF[p+1].size()) {
      |          ~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4956 KB Output is correct
2 Correct 1 ms 4956 KB Output is correct
3 Correct 2 ms 4952 KB Output is correct
4 Correct 1 ms 4956 KB Output is correct
5 Correct 1 ms 4956 KB Output is correct
6 Correct 1 ms 4956 KB Output is correct
7 Correct 1 ms 4956 KB Output is correct
8 Correct 1 ms 4956 KB Output is correct
9 Correct 1 ms 4956 KB Output is correct
10 Correct 1 ms 4952 KB Output is correct
11 Correct 1 ms 4956 KB Output is correct
12 Correct 1 ms 4956 KB Output is correct
13 Correct 1 ms 4956 KB Output is correct
14 Correct 1 ms 4956 KB Output is correct
15 Correct 1 ms 4956 KB Output is correct
16 Correct 2 ms 4956 KB Output is correct
17 Runtime error 5 ms 10076 KB Execution killed with signal 6
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4956 KB Output is correct
2 Correct 1 ms 4956 KB Output is correct
3 Correct 2 ms 4952 KB Output is correct
4 Correct 1 ms 4956 KB Output is correct
5 Correct 1 ms 4956 KB Output is correct
6 Correct 1 ms 4956 KB Output is correct
7 Correct 1 ms 4956 KB Output is correct
8 Correct 1 ms 4956 KB Output is correct
9 Correct 1 ms 4956 KB Output is correct
10 Correct 1 ms 4952 KB Output is correct
11 Correct 1 ms 4956 KB Output is correct
12 Correct 1 ms 4956 KB Output is correct
13 Correct 1 ms 4956 KB Output is correct
14 Correct 1 ms 4956 KB Output is correct
15 Correct 1 ms 4956 KB Output is correct
16 Correct 2 ms 4956 KB Output is correct
17 Runtime error 5 ms 10076 KB Execution killed with signal 6
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4956 KB Output is correct
2 Correct 2 ms 4956 KB Output is correct
3 Correct 1 ms 4952 KB Output is correct
4 Execution timed out 5026 ms 219628 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4956 KB Output is correct
2 Correct 1 ms 4956 KB Output is correct
3 Correct 2 ms 4952 KB Output is correct
4 Correct 1 ms 4956 KB Output is correct
5 Correct 1 ms 4956 KB Output is correct
6 Correct 1 ms 4956 KB Output is correct
7 Correct 1 ms 4956 KB Output is correct
8 Correct 1 ms 4956 KB Output is correct
9 Correct 1 ms 4956 KB Output is correct
10 Correct 1 ms 4952 KB Output is correct
11 Correct 1 ms 4956 KB Output is correct
12 Correct 1 ms 4956 KB Output is correct
13 Correct 1 ms 4956 KB Output is correct
14 Correct 1 ms 4956 KB Output is correct
15 Correct 1 ms 4956 KB Output is correct
16 Correct 2 ms 4956 KB Output is correct
17 Runtime error 5 ms 10076 KB Execution killed with signal 6
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4956 KB Output is correct
2 Correct 1 ms 4956 KB Output is correct
3 Correct 2 ms 4952 KB Output is correct
4 Correct 1 ms 4956 KB Output is correct
5 Correct 1 ms 4956 KB Output is correct
6 Correct 1 ms 4956 KB Output is correct
7 Correct 1 ms 4956 KB Output is correct
8 Correct 1 ms 4956 KB Output is correct
9 Correct 1 ms 4956 KB Output is correct
10 Correct 1 ms 4952 KB Output is correct
11 Correct 1 ms 4956 KB Output is correct
12 Correct 1 ms 4956 KB Output is correct
13 Correct 1 ms 4956 KB Output is correct
14 Correct 1 ms 4956 KB Output is correct
15 Correct 1 ms 4956 KB Output is correct
16 Correct 2 ms 4956 KB Output is correct
17 Runtime error 5 ms 10076 KB Execution killed with signal 6
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4956 KB Output is correct
2 Correct 1 ms 4956 KB Output is correct
3 Correct 2 ms 4952 KB Output is correct
4 Correct 1 ms 4956 KB Output is correct
5 Correct 1 ms 4956 KB Output is correct
6 Correct 1 ms 4956 KB Output is correct
7 Correct 1 ms 4956 KB Output is correct
8 Correct 1 ms 4956 KB Output is correct
9 Correct 1 ms 4956 KB Output is correct
10 Correct 1 ms 4952 KB Output is correct
11 Correct 1 ms 4956 KB Output is correct
12 Correct 1 ms 4956 KB Output is correct
13 Correct 1 ms 4956 KB Output is correct
14 Correct 1 ms 4956 KB Output is correct
15 Correct 1 ms 4956 KB Output is correct
16 Correct 2 ms 4956 KB Output is correct
17 Runtime error 5 ms 10076 KB Execution killed with signal 6
18 Halted 0 ms 0 KB -