Submission #1282922

#TimeUsernameProblemLanguageResultExecution timeMemory
1282922TVSownSpring cleaning (CEOI20_cleaning)C++20
26 / 100
133 ms20312 KiB
///*** Sown_Vipro ***/// /// ->TEAM SELECTION TEST<- /// #include<bits/stdc++.h> using namespace std; //#pragma GCC optimize ("O3") //#pragma GCC optimize ("unroll-loops") //#pragma GCC target("popcnt") #define F first #define S second #define pb push_back #define pi pair<int, int> #define pii pair<int, pair<int, int> > #define FOR(i, a, b) for(int i = a; i <= b; ++i) #define REP(i, a, b) for(int i = a; i >= b; --i) #define all(s) s.begin(), s.end() #define szz(s) int(s.size()) const string NAME = "sown"; const int N = 1e6 + 5, MAX = 1e6, MOD = 1e9 + 7; void maxi(int &x, int y){ if(x < y) x = y; } void mini(int &x, int y){ if(x > y) x = y; }; void add(int &x, int y){ x += y; x += MOD * (x < 0); x -= MOD * (x >= MOD); }; int n, q, res, TIME, stt; int s[N], c[N], nxt[N], ver[N], chain[N], p[N], in[N], icon[N], a[N], d[N], check[N]; vector<int> e[N]; void pre(int u){ s[u] = 1; c[u] = (e[u].size() == 1); for(int v : e[u]){ if(v == p[u]) continue; p[v] = u; pre(v); s[u] += s[v]; if(s[v] > s[nxt[u]]) nxt[u] = v; c[u] += c[v]; } } pi st[4 * N]; int lz[4 * N]; pi Merge(pi A, pi B){ return {A.F + B.F, A.S + B.S}; } void build(int id, int l, int r){ if(l == r){ if(ver[l] != 1){ // cout << ver[l] << " " << c[ver[l]] << "\n"; st[id].F = (c[ver[l]] % 2 == 0); st[id].S = (c[ver[l]] % 2 != 0); } return; } int m = (l + r) / 2; build(2 * id, l, m); build(2 * id + 1, m + 1, r); st[id] = Merge(st[2 * id], st[2 * id + 1]); } void down(int id){ if(lz[id]){ swap(st[2 * id].F, st[2 * id].S); swap(st[2 * id + 1].F, st[2 * id + 1].S); lz[2 * id] ^= 1; lz[2 * id + 1] ^= 1; lz[id] = 0; } } void update(int id, int l, int r, int u, int v){ if(l > v || r < u) return; if(u <= l && r <= v){ swap(st[id].F, st[id].S); lz[id] ^= 1; // cout << l << " " << r << " " << st[id].F << " " << st[id].S << "\n"; return; } down(id); int m = (l + r) / 2; update(2 * id, l, m, u, v); update(2 * id + 1, m + 1, r, u, v); st[id] = Merge(st[2 * id], st[2 * id + 1]); } void hld(int u, int p){ if(!icon[stt]) icon[stt] = u; chain[u] = stt; in[u] = ++TIME; ver[TIME] = u; if(nxt[u]) hld(nxt[u], u); for(int v : e[u]){ if(v != p && v != nxt[u]){ ++stt; hld(v, u); } } } void solve(){ cin >> n >> q; FOR(i, 2, n){ int u, v; cin >> u >> v; e[u].pb(v); e[v].pb(u); } pre(1); hld(1, 0); build(1, 1, n); // cout << st[1].F; while(q--){ int s; cin >> s; int leaves = 0, S = 0; FOR(i, 1, s){ cin >> a[i]; leaves += (e[a[i]].size() == 1); S -= d[a[i]]; ++d[a[i]]; S += d[a[i]]; } if((c[1] + S - leaves) % 2){ cout << -1 << "\n"; FOR(i, 1, s){ --d[a[i]]; } continue; } FOR(i, 1, s){ if((d[a[i]] - (e[a[i]].size() == 1)) % 2 && check[a[i]] == 0){ check[a[i]] = 1; int u = a[i]; // cout << u << "\n"; while(chain[u] != chain[1]){ update(1, 1, n, in[icon[chain[u]]], in[u]); // cout << icon[chain[u]] << " " << u << "\n"; u = p[icon[chain[u]]]; } update(1, 1, n, 1, in[u]); } } cout << n + s - 1 + st[1].F << "\n"; FOR(i, 1, s){ if((d[a[i]] - (e[a[i]].size() == 1)) % 2 && check[a[i]] == 1){ check[a[i]] = 0; int u = a[i]; while(chain[u] != chain[1]){ update(1, 1, n, in[icon[chain[u]]], in[u]); // cout << icon[chain[u]] << " " << u << "\n"; u = p[icon[chain[u]]]; } update(1, 1, n, 1, in[u]); } } FOR(i, 1, s){ --d[a[i]]; } } } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); if(fopen((NAME + ".inp").c_str(), "r")){ freopen((NAME + ".inp").c_str(), "r", stdin); // freopen((NAME + ".out").c_str(), "w", stdout); } int t = 1; // cin >> t; while(t--){ solve(); } }

Compilation message (stderr)

cleaning.cpp: In function 'int main()':
cleaning.cpp:174:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  174 |         freopen((NAME + ".inp").c_str(), "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...