Submission #888590

#TimeUsernameProblemLanguageResultExecution timeMemory
888590yfrank792Election (BOI18_election)C++14
82 / 100
141 ms36180 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<ll> vll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef queue<int> qi; typedef set<int> si; typedef priority_queue<int> pqi; typedef priority_queue<ll> pql; typedef priority_queue<int,vi,greater<int> > pqi_g; typedef priority_queue<ll,vll,greater<ll> > pql_g; #define F first #define S second #define PB push_back #define PF push_front #define MP make_pair #define FOR(i,a,b) for (int i=a; i<=b; i++) #define _FOR(i,a,b) for (int i=a; i>=b; i--) #define F0R(i,a,b,x) for (int i=a; i<=b; i+=x) #define FOR_(x,v) for (auto x : v) #define F0R_(x,v) for (auto &x : v) const int INF = 0x3f3f3f3f; const int maxn = 5e5+5; const ll MOD = 1e9+7; //? link: https://oj.uz/problem/view/BOI18_election //? sol: int n, q; class segtree { struct node {ll mx_pre,mx_suf,sum,ans;} d[maxn]; private: ll inline ls(ll x) {return x<<1;} ll inline rs(ll x) {return x<<1|1;} node inline op(node &l,node &r) { return { max(l.mx_pre, l.sum+r.mx_pre), max(r.mx_suf, r.sum+l.mx_suf), l.sum + r.sum, max(max(l.ans+r.sum, l.sum+r.ans), l.mx_pre+r.mx_suf) }; } public: ll a[maxn]; // 1 if T, -1 if C void init(ll s=1,ll t=n,ll p=1) { if (s==t) { ll tmp = (ll)a[s]; d[p] = {max(tmp,0ll),max(tmp,0ll),tmp,max(tmp,0ll)}; // mx_pre, mx_suf, sum, ans // note: mx_pre and mx_suf can be 0 when it's C (taking prefix/suffix sum of no elements) return; } ll mid = s + ((t-s)>>1); init(s, mid, ls(p)); init(mid+1, t, rs(p)); d[p] = op(d[ls(p)], d[rs(p)]); } node query(ll l,ll r,ll s=1,ll t=n,ll p=1) { // query(l,r) if (l<=s && t<=r) return d[p]; ll mid = s + ((t-s)>>1); node lch, rch; if (l<=mid) lch=query(l,r,s,mid,ls(p)); else lch={0,0,0,0}; if (r>mid) rch=query(l,r,mid+1,t,rs(p)); else rch={0,0,0,0}; return op(lch,rch); } } st; int a[maxn]; int main() { // faster cin/cout ios_base::sync_with_stdio(false); cin.tie(NULL); // freopen("c.in","r",stdin); cin >> n; FOR(i,1,n) { char c; cin>>c; st.a[i] = (c=='C'? -1:1); } st.init(); cin >> q; FOR(_,1,q) { int l,r; cin>>l>>r; cout << st.query(l,r).ans << endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...