제출 #435519

#제출 시각아이디문제언어결과실행 시간메모리
435519b00n0rp사탕 분배 (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...