답안 #601420

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
601420 2022-07-21T20:43:48 Z MohammadAghil Pastiri (COI20_pastiri) C++17
31 / 100
1000 ms 251164 KB
      #include <bits/stdc++.h>
//   #pragma GCC optimize ("Ofast,unroll-loops")
// #pragma GCC target ("avx2")
    using namespace std;
  typedef long long ll;
   typedef pair<int, int> pp;
    #define er(args ...) cerr << __LINE__ << ": ", err(new istringstream(string(#args)), args), cerr << endl
      #define per(i,r,l) for(int i = (r); i >= (l); i--)
        #define rep(i,l,r) for(int i = (l); i < (r); i++)
           #define all(x) begin(x), end(x)
              #define sz(x) (int)(x).size()
                  #define pb push_back
                      #define ss second
                           #define ff first
                                   void err(istringstream *iss){}template<typename T,typename ...Args> void err(istringstream *iss,const T &_val, const Args&...args){string _name;*iss>>_name;if(_name.back()==',')_name.pop_back();cerr<<_name<<" = "<<_val<<", ",err(iss,args...);}
void IOS(){
     cin.tie(0) -> sync_with_stdio(0);
     // #ifndef ONLINE_JUDGE
     //      freopen("in.in", "r", stdin);
     //      freopen("out.out", "w", stdout);
     // #endif
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const ll mod = 1e9 + 7, maxn = 5e5 + 5, lg = 22, inf = ll(1e9) + 5;
ll pw(ll a,ll b,ll md=mod){if(!b)return 1;ll k=pw(a,b>>1ll);return k*k%md*(b&1ll?a:1)%md;}
 
template<class T> struct Rmq{
     vector<vector<T>> rmq;
     vector<int> lgg;
     T comb(T a, T b){
          return min(a, b);
     }
     Rmq(){}
     Rmq(vector<T> a){
          int n = sz(a);
          lgg.resize(n + 1);
          rep(i,2,n + 1) lgg[i] = lgg[i>>1] + 1;
          rmq.assign(lgg[n] + 1, vector<T>(n));
          rmq[0] = a;
          rep(i,1,lgg[n] + 1){
               rep(j,0,n-(1<<i)+1){
                    rmq[i][j] = comb(rmq[i-1][j], rmq[i-1][j + (1 << (i-1))]);
               }
          }
     }
     T get(int l, int r){ // 0-base [l, r]
          int g = lgg[r - l + 1];
          return comb(rmq[g][l], rmq[g][r - (1<<g) + 1]);
     }
};
 
Rmq<int> rmq;
vector<int> adj[maxn], nd;
set<int> st[maxn];
int par[maxn][lg], h[maxn], cnt[maxn], nxt[maxn], vl[maxn], mn[maxn], s[maxn], t, v[maxn<<1];
bool ban[maxn];
 
void dfs(int r, int p){
     v[t] = h[r], s[r] = t++, par[r][0] = p;
     rep(i,1,lg) par[r][i] = par[par[r][i-1]][i-1];
     for(int c: adj[r]) if(c - p) h[c] = h[r] + 1, dfs(c, r), v[t++] = h[r];
}
 
// int lca(int u, int v){
//      if(h[u] > h[v]) swap(u, v);
//      per(i,lg-1,0) if(h[par[v][i]] >= h[u]) v = par[v][i];
//      if(u == v) return u;
//      per(i,lg-1,0) if(par[v][i] - par[u][i]) u = par[u][i], v = par[v][i];
//      return par[u][0]; 
// }
 
void dfs2(int r, int p){
     cnt[r] = 1;
     for(int c: adj[r]) if(c - p && !ban[c]) dfs2(c, r), cnt[r] += cnt[c];
}
 
int find_cent(int r, int p, int tot){
     for(int c: adj[r]) if(c - p && !ban[c] && (cnt[c]<<1) > tot) return find_cent(c, r, tot);
     return r;
}
 
void decom(int r, int tp){
     dfs2(r, -1);
     r = find_cent(r, -1, cnt[r]);
     nxt[r] = tp, ban[r] = true;
     for(int c: adj[r]) if(!ban[c]) decom(c, r);
}
 
int dist(int u, int v){
     if(s[u] > s[v]) swap(u, v);
     return h[u] + h[v] - (rmq.get(s[u], s[v])<<1);
}
 
void bfs(){
     fill(mn, mn + maxn, inf);
     deque<int> q;
     for(int c: nd) mn[c] = 0, q.pb(c);
     while(sz(q)){
          int r = q.front(); q.pop_front();
          for(int c: adj[r]) if(mn[c] == inf) mn[c] = mn[r] + 1, q.pb(c);
     }
}
 
int dfs3(int r){
     if(r == -1) return 0;
     if(vl[r] == inf) return vl[r] = dfs3(nxt[r]) + 1;
     return vl[r];
}
 
 
int main(){ IOS();
     int n, k; cin >> n >> k;
     rep(i,1,n){
          int u, v; cin >> u >> v; u--, v--;
          adj[u].pb(v), adj[v].pb(u);
     }
     nd.resize(k);
     rep(i,0,k) cin >> nd[i], nd[i]--;
 
     dfs(0, 0), decom(0, -1), bfs();
     rmq = Rmq(vector<int>(v, v + t));
     
     fill(vl, vl + maxn, inf);
     rep(i,0,n) assert(dfs3(i) <= lg);
 
     sort(all(nd), [&](int i, int j){ return h[i] > h[j]; });
 
     vector<int> ans;
     auto add = [&](int u){
          ans.pb(u);
          int cr = u;
          while(cr + 1){
               int d = dist(u, cr);
               if(mn[u] >= d) st[cr].insert(mn[u] - d);
               cr = nxt[cr];
          }
     };
 
     auto chk = [&](int u){
          int cr = u;
          while(cr + 1){
               if(st[cr].find(dist(cr, u)) != end(st[cr])) return true;
               cr = nxt[cr];
          }
          return false;
     };
 
     auto get = [&](int u){
          int k = u;
          per(i,lg-1,0) if(h[u] - h[par[k][i]] == mn[par[k][i]]) k = par[k][i];
          return k;
     };
 
     for(int c: nd){
          if(chk(c)) continue;
          add(get(c));
     }
 
     cout << sz(ans) << '\n'; sort(all(ans));
     for(int c: ans) cout << ++c << ' '; cout << '\n';
     return 0; 
}

Compilation message

pastiri.cpp: In function 'int main()':
pastiri.cpp:160:6: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  160 |      for(int c: ans) cout << ++c << ' '; cout << '\n';
      |      ^~~
pastiri.cpp:160:42: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  160 |      for(int c: ans) cout << ++c << ' '; cout << '\n';
      |                                          ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 435 ms 237584 KB Output is correct
2 Correct 459 ms 237644 KB Output is correct
3 Correct 438 ms 237596 KB Output is correct
4 Correct 667 ms 251164 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 40800 KB Output is correct
2 Correct 21 ms 40788 KB Output is correct
3 Correct 815 ms 198832 KB Output is correct
4 Correct 780 ms 201224 KB Output is correct
5 Execution timed out 1100 ms 106444 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 40020 KB Output is correct
2 Correct 24 ms 39920 KB Output is correct
3 Correct 23 ms 40020 KB Output is correct
4 Correct 22 ms 39900 KB Output is correct
5 Correct 21 ms 40000 KB Output is correct
6 Correct 19 ms 39928 KB Output is correct
7 Correct 19 ms 40020 KB Output is correct
8 Correct 19 ms 39988 KB Output is correct
9 Correct 18 ms 39916 KB Output is correct
10 Correct 19 ms 39948 KB Output is correct
11 Correct 19 ms 39764 KB Output is correct
12 Correct 19 ms 39676 KB Output is correct
13 Correct 19 ms 39948 KB Output is correct
14 Correct 19 ms 40020 KB Output is correct
15 Correct 19 ms 39964 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1094 ms 107400 KB Time limit exceeded
2 Halted 0 ms 0 KB -