Submission #1192398

#TimeUsernameProblemLanguageResultExecution timeMemory
1192398nguynWerewolf (IOI18_werewolf)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define F first #define S second #define pb push_back #define pii pair<int,int> const int N = 2e5 + 5; struct Edge { int u, v, w; Edge(int _u, int _v, int _w) : u(_u), v(_v), w(_w) {} bool operator < (const Edge &o) const { return w < o.w; } }; vector<Edge> edges; vector<int> g[2 * N]; struct DSU { int n; vector<int> par; DSU() {} DSU(int n) : n(n) { par.resize(n); for (int i = 0; i < n; i++) par[i] = i; } int find(int x) { return par[x] == x ? x : par[x] = find(par[x]); } void join(int x, int y) { if ((x = find(x)) == (y = find(y))) return; par.emplace_back(); par[y] = par[x] = par[n] = n; g[n].pb(x); g[n].pb(y); // cout << n << ' ' << x << endl; // cout << n << ' ' << y << endl; n++; } } dsu; int n, m, q; int pos[2 * N]; int st[2 * N]; int en[2 * N]; int st1[2 * N]; int en1[2 * N]; int up[2 * N][20]; int a[2 * N]; pii range1[N]; pii range2[N]; int timedfs; vector<pii> event[2 * N]; void dfs(int u, int p, int type) { st[u] = ++timedfs; a[u] = u; if (type) { if (u >= n) a[u] = 0; } for (int v : g[u]) { if (v == p) continue; up[v][0] = u; for (int i = 1; i < 20; i++) { if (up[v][i - 1] != -1) up[v][i] = up[up[v][i - 1]][i - 1]; } dfs(v, u, type); if (!type) a[u] = min(a[u], a[v]); else a[u] = max(a[u], a[v]); } // cout << u << ' ' << a[u] << endl; en[u] = timedfs; } int jump(int u, int bound, int type) { if (type == 0) { for (int i = 19; i >= 0; i--) { if (up[u][i] != -1 && a[up[u][i]] >= bound) { u = up[u][i]; } } return u; } else { for (int i = 19; i >= 0; i--) { if (up[u][i] != -1 && a[up[u][i]] <= bound) { u = up[u][i]; } } return u; } } int bit[2 * N]; void update(int id, int val) { if (id == 0) return; for (int i = id; i < 2 * n; i += (i & -i)) bit[i] += val; } int get(int id) { int res = 0; for (int i = id; i > 0; i -= (i & -i)) res += bit[i]; return res; } vector<int> check_validity(int N, vector<int> X, vector<int> Y, vector<int> S, vector<int> E, vector<int> L, vector<int> R) { n = N; m = X.size(); q = S.size(); dsu = DSU(n); for (int i = 0; i < m; i++) { if (X[i] < Y[i]) swap(X[i], Y[i]); edges.emplace_back(X[i], Y[i], Y[i]); } sort(edges.begin(), edges.end()); for (int i = m - 1; i >= 0; i--) { dsu.join(edges[i].u, edges[i].v); } int root = dsu.n; memset(up, -1, sizeof(up)); dfs(root - 1, -1, 0); for (int i = 0; i < q; i++) { int anc = jump(S[i], L[i], 0); // cout << anc << endl; range1[i] = {st[anc], en[anc]}; } for (int i = 0; i <= root; i++) { st1[i] = st[i]; en1[i] = en[i]; } edges.clear(); for (int i = 0; i < root; i++) g[i].clear(); for (int i = 0; i < m; i++) { edges.emplace_back(X[i], Y[i], X[i]); } dsu = DSU(n); sort(edges.begin(), edges.end()); for (int i = 0; i < m; i++) { dsu.join(edges[i].u, edges[i].v); } root = dsu.n; memset(up, -1, sizeof(up)); timedfs = 0; dfs(root - 1, -1, 1); // for (int i = 0; i < root; i++) { // cout << a[i] << ' '; // }cout << '\n'; // for (int i = 0; i < root; i++) { // cout << i << endl; // for (int j = 0; j < 3; j++) { // cout << up[i][j] << ' '; // } cout << '\n'; // }cout << '\n'; for (int i = 0; i < q; i++) { int anc = jump(E[i], R[i], 1); // cout << anc << endl; range2[i] = {st[anc], en[anc]}; } for (int i = 0; i < n; i++) { // cout << st1[i] << ' ' << st[i] << endl; pos[st1[i]] = st[i]; } for (int i = 0; i < q; i++) { event[range1[i].S].pb({i, 1}); event[range1[i].F - 1].pb({i, -1}); } vector<int> res(q); for (int i = 1; i <= root; i++) { update(pos[i], 1); for (auto it : event[i]) { res[it.F] += (get(range2[it.F].S) - get(range2[it.F].F - 1)) * it.S; } } for (int i = 0; i < q; i++) { res[i] = (res[i] > 0); } return res; } vector<int> X, Y, S, E, L, R; signed main(){ ios_base::sync_with_stdio(false) ; cin.tie(0) ; cout.tie(0) ; if (fopen("INP.INP" ,"r")) { freopen("INP.INP" ,"r" , stdin) ; freopen("OUT.OUT" , "w" , stdout) ; } cin >> n >> m >> q; X.resize(m); Y.resize(m); S.resize(q); E.resize(q); L.resize(q); R.resize(q); for (int i = 0; i < m; i++) { cin >> X[i] >> Y[i]; } for (int i = 0; i < q; i++) { cin >> S[i] >> E[i] >> L[i] >> R[i]; } vector<int> res = check_validity(n, X, Y, S, E, L, R); for (int i = 0; i < q; i++) { cout << res[i] << '\n'; } }

Compilation message (stderr)

werewolf.cpp: In function 'int main()':
werewolf.cpp:198:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  198 |         freopen("INP.INP" ,"r" , stdin) ;
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
werewolf.cpp:199:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  199 |         freopen("OUT.OUT" , "w" , stdout) ;
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/ld: /tmp/cc1SnyZ7.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccPFA7nV.o:werewolf.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status