Submission #803931

#TimeUsernameProblemLanguageResultExecution timeMemory
803931physics07Distributing Candies (IOI21_candies)C++17
100 / 100
523 ms24460 KiB
#include "candies.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAX=200002; ll inf=1e18; struct Node { ll m, M; Node operator+(const Node &p) { return {min(m, p.m), max(M, p.M)}; } }; struct seg{ Node tree[4*MAX]; ll lazy[4*MAX]; void lazy_prop(int node, int s, int e) { tree[node].m+=lazy[node]; tree[node].M+=lazy[node]; if(s!=e) { lazy[node*2]+=lazy[node]; lazy[node*2+1]+=lazy[node]; } lazy[node]=0; } void update(int node, int s, int e, int l, int r, int v) { lazy_prop(node, s, e); if(s>r || e<l) return; if(s>=l && e<=r) { lazy[node]+=v; lazy_prop(node, s, e); return; } int m=s+e>>1; update(node*2, s, m, l, r, v); update(node*2+1, m+1, e, l, r, v); tree[node]=tree[node*2]+tree[node*2+1]; } int query(int node, int s, int e, ll c, ll m, ll M) { lazy_prop(node, s, e); if(s==e) { if(max(tree[node].M, M)-min(tree[node].m, m)>c) return s; return s-1; } int mid=s+e>>1; lazy_prop(node*2, s, mid); lazy_prop(node*2+1, mid+1, e); pair<ll, ll> curr={min(m, tree[node*2+1].m), max(M, tree[node*2+1].M)}; if(curr.second-curr.first>c) return query(node*2+1, mid+1, e, c, m, M); else return query(node*2, s, mid, c, curr.first, curr.second); } ll get(int node, int s, int e, int idx) { lazy_prop(node, s, e); if(s>idx || e<idx) return -1e18; if(s==e) return tree[node].m; int m=s+e>>1; return max(get(node*2, s, m, idx), get(node*2+1, m+1, e, idx)); } Node val(int node, int s, int e, int l, int r) { lazy_prop(node, s, e); if(s>r || e<l) return {inf, -inf}; if(s>=l && e<=r) return tree[node]; int m=s+e>>1; return val(node*2, s, m, l, r)+val(node*2+1, m+1, e, l, r); } } tree; struct query{ int s, v, idx; bool operator<(const query &Q) const { return s<Q.s; } }; vector<query> v; vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> diff) { int n = c.size(), q=r.size(); for(int i=0; i<q; i++) { v.push_back({l[i], diff[i], i+1}); v.push_back({r[i]+1, -diff[i], i+1}); } sort(v.begin(), v.end()); vector<int> ans(n); int curr=0; for(int i=0; i<n; i++) { for(; curr<2*q; curr++) { if(v[curr].s==i) tree.update(1, 0, q, v[curr].idx, q, v[curr].v); else break; } int p=tree.query(1, 0, q, c[i], inf, -inf); ll ed=tree.get(1, 0, q, q); if(p==-1) { Node cnt=tree.val(1, 0, q, 0, q); ans[i]=ed-cnt.m; continue; } Node cnt=tree.val(1, 0, q, p, q); if(tree.get(1, 0, q, p)==cnt.m) ans[i]=c[i]-cnt.M+ed; else ans[i]=ed-cnt.m; } return ans; }

Compilation message (stderr)

candies.cpp: In member function 'void seg::update(int, int, int, int, int, int)':
candies.cpp:33:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   33 |         int m=s+e>>1;
      |               ~^~
candies.cpp: In member function 'int seg::query(int, int, int, ll, ll, ll)':
candies.cpp:44:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   44 |         int mid=s+e>>1;
      |                 ~^~
candies.cpp: In member function 'll seg::get(int, int, int, int)':
candies.cpp:55:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   55 |         int m=s+e>>1;
      |               ~^~
candies.cpp: In member function 'Node seg::val(int, int, int, int, int)':
candies.cpp:62:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   62 |         int m=s+e>>1;
      |               ~^~
#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...