#include "candies.h"
#include<stdio.h>
#include<assert.h>
#include <vector>
struct node{
long long sum,smx,smn;
friend node operator+(node a,node b){
node c;
c.smx=std::max(a.smx,b.smx);
c.smn=std::min(a.smn,b.smn);
c.sum=c.smx-c.smn;
return c;
}
node():sum(0),smx(0),smn(0){ }
node(long long x):sum(x),smx(x),smn(x){}
};
node t[1<<19];
long long lz[1<<19];
void pus(int v,int l,int r){
if(lz[v]){
t[v].smn+=lz[v];
t[v].smx+=lz[v];
if(l-r){
lz[v*2+1]+=lz[v];
lz[v*2+2]+=lz[v];
}else
t[v].sum+=lz[v];
lz[v]=0;
}
}
void pul(int v,int l,int r){
if(l!=r) pus(v*2+1,l,(l+r)/2), pus(v*2+2,(l+r)/2+1,r);
t[v]=t[v*2+1]+t[v*2+2];
}
void update(int v,int l,int r,int x,int y,int k){
pus(v,l,r);
if(r<x||y<l)return;
if(x<=l&&r<=y){
lz[v]=k;
pus(v,l,r);return;
}
update(v*2+1,l,(l+r)/2,x,y,k);
update(v*2+2,(l+r)/2+1,r,x,y,k);
pul(v,l,r);
}
node query(int v,int l,int r,int x,int y){
pus(v,l,r);
if(x<=l&&r<=y)return t[v];
if((l+r)/2<x)return query(v*2+2,(l+r)/2+1,r,x,y);
if(y<=(l+r)/2)return query(v*2+1,l,(l+r)/2,x,y);
return query(v*2+1,l,(l+r)/2,x,y)+query(v*2+2,(l+r)/2+1,r,x,y);
}
std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l, std::vector<int> r, std::vector<int> v) {
int n=(int)c.size();
std::vector<std::vector<int>>attach(n);
auto ADDQUERY=[&](int l,int r,int v,int id){
attach[l].push_back(id);
if(r+1<n)attach[r+1].push_back(id|(1<<25));
};
l.insert(l.begin(),0);
r.insert(r.begin(),n-1);
l.insert(l.begin(),0);
r.insert(r.begin(),n-1);
v.insert(v.begin(),1e9+1);
v.insert(v.begin(),-1e9-1);
for(int i=0;i<(int)l.size();++i)
ADDQUERY(l[i],r[i],v[i],i);
std::vector<int> s(n);
int q=(int)l.size();
for(int i=0;i<n;++i){
for(auto x:attach[i]){
if((x>>25)&1){
x^=1<<25;
update(0,0,q-1,x,q-1,-v[x]);
}else{
update(0,0,q-1,x,q-1,v[x]);
}
}
int lower,upper,mid,i1,i2;
i1=i2=-1;
lower=-1,upper=q-1;
while(upper-lower>1){
mid=lower+(upper-lower)/2;
node x=query(0,0,q-1,mid,q-1);
if(x.sum>=c[i]) i1=lower=mid;
else upper=mid;
}
assert(~i1);
lower=i1,upper=q;
while(upper-lower>1){
mid=lower+(upper-lower)/2;
node x=query(0,0,q-1,i1,mid);
if(x.sum>=c[i]) i2=upper=mid;
else lower=mid;
}
assert(~i2);
if(query(0,0,q-1,i1,i1).sum<query(0,0,q-1,i2,i2).sum){
s[i]=c[i]+(query(0,0,q-1,q-1,q-1).sum-query(0,0,q-1,i2,i2).sum);
}else{
s[i]=query(0,0,q-1,q-1,q-1).sum-query(0,0,q-1,i2,i2).sum;
}
}
return s;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |