Submission #500860

#TimeUsernameProblemLanguageResultExecution timeMemory
500860balbitCats or Dogs (JOI18_catdog)C++14
100 / 100
257 ms37284 KiB
#include "catdog.h" #include <bits/stdc++.h> #define int ll using namespace std; #define ll long long #define y1 zck_is_king #define pii pair<ll, ll> #define ull unsigned ll #define f first #define s second #define ALL(x) x.begin(),x.end() #define SZ(x) (int)x.size() #define SQ(x) (x)*(x) #define MN(a,b) a = min(a,(__typeof__(a))(b)) #define MX(a,b) a = max(a,(__typeof__(a))(b)) #define pb push_back #define REP(i,n) for (int i = 0; i<n; ++i) #define RREP(i,n) for (int i = n-1; i>=0; --i) #define REP1(i,n) for (int i = 1; i<=n; ++i) #define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end())))) #ifdef BALBIT #define IOS() #define bug(...) fprintf(stderr,"#%d (%s) = ",__LINE__,#__VA_ARGS__),_do(__VA_ARGS__); template<typename T> void _do(T &&x){cerr<<x<<endl<<flush;} template<typename T, typename ...S> void _do(T &&x, S &&...y){cerr<<x<<", ";_do(y...);} #else #define IOS() ios_base::sync_with_stdio(0);cin.tie(0); #define endl '\n' #define bug(...) #endif const int iinf = 1e9+10; const ll inf = 1ll<<29; const ll mod = 1e9+7 ; void GG(){cout<<"0\n"; exit(0);} ll mpow(ll a, ll n, ll mo = mod){ // a^n % mod ll re=1; while (n>0){ if (n&1) re = re*a %mo; a = a*a %mo; n>>=1; } return re; } ll inv (ll b, ll mo = mod){ if (b==1) return b; return (mo-mo/b) * inv(mo%b,mo) % mo; } const int maxn = 1e5+5; struct segtree{ // segtree for this chain int MAXN; vector<array<array<int,2>, 2> > s; // s[o][a][b]: from type a (higher) to type b (lower) 0 is cat, 1 is dog void MO(int p, int n0, int n1, int o, int l, int r) { if (l > p || r < p) return; if (l == r) { s[o][0][0]=n0; s[o][1][1]=n1; s[o][0][1]=inf; s[o][1][0]=inf; return; } int mid = (l+r)/2; MO(p,n0,n1,o*2,l,mid); MO(p,n0,n1,o*2+1,mid+1,r); REP(i,2) REP(j,2) { s[o][i][j] = inf; REP(a,2) REP(b,2){ MN(s[o][i][j], s[o*2][i][a] + s[o*2+1][b][j] + (a!=b)); } } } void MO(int p, int n0, int n1) { MO(p,n0,n1,1,0,MAXN-1); } array<int, 2> get(){ array<int, 2> re = {{inf, inf}}; REP(t,2) REP(i,2) REP(j,2) { MN(re[t], s[1][i][j] + (i!=t)); } return re; } int gans(){ int re = inf; REP(i,2) REP(j,2) { // bug(i,j,s[1][i][j]); MN(re, s[1][i][j]); } return re; } segtree(){} void init(int ss){ MAXN = ss; s.resize(ss*4, {{{{inf,inf}}, {{inf, inf}}}}); } }; //int treeidx[maxn]; // position on chain, with 0 being the head int head[maxn]; // head of each node int sz[maxn], par[maxn]; vector<int> g[maxn]; int catdog[maxn], dep[maxn]; // -1:nothing, 0:cat, 1:dog int ifcat[maxn], ifdog[maxn]; // cost of being cat or dog void dfs(int v, int p) { sz[v] = 1; for (int u : g[v]) { if (u != p) { par[u] = v; dep[u] = dep[v] + 1; dfs(u,v); sz[v] += sz[u]; } } } int chainsize[maxn]; void dfs2(int v, int p) { chainsize[head[v]]++; int mx = 0, mxc = -1; for (int u : g[v]) { if (u!=p) { if (sz[u] > mx) { mx = sz[u]; mxc = u; } } } for (int u : g[v]) { if (u !=p) { if (u == mxc) { head[u] = head[v]; }else{ head[u] = u; } dfs2(u,v); } } } segtree TT[maxn]; // for each head void upd(int v) { // update a node if (catdog[v] == -1) { // no animal TT[head[v]].MO(dep[v] - dep[head[v]], ifcat[v], ifdog[v]); }else if (catdog[v] == 0) { bug("hello/"); TT[head[v]].MO(dep[v] - dep[head[v]], ifcat[v], inf); // cat }else{ // doge bug("hello/ dog"); TT[head[v]].MO(dep[v] - dep[head[v]], inf, ifdog[v]); } } void chainupd(int v) { while (1) { array<int, 2> old = TT[head[v]].get(); upd(v); if (head[v] == 0) break; array<int, 2> yo = TT[head[v]].get(); int nxt = par[head[v]]; ifcat[nxt] += yo[0] - old[0]; ifdog[nxt] += yo[1] - old[1]; v = nxt; } } void initialize(signed n, vector<signed> a, vector<signed> b) { REP(i,n-1) { g[a[i]-1].pb(b[i]-1); g[b[i]-1].pb(a[i]-1); } dfs(0, -1); dfs2(0,-1); REP(i,n) { bug(i, head[i], chainsize[head[i]]); if (head[i] == i) { TT[i].init(chainsize[i]); } } REP(i,n) catdog[i] = -1; REP(i,n) { upd(i); } } signed yar(signed v, signed nw) { --v; catdog[v] = nw; chainupd(v); // array<int, 2> ho = TT[0].get(); int ret = TT[0].gans(); bug(ret); return ret; } signed cat(signed v) { return yar(v,0); } signed dog(signed v) { return yar(v,1); } signed neighbor(signed v) { return yar(v,-1); } /* 5 1 2 2 3 2 4 1 5 7 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...