제출 #435519

#제출 시각아이디문제언어결과실행 시간메모리
435519b00n0rpDistributing Candies (IOI21_candies)C++17
29 / 100
978 ms312020 KiB
#include "candies.h" #include<bits/stdc++.h> using namespace std; #define int long long #define REP(i,n) for(int i = 0; i < n; i ++) #define FOR(i,a,b) for(int i = a; i < b; i ++) #define vi vector<int> #define pb push_back #define SZ(v) (int)v.size() #define remax(a,b) a = max(a,b) #define remin(a,b) a = min(a,b) const int MX = 200005; int n,q,a[MX]; int seg[100*MX],lft[100*MX],rgt[100*MX],lazy[100*MX]; int SZ = 1; void propagate(int ind,int l,int r){ if(l != r){ if(!lft[ind]) lft[ind] = ++SZ; if(!rgt[ind]) rgt[ind] = ++SZ; } if(lazy[ind] == -1) return; if(lazy[ind] == 1) seg[ind] = (r-l+1); else seg[ind] = 0; if(l != r){ lazy[lft[ind]] = lazy[ind]; lazy[rgt[ind]] = lazy[ind]; } lazy[ind] = -1; } int update0(int ind,int l,int r,int val){ propagate(ind,l,r); int ret = seg[ind]; if(seg[ind] <= val){ // cout << ind << " " << l << " " << r << " " << val << " -0\n"; lazy[ind] = 0; propagate(ind,l,r); return ret; } if(l == r) return ret; int mid = (l+r)/2; int sml = update0(lft[ind],l,mid,val); if(sml < val){ val -= sml; update0(rgt[ind],mid+1,r,val); } else{ propagate(rgt[ind],mid+1,r); } seg[ind] = seg[lft[ind]]+seg[rgt[ind]]; // cout << "update0:: " << ind << " " << l << " " << r << " " << seg[ind] << "\n"; return ret; } int update1(int ind,int l,int r,int val){ propagate(ind,l,r); int ret = seg[ind]; if(seg[ind] >= r-val){ // cout << ind << " " << l << " " << r << " " << val << " -1\n"; lazy[ind] = 1; propagate(ind,l,r); return ret; } if(l == r) return ret; int mid = (l+r)/2; int sml = update1(lft[ind],l,mid,val); if(sml > mid-val){ val += sml; update1(rgt[ind],mid+1,r,val); } else{ propagate(rgt[ind],mid+1,r); } seg[ind] = seg[lft[ind]]+seg[rgt[ind]]; // cout << "update1:: " << ind << " " << l << " " << r << " " << seg[ind] << "\n"; return ret; } int query(int ind,int l,int r,int pos){ propagate(ind,l,r); if(l > pos) return 0; // cout << ind << " " << l << " " << r << " " << pos << " " << seg[ind] << "\n"; if(r <= pos) return seg[ind]; int mid = (l+r)/2; return query(lft[ind],l,mid,pos)+query(rgt[ind],mid+1,r,pos); } vector<signed> distribute_candies(vector<signed> c,vector<signed> l,vector<signed> r,vector<signed> v){ n = c.size(); q = l.size(); REP(j,q){ if(v[j] < 0) update0(1,1,1e9,-v[j]); else update1(1,1,1e9,v[j]); } vector<signed> ans; REP(i,n){ ans.pb(query(1,1,1e9,c[i])); } return ans; }
#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...