結果

問題 No.1718 Random Squirrel
ユーザー cureskol
提出日時 2021-10-22 23:29:40
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 107 ms / 2,000 ms
コード長 2,920 bytes
コンパイル時間 2,728 ms
コンパイル使用メモリ 202,656 KB
実行使用メモリ 32,664 KB
最終ジャッジ日時 2024-09-23 08:04:05
合計ジャッジ時間 5,494 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 31
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In lambda function:
main.cpp:11:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
   11 |   auto [a,b]=x;
      |        ^
main.cpp:12:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
   12 |   auto [c,d]=y;
      |        ^
main.cpp: In member function 'void ReRooting<key_t, sum_t>::dfs2(int, int, sum_t)':
main.cpp:59:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
   59 |       auto [a,b]=e.dp1;
      |            ^
main.cpp:66:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
   66 |         auto [a,b]=e.dp2;
      |              ^
main.cpp:67:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
   67 |         auto [c,d]=now;
      |              ^
main.cpp: In lambda function:
main.cpp:111:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
  111 |     auto [a,b]=x;
      |          ^
main.cpp: In lambda function:
main.cpp:119:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
  119 |     auto [a,b]=x;
      |          ^
main.cpp:120:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
  120 |     auto [c,d]=y;
      |          ^
main.cpp: In function 'int main()':
main.cpp:133:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
  133 |   for(auto &[x,y]:ans)cout<<x-y<<"\n";
      |             ^

ソースコード

diff #
プレゼンテーションモードにする

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
#define REP(i,n) for(int i=0;i<(n);i++)
#define RREP(i,n) for(int i=(n-1);i>=0;i--)
#define ALL(v) v.begin(),v.end()
using P=tuple<int,int>;
auto smerge=[](P x,P y)->P{
auto [a,b]=x;
auto [c,d]=y;
return {a+c,max(b,d)};
};
template<typename key_t,typename sum_t=key_t>
struct ReRooting{
struct Edge {
int from,to;
key_t cost;
sum_t dp1,dp2;
//dp1:
//dp2:e=g[idx][i]g[idx][0,i)dp1
};
using F=function<sum_t(sum_t,sum_t)>;
using G=function<sum_t(sum_t,Edge)>;
vector<vector<Edge>> g;
const F merge;
const G score;
const sum_t id;
vector<sum_t> dp1,dp2;
vector<int> ans;
ReRooting(int n,const G &score,const F &merge,const sum_t &id=sum_t{})
:g(n),merge(merge),score(score),id(id),dp1(n,id),dp2(n,id),ans(n){}
void add_edge(int u,int v,const key_t &c){
g[u].emplace_back(Edge{u,v,c,id,id});
g[v].emplace_back(Edge{v,u,c,id,id});
}
void add_directed_edge(int u,int v,const key_t &c){
g[u].emplace_back(Edge{u,v,c,id,id});
}
void dfs1(int idx,int pre){
for(auto &e:g[idx])if(e.to!=pre){
dfs1(e.to,idx);
e.dp1=score(dp1[e.to],e);
dp1[idx]=merge(dp1[idx],e.dp1);
}
}
void dfs2(int idx,int pre,sum_t top){
sum_t now=id;
for(auto &e:g[idx]){
e.dp2=now;
if(e.to==pre)e.dp1=score(top,e);
now=merge(now,e.dp1);
auto [a,b]=e.dp1;
}
dp2[idx]=now;
now=id;
reverse(g[idx].begin(),g[idx].end());
for(auto &e:g[idx]){
if(e.to!=pre){
auto [a,b]=e.dp2;
auto [c,d]=now;
dfs2(e.to,idx,smerge(e.dp2,now));
}
now=merge(now,e.dp1);
}
}
vector<sum_t> build(){
dfs1(0,-1);
dfs2(0,-1,id);
return dp2;
}
};
const int INF=1e9+7;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,k;cin>>n>>k;
if(k==1){
vector<vector<int>> g(n);
REP(_,n-1){
int u,v;cin>>u>>v;u--;v--;
g[u].push_back(v);
g[v].push_back(u);
}
int r;cin>>r;r--;
vector<int> ans(n,-1);
queue<int> que;
que.push(r);
ans[r]=0;
while(que.size()){
int p=que.front();que.pop();
for(int q:g[p])if(ans[q]<0){
ans[q]=ans[p]+1;
que.push(q);
}
}
REP(i,n)cout<<ans[i]<<"\n";
return 0;
}
vector<bool> v(n,false);
auto score=[&](P x,auto e)->P{
auto [a,b]=x;
if(a==0&&b==0){
if(v[e.to])return {2,1};
return {0,INF};
}
return {a+2,a+1-b};
};
auto merge=[&](auto x,auto y)->P{
auto [a,b]=x;
auto [c,d]=y;
return {a+c,max(b,c-d)};
};
ReRooting<P> g(n,score,merge,{0,0});
REP(_,n-1){
int u,v;cin>>u>>v;u--;v--;
g.add_edge(u,v,{0,INF});
}
REP(_,k){
int a;cin>>a;a--;
v[a]=true;
}
auto ans=g.build();
for(auto &[x,y]:ans)cout<<x-y<<"\n";
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0