Submission #1131659

#TimeUsernameProblemLanguageResultExecution timeMemory
1131659binminh01Inside information (BOI21_servers)C++20
100 / 100
428 ms85980 KiB
#include<bits/allocator.h> #pragma GCC optimize("Ofast,unroll-loops") #ifdef ONLINE_JUDGE #pragma GCC target("avx2,fma,bmi,bmi2,popcnt,lzcnt") #endif #include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define int128 __int128_t #define double long double #define gcd __gcd #define lcm(a, b) ((a)/gcd(a, b)*(b)) #define sqrt sqrtl #define log2 log2l #define log10 log10l #define floor floorl #define to_string str #define yes cout << "YES" #define no cout << "NO" #define trav(i, a) for (auto &i: (a)) #define all(a) (a).begin(), (a).end() #define rall(a) (a).rbegin(), (a).rend() #define sz(a) (int)a.size() #define Max(a) *max_element(all(a)) #define Min(a) *min_element(all(a)) #define Find(a, n) (find(all(a), n) - a.begin()) #define Count(a, n) count(all(a), n) #define Upper(a, n) (upper_bound(all(a), n) - a.begin()) #define Lower(a, n) (lower_bound(all(a), n) - a.begin()) #define next_perm(a) next_permutation(all(a)) #define prev_perm(a) prev_permutation(all(a)) #define sorted(a) is_sorted(all(a)) #define sum(a) accumulate(all(a), 0) #define sumll(a) accumulate(all(a), 0ll) #define Sort(a) sort(all(a)) #define Reverse(a) reverse(all(a)) #define Unique(a) Sort(a), (a).resize(unique(all(a)) - a.begin()) #define pb push_back #define eb emplace_back #define popcount __builtin_popcount #define popcountll __builtin_popcountll #define clz __builtin_clz #define clzll __buitlin_clzll #define ctz __builtin_ctz #define ctzll __builtin_ctzll #define open(s) freopen(s, "r", stdin) #define write(s) freopen(s, "w", stdout) #define fileopen(s) open((string(s) + ".inp").c_str()), write((string(s) + ".out").c_str()); #define For(i, a, b) for (auto i = (a); i < (b); ++i) #define Fore(i, a, b) for (auto i = (a); i >= (b); --i) #define FOR(i, a, b) for (auto i = (a); i <= (b); ++i) #define ret(s) return void(cout << s); constexpr int mod = 1e9 + 7, mod2 = 998244353; constexpr double eps = 1e-9; const double PI = acos(-1); constexpr ull npos = string::npos; constexpr int dx[] = {1, 0, -1, 0, 1, 1, -1, -1}, dy[] = {0, 1, 0, -1, 1, -1, 1, -1}; using pii = pair<int, int>; using pll = pair<ll, ll>; using cd = complex<double>; mt19937 mt(chrono::system_clock::now().time_since_epoch().count()); mt19937_64 mt64(chrono::system_clock::now().time_since_epoch().count()); typedef vector<int> vi; typedef vector<vi> vvi; typedef vector<ll> vll; typedef vector<vll> vvll; typedef vector<double> vdo; typedef vector<vdo> vvdo; typedef vector<string> vs; typedef vector<pii> vpair; typedef vector<vpair> vvpair; typedef vector<bool> vb; typedef vector<vb> vvb; typedef vector<char> vc; typedef vector<vc> vvc; typedef vector<cd> vcd; typedef priority_queue<int> pq; typedef priority_queue<int, vi, greater<int>> pqg; typedef priority_queue<ll> pqll; typedef priority_queue<ll, vll, greater<ll>> pqgll; ll add(ll a, ll b, int m) {a = (a >= m ? a % m: a);b = (b >= m ? b % m: b);a+=b;return a >= m ? a - m: a;} ll sub(ll a, ll b, int m) {a = (a >= m ? a % m: a);b = (b >= m ? b % m: b);a-=b;return a < 0 ? a + m: a;} ll mul(ll a, ll b, int m) {a = (a >= m ? a % m: a);b = (b >= m ? b % m: b);return a*b % m;} ll bin_mul(ll a, ll b, ll m) {a = (a >= m ? a % m: a);b = (b >= m ? b % m: b);ll x = 0;while (b) {if (b & 1) x = (x + a) % m;a = (a + a) % m;b>>=1;}return x;} ll bin_pow(ll a, ll b, ll m) {ll x = 1;a = (a >= m ? a % m: a); while (b) {if (b & 1) x = bin_mul(x, a, m);a = bin_mul(a, a, m);b>>=1;}return x;} ll power(ll a, ll b, int m) {ll x = 1;a = (a >= m ? a % m: a); while (b) {if (b & 1) x = x*a % m;a = a*a % m;b>>=1;}return x;} ll power(ll a, ll b) {ll x = 1;while (b) {if (b & 1) x = x*a;a = a*a;b>>=1;}return x;} ll ceil(ll a, ll b) {return (a + b - 1)/b;} ll to_int(const string &s) {ll x = 0; for (int i = (s[0] == '-'); i < sz(s); ++i) x = x*10 + s[i] - '0';return x*(s[0] == '-' ? -1: 1);} bool is_prime(ll n) {if (n < 2) return 0;if (n < 4) return 1;if (n % 2 == 0 || n % 3 == 0) return 0;for (ll i = 5; i*i <= n; i+=6) {if(n % i == 0 || n % (i + 2) == 0) return 0;}return 1;} bool is_square(ll n) {ll k = sqrt(n); return k*k == n;} ll factorial(int n) {ll x = 1;for (int i = 2; i <= n; ++i) x*=i;return x;} ll factorial(int n, int m) {ll x = 1;for (ll i = 2; i <= n; ++i) x = x*i % m;return x;} bool is_power(ll n, ll k) {while (n % k == 0) n/=k;return n == 1ll;} string str(ll n) {if (n == 0) return "0"; string s = ""; bool c = 0; if (n < 0) c = 1, n = -n; while (n) {s+=n % 10 + '0'; n/=10;} if (c) s+='-'; Reverse(s); return s;} string repeat(const string &s, int n) {if (n < 0) return ""; string x = ""; while (n--) x+=s; return x;} string bin(ll n) {string s = ""; while (n) {s+=(n & 1) + '0'; n>>=1;} Reverse(s); return s;} void sieve(vector<bool> &a) {int n = a.size(); a[0] = a[1] = 0; for (int i = 4; i < n; i+=2) a[i] = 0; for (int i = 3; i*i < n; i+=2) {if (a[i]) {for (int j = i*i; j < n; j+=(i << 1)) a[j] = 0;}}} void sieve(bool a[], int n) {a[0] = a[1] = 0; for (int i = 4; i < n; i+=2) a[i] = 0; for (int i = 3; i*i < n; i+=2) {if (a[i]) {for (int j = i*i; j < n; j+=(i << 1)) a[j] = 0;}}} void sieve(vector<int> &a) {int n = a.size(); for (int i = 2; i < n; i+=2) a[i] = 2; for (int i = 3; i*i < n; i+=2) {if (!a[i]) {for (int j = i; j < n; j+=(i << 1)) a[j] = i;}} for (int i = 3; i < n; i+=2) {if (!a[i]) a[i] = i;}} void sieve(int a[], int n) {for (int i = 2; i < n; i+=2) a[i] = 2; for (int i = 3; i*i < n; i+=2) {if (!a[i]) {for (int j = i; j < n; j+=(i << 1)) a[j] = i;}} for (int i = 3; i < n; i+=2) {if (!a[i]) a[i] = i;}} vector<pii> factorize(int n) {vector<pii> a; for (int i = 2; i*i <= n; ++i) {if (n % i == 0) {int k = 0; while (n % i == 0) ++k, n/=i; a.emplace_back(i, k);}} if (n > 1) a.emplace_back(n, 1); return a;} int rand(int l, int r) {return uniform_int_distribution<int>(l, r)(mt);} ll rand(ll l, ll r) {return uniform_int_distribution<ll>(l, r)(mt64);} int Log2(int n) {return 31 - __builtin_clz(n);} ll Log2(ll n) {return 63 - __builtin_clzll(n);} template<class T> void compress(vector<T> &a) {vector<T> b; for (T &i: a) b.push_back(i); sort(all(b)); b.resize(unique(all(b)) - b.begin()); for (T &i: a) i = lower_bound(all(b), i) - b.begin() + 1;} template<class A, class B> bool ckmin(A &a, const B &b) {return a > b ? a = b, 1: 0;} template<class A, class B> bool ckmax(A &a, const B &b) {return a < b ? a = b, 1: 0;} template<class A, class B> istream& operator>>(istream& in, pair<A, B> &p) {in >> p.first >> p.second; return in;} template<class A, class B> ostream& operator<<(ostream& out, const pair<A, B> &p) {out << p.first << ' ' << p.second; return out;} template<class T> istream& operator>>(istream& in, vector<T> &a) {for (auto &i: a) in >> i; return in;} template<class T> ostream& operator<<(ostream& out, const vector<T> &a) {for (auto &i: a) out << i << ' '; return out;} template<class T> istream& operator>>(istream& in, vector<vector<T>> &a) {for (auto &i: a) in >> i; return in;} template<class T> ostream& operator<<(ostream& out, const vector<vector<T>> &a) {for (auto &i: a) out << i << '\n'; return out;} template<class T> istream& operator>>(istream& in, deque<T> &a) {for (auto &i: a) in >> i; return in;} template<class T> ostream& operator<<(ostream& out, const deque<T> &a) {for (auto &i: a) out << i << ' '; return out;} // istream& operator>>(istream& in, __int128_t &a) {string s; in >> s; a = 0; for (auto &i: s) a = a*10 + (i - '0'); return in;} // ostream& operator<<(ostream& out, __int128_t a) {string s = ""; if (a < 0) s+='-', a = -a; if (a == 0) s+='0'; while (a > 0) {s+=(int)(a % 10) + '0'; a/=10;} Reverse(s); out << s; return out;} template<class T> struct BIT { int n; vector<T> b; BIT(int n = 0): n(n) {b.assign(n + 1, 0);} void build(const vector<T> &a) { for (int i = 1; i <= n; ++i) set(i, a[i]); } void set(int i, T v) { for (; i <= n; i+=i & (-i)) b[i]+=v; } T get(int i) { T x = 0; for (; i; i-=i & (-i)) x+=b[i]; return x; } T get(int l, int r) { return get(r) - get(l - 1); } }; constexpr int N = 250000; vpair g[N], qa[N], Q[N], ask[N]; vi qc[N], us, used, ub; int inf, n, s[N], par[N], ans[N], rt[N]; bool c[N]; char op[N]; pair<int, bool> b[N], d[N]; BIT<int> B, bt[N]; int dfs_sz(int u, int p) { s[u] = 1; for (auto [v, w]: g[u]) { if (!c[v] && v != p) s[u]+=dfs_sz(v, u); } return s[u]; } int cen(int u, int p, int z) { for (auto [v, w]: g[u]) { if (!c[v] && v != p && s[v]*2 > z) return cen(v, u, z); } return u; } void dec1(int u, int p, int x) { us.pb(u); for (auto [v, w]: g[u]) { if (!c[v] && v != p) { b[v].first = b[u].first; b[v].second = (b[u].second && w < x); rt[v] = rt[u]; dec1(v, u, w); } } } void inc1(int u, int p, int x, bool o) { if (!o) return; B.set(x, 1); ub.pb(x); // cout << u << ' ' << x << ' ' << o << endl; for (auto [v, i]: qa[u]) { // if (b[v].first) cout << "ask " << u << ' ' << v << endl; if (b[v].first && rt[v] != rt[u] && (x < i || x == inf)) { // cout << v << ' ' << b[v] << ' ' << x << endl; if (b[v].first == inf) ans[i] = (x < i); else if (x == inf) ans[i] = (b[v].second && b[v].first < i); else ans[i] = (b[v].second && b[u].first > b[v].first && x < i); } } for (auto [v, w]: g[u]) { if (!c[v] && v != p) inc1(v, u, w, o & (w > x || x == inf)); } } void decom1(int u, int pre) { u = cen(u, 0, dfs_sz(u, 0)); // cout << "cen " << u << endl; par[u] = pre; c[u] = 1; us.pb(u); b[u] = {inf, 1}; rt[u] = 0; for (auto [v, w]: g[u]) { if (!c[v]) { b[v] = {w, 1}; rt[v] = v; dec1(v, u, w); } } inc1(u, 0, inf, 1); trav(i,us) b[i] = {0, 0}; us.clear(); trav(i,qc[u]){ ans[i] = B.get(i) + 1; for (int v = par[u]; v; v = par[v]) Q[v].eb(u, i); } trav(i,ub) B.set(i, -1); ub.clear(); for (auto [v, w]: g[u]) { if (!c[v]) decom1(v, u); } } void dec2(int u, int p, int x) { us.pb(u); // cout << "dec " << u << ' ' << b[u].second << '\n'; for (auto [v, w]: g[u]) { if (!c[v] && v != p) { b[v].first = b[u].first; b[v].second = (b[u].second && w < x); rt[v] = rt[u]; dec2(v, u, w); } } } void inc2(int u, int p, int x, bool o) { if (!o) return; ub.pb(u); B.set(x, 1), used.pb(x); // cout << u << ' ' << x << endl; for (auto [v, w]: g[u]) { if (!c[v] && v != p) { d[v].first = d[u].first; d[v].second = (d[u].second && w > x); inc2(v, u, w, o && w > x); } } } void decom2(int u) { u = cen(u, 0, dfs_sz(u, 0)); c[u] = 1; // cout << "cen " << u << endl; for (auto [v, w]: g[u]) { if (!c[v]) { b[v] = {w, 1}; rt[v] = v; dec2(v, u, w); } } for (auto [v, i]: Q[u]) if (b[v].second) ask[rt[v]].eb(v, i);//, cout << "ask " << v << ' ' << rt[v] << endl; for (auto [v, w]: g[u]) { if (!c[v]) { for (auto [r, i]: ask[v]) if (b[r].second && b[r].first < i) { ans[i]+=B.get(i) + 1; // cout << "ans " << r << ' ' << i << ' ' << B.get(i) << ' ' << ans[i] << endl; } d[v] = {w, 1}; inc2(v, u, w, 1); } } trav(i,us) b[i] = {0, 0}; trav(i,ub) d[i] = {0, 0}; trav(i,used) B.set(i, -1); us.clear(); ub.clear(); used.clear(); for (auto [v, w]: g[u]) ask[v].clear(); for (auto [v, w]: g[u]) { if (!c[v]) decom2(v); } } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); cout << fixed << setprecision(10); int m; cin >> n >> m; m+=n - 1; FOR(i,1,m) { char o; int u; cin >> o >> u; if (o == 'S') { int v; cin >> v; g[u].eb(v, i); g[v].eb(u, i); } else if (o == 'Q') { int v; cin >> v; if (u == v) ans[i] = 1; else qa[u].eb(v, i); } else qc[u].pb(i); op[i] = o; } FOR(i,1,n) sort(all(g[i]), [](pii &x, pii &y){return x.second > y.second;}); inf = m + 3; B = BIT<int>(m + 5); decom1(1, 0); memset(c, 0, sizeof(c)); decom2(1); FOR(i,1,m){ if (op[i] == 'Q') cout << (ans[i] ? "yes": "no") << '\n'; else if (op[i] == 'C') cout << ans[i] << '\n'; } cerr << "\nProcess returned 0 (0x0) execution time : " << 0.001*clock() << " s"; return 0; }
#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...
#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...