Submission #1029267

#TimeUsernameProblemLanguageResultExecution timeMemory
1029267berrSličnost (COI23_slicnost)C++17
100 / 100
1358 ms504060 KiB
#include <bits/stdc++.h> using namespace std; void f(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif } struct segtree{ int n, tl, tr, val, pos, id; vector<int> roots, left, right; vector<array<int , 3>> st; array<int, 3> TxT(array<int, 3> l, array<int, 3> r){ array<int, 3> res={0, 0, 0}; res[0]=l[0]+r[0]; res[1]=max(l[1], l[0]+r[1]); if(l[1]==res[1]) res[2]+=l[2]; if(r[1]+l[0]==res[1]) res[2]+=r[2]; return res; } int add(){ return id++; } segtree(int _n){ n=_n; st.resize(25*(int)(1e6), {0, 0, 0}); left.resize(25*(int)(1e6), -1); right.resize(25*(int)(1e6), -1); int v=add(); roots.push_back(v); build(v, 0, n-1); } void build(int v, int l, int r){ if(l==r) st[v]={0, 0, 1}; else{ int mid=(l+r)/2; if(left[v]==-1) left[v]=add(); if(right[v]==-1) right[v]=add(); build(left[v], l, mid); build(right[v], mid+1, r); st[v]=TxT(st[left[v]], st[right[v]]); } } void update(int v, int l, int r, int nv){ if(l==r){ st[nv]=st[v]; st[nv][0]+=val; st[nv][1]+=val; } else{ int mid=(l+r) / 2; if(pos<=mid){ left[nv]=add(); right[nv]=right[v]; update(left[v], l, mid, left[nv]); } else{ left[nv]=left[v]; right[nv]=add(); update(right[v], mid+1, r, right[nv]); } st[nv]=TxT(st[left[nv]], st[right[nv]]); } } int upd(int p, int l, int v){ pos=l, val=v; int id=add(); roots.push_back(id); update(p, 0, n-1, id); return id; } array<int, 3> g(int v, int l, int r){ if(l>tr||r<tl) return {0, 0, 0}; else if(l>=tl&&r<=tr) return st[v]; else{ int mid=(l+r) /2; return TxT(g(left[v], l, mid), g(right[v], mid+1, r)); } } array<int, 2> get(int pos, int l, int r){ tl = l; tr = r; auto x= g(pos, 0, n-1); return {x[1], x[2]}; } }; signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); // f(); int n, k, q; cin >> n >> k >> q; segtree st(n+1); vector<int> a(n), b(n), pos(n), segt; int c=0; for(auto &i: a) cin >> i, i--; for(auto &i: b) cin >> i, i--, pos[i]=c++; auto ek=[&](int y, int i){ int r=pos[i]; int x=st.upd(y, max(0, r-k+1), 1); st.upd(x, r+1, -1); return (int) st.roots.back(); }; auto cik=[&](int y, int i){ int r=pos[i]; int x= st.upd(y, max(0, r-k+1), -1); st.upd(x, r+1, 1); return (int)st.roots.back(); }; for(int i=0; i<k; i++){ ek(st.roots.back(), a[i]); } segt.push_back(st.roots.back()); vector<array<int,2>> all(n-k+1); vector<long long> pf(n+3); auto x=st.get(st.roots.back(), 0, n-k); all[0]=x; pf[x[0]]+=x[1]; int ma=x[0]; for(int i=k; i<n; i++){ cik(st.roots.back(), a[i-k]); segt.push_back(ek(st.roots.back(), a[i])); auto y=st.get(segt.back(), 0, n-k); all[i-k+1]=y; pf[y[0]]+=y[1]; ma=max(ma, y[0]); } cout<<ma<<" "<<pf[ma]<<"\n"; auto cikar=[&](int v, int value){ if(v<0) return; pf[all[v][0]] -= all[v][1]; segt[v]=cik(segt[v], value); auto x=st.get(segt[v], 0, n-k); all[v] = x; pf[all[v][0]] += all[v][1]; }; auto cikar2=[&](int v, int value){ if(v>n-k) return; pf[all[v][0]] -= all[v][1]; segt[v]=cik(segt[v], value); auto x=st.get(segt[v], 0, n-k); all[v] = x; pf[all[v][0]] += all[v][1]; }; auto ekle=[&](int v, int value){ if(v<0) return; pf[all[v][0]] -= all[v][1]; segt[v]=ek(segt[v], value); auto x=st.get(segt[v], 0, n-k); all[v] = x; pf[all[v][0]] += all[v][1]; }; auto ekle2=[&](int v, int value){ if(v>n-k) return; pf[all[v][0]] -= all[v][1]; segt[v]=ek(segt[v], value); auto x=st.get(segt[v], 0, n-k); all[v] = x; pf[all[v][0]] += all[v][1]; }; while(q--){ int p; cin >> p; p--; cikar(p-k+1, a[p]); cikar2(p+1, a[p+1]); swap(a[p], a[p+1]); ekle(p-k+1, a[p]); ekle2(p+1, a[p+1]); if(pf[ma+1]>0) ma++; else if(pf[ma]==0) ma--; cout<<ma<<" "<<pf[ma]<<"\n"; } }

Compilation message (stderr)

Main.cpp: In function 'void f()':
Main.cpp:6:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    6 |  freopen("in.txt", "r", stdin);
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Main.cpp:7:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    7 |  freopen("out.txt", "w", stdout);
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...