제출 #974054

#제출 시각아이디문제언어결과실행 시간메모리
974054happy_nodeReconstruction Project (JOI22_reconstruction)C++17
42 / 100
5087 ms420520 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MX=505; int N,M,Q; struct DSU { int par[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; par[u]=v; return true; } void reset() { for(int i=1;i<=N;i++) par[i]=i; } } ds; set<pair<int,int>> adj[MX]; const int inf=2e9; 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]={inf,inf,inf}; 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,min(u,v),max(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,min(u,v),max(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]; set<array<int,4>> E; 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,uu,vv,id[{ww,uu,vv}]}); } adj[u].insert({v,w}); adj[v].insert({u,w}); E.insert({w,u,v,id[{w,u,v}]}); for(auto [ww,uu,vv,id]:E) { PF[i].push_back(id); } 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,uu,vv,id[{ww,uu,vv}]}); } adj[u].insert({v,w}); adj[v].insert({u,w}); E.insert({w,u,v,id[{w,u,v}]}); for(auto [ww,uu,vv,id]:E) { SF[i].push_back(id); } 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'; } }

컴파일 시 표준 에러 (stderr) 메시지

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:99:18: warning: comparison of integer expressions of different signedness: 'std::set<std::array<int, 4> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   99 |   assert(E.size()<N);
      |          ~~~~~~~~^~
reconstruction.cpp:122:18: warning: comparison of integer expressions of different signedness: 'std::set<std::array<int, 4> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  122 |   assert(E.size()<N);
      |          ~~~~~~~~^~
reconstruction.cpp:147: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]
  147 |   while(p+1<edges.size() && x>=edges[p+1][0]) {
      |         ~~~^~~~~~~~~~~~~
reconstruction.cpp:168:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  168 |    while(i<PF[p].size()&&j<SF[p+1].size()) {
      |          ~^~~~~~~~~~~~~
reconstruction.cpp:168:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  168 |    while(i<PF[p].size()&&j<SF[p+1].size()) {
      |                          ~^~~~~~~~~~~~~~~
reconstruction.cpp:184:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  184 |    while(i<PF[p].size()) {
      |          ~^~~~~~~~~~~~~
reconstruction.cpp:192:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  192 |    while(j<SF[p+1].size()) {
      |          ~^~~~~~~~~~~~~~~
#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...