Submission #1149145

#TimeUsernameProblemLanguageResultExecution timeMemory
1149145KawakiMeidoElection (BOI18_election)C++20
0 / 100
2 ms2368 KiB
/*Author: KawakiMeido*/ #include <bits/stdc++.h> #define pb push_back #define endl "\n" #define ll long long #define all(x) (x).begin(),(x).end() #define pii pair<int,int> #define fi first #define se second #define NAME "elections" using namespace std; /*Constants*/ const int N = 5e5+10; const int INF = 1e9+7; const long long LLINF = 1e18+3; /*TestCases*/ int test=1; void solve(); void TestCases(bool v){ if (v) cin >> test; while(test--) solve(); } vector<int> a(N); struct Node{ int t; int pre, suf; int mid; int ans; Node(){ t = 0; pre = 0; suf = 0; mid = 0; ans = INF; } void DB(){ cout << t << " "; cout << pre << " "; cout << suf << " "; cout << mid << " "; cout << ans << " "; cout << endl; } }; Node Comb(Node x, Node y){ if (x.ans == INF) return y; if (y.ans == INF) return x; Node res; res.ans = 0; res.t = x.t + y.t; res.pre = x.pre; res.suf = y.suf; int tpre = y.pre + y.mid; int tsuf = x.suf + x.mid; int mpre = 0; int msuf = 0; tpre = max(0,tpre + x.t); int deltapre = max(0,tpre - (x.pre+x.mid)); if (deltapre < y.mid){ res.mid+=deltapre; res.suf+=abs(y.mid - deltapre); } else{ res.mid+=y.mid; mpre+=abs(deltapre - y.mid); } // if (deltapre < y.pre){ // mpre+=abs(y.pre - deltapre); // res.suf+=y.mid; // } // else{ // mpre+=y.pre; // res.mid+=abs(deltapre-y.pre); // res.suf+=abs(y.pre + y.mid - deltapre); // } tsuf = max(0,tsuf + y.t); int deltasuf = max(0,tsuf - (y.suf+y.mid)); if (deltasuf < x.mid){ res.mid+=deltasuf; res.pre+=abs(x.mid - deltasuf); } else{ res.mid+=x.mid; msuf+=abs(deltasuf - x.mid); } // if (deltasuf < x.suf){ // msuf+=abs(x.suf - deltasuf); // res.pre+=x.mid; // } // else{ // msuf+=x.suf; // res.mid+=abs(deltasuf-x.suf); // res.pre+=abs(x.suf + x.mid - deltasuf); // } res.pre += mpre - min(mpre,msuf); res.suf += msuf - min(mpre,msuf); res.mid += min(mpre,msuf); res.ans += res.pre + res.suf + res.mid; return res; } struct SegTree{ vector<Node> ST; int n; SegTree(){} void Build_Rec(int idx, int l, int r){ if (l==r){ ST[idx].t = a[l]; if (a[l] == 1) ST[idx].mid = 1; else ST[idx].mid = 0; ST[idx].pre = 0; ST[idx].suf = 0; ST[idx].ans = ST[idx].mid; } else{ int mid = (l+r)/2; Build_Rec(idx*2,l,mid); Build_Rec(idx*2+1,mid+1,r); ST[idx] = Comb(ST[idx*2],ST[idx*2+1]); } // cout << "Pos:" << idx << " [" << l << "," << r << "]" << endl; // ST[idx].DB(); } void Build(int _n){ n = _n; ST.resize(n*4+10); Build_Rec(1,1,n); } Node Query_Rec(int idx, int l, int r, int x, int y){ if (r < x || y < l) return Node(); if (x<=l && r<=y){ // cout << "Pos:" << idx << " [" << l << "," << r << "]" << endl; // ST[idx].DB(); return ST[idx]; } int mid = (l+r)/2; return Comb(Query_Rec(idx*2,l,mid,x,y),Query_Rec(idx*2+1,mid+1,r,x,y)); // Node tmp = Comb(Query_Rec(idx*2,l,mid,x,y),Query_Rec(idx*2+1,mid+1,r,x,y)); // cout << "Pos:" << idx << " [" << l << "," << r << "]" << endl; // tmp.DB(); // return tmp; } int Query(int l, int r){ Node res = Query_Rec(1,1,n,l,r); return res.ans; } } ST; /*Global Variables*/ int n,q; /*Solution*/ void solve(){ cin >> n; for (int i=1; i<=n; i++){ char c; cin >> c; if (c == 'C') a[i] = -1; else a[i] = 1; } // for (int i=1; i<=n; i++){ // cout << a[i] << " "; // } // cout << endl; // ST.Build(n); // //// cout << "Query Section:" << endl; // cin >> q; // for (int i=1; i<=q; i++){ //// cout << "Q" << i << endl; // int l,r; cin >> l >> r; // cout << ST.Query(l,r) << endl; // } } /*Driver Code*/ signed main(){ freopen(NAME".in","r",stdin); freopen(NAME".out","w",stdout); ios_base::sync_with_stdio(0); cin.tie(0); TestCases(0); return 0; }

Compilation message (stderr)

election.cpp: In function 'int main()':
election.cpp:208:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  208 |     freopen(NAME".in","r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
election.cpp:209:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  209 |     freopen(NAME".out","w",stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...