Submission #441661

#TimeUsernameProblemLanguageResultExecution timeMemory
441661ogibogi2004사탕 분배 (IOI21_candies)C++17
100 / 100
764 ms38212 KiB
#include "candies.h"

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll MAXN=2e5+6;
const ll INF=1e9;
struct node
{
	ll maxval,minval,sum;
};
node merge(node n1,node n2)
{
	n1.maxval=max(n1.maxval,n1.sum+n2.maxval);
	n1.minval=min(n1.minval,n1.sum+n2.minval);
	n1.sum=n1.sum+n2.sum;
	return n1;
}
struct segment_tree
{
	node tree[4*MAXN];
	void build(int l,int r,int idx)
	{
		if(l==r)
		{
			tree[idx].maxval=0;
			tree[idx].minval=0;
			tree[idx].sum=0;
			return;
		}
		int mid=(l+r)/2;
		build(l,mid,idx*2);
		build(mid+1,r,idx*2+1);
		tree[idx]=merge(tree[idx*2],tree[idx*2+1]);
	}
	void update(int l,int r,int idx,int q,int val)
	{
		if(l>q)return;
		if(r<q)return;
		if(l==r)
		{
			tree[idx].maxval=val;
			tree[idx].minval=val;
			tree[idx].sum=val;
			return;
		}
		int mid=(l+r)/2;
		update(l,mid,idx*2,q,val);
		update(mid+1,r,idx*2+1,q,val);
		tree[idx]=merge(tree[idx*2],tree[idx*2+1]);
	}
	node query(int l,int r,int idx,int ql,int qr)
	{
		if(l>=ql&&r<=qr)return tree[idx];
		int mid=(l+r)/2;
		if(qr<=mid)return query(l,mid,idx*2,ql,qr);
		else if(ql>mid)return query(mid+1,r,idx*2+1,ql,qr);
		else return merge(query(l,mid,idx*2,ql,qr),query(mid+1,r,idx*2+1,ql,qr));
	}
}t;
struct update
{
	int when,v;
};
vector<update>ul[MAXN],ur[MAXN];
vector<int> distribute_candies(vector<int> c, vector<int> l,
                                    vector<int> r, vector<int> v) {
    ll n = c.size(),q=l.size();
    vector<int>s(n,0);
    ul[0].push_back({1,+INF});
    ur[n-1].push_back({1,+INF});
    ul[0].push_back({2,-INF});
    ur[n-1].push_back({2,-INF});
    for(int i=0;i<q;i++)
    {
		ul[l[i]].push_back({i+3,v[i]});
		ur[r[i]].push_back({i+3,v[i]});
	}
	t.build(1,q+2,1);
	for(int idx=0;idx<n;idx++)
	{
		for(auto xd:ul[idx])
		{
			t.update(1,q+2,1,xd.when,xd.v);
		}
		int low=1,high=q+2,mid,ans;
		node rupert;
		while(low<=high)
		{
			mid=(low+high)/2;
			rupert=t.query(1,q+2,1,mid,q+2);
			if(rupert.maxval-rupert.minval>=c[idx])
			{
				ans=mid;
				low=mid+1;
			}
			else 
			{
				high=mid-1;
			}
		}
		rupert=t.query(1,q+2,1,ans,q+2);
		int minval=rupert.minval;
		int maxval=rupert.maxval;
		int sum=rupert.sum;
		//cout<<idx<<":\n";
		//cout<<minval<<" "<<maxval<<" "<<ans<<endl;
		rupert=t.query(1,q+2,1,ans,ans);
		//cout<<rupert.maxval<<endl;
		if(rupert.maxval==maxval)
		{
			s[idx]=sum-minval;
		}
		else
		{
			s[idx]=c[idx]-(maxval-sum);
		}
		for(auto xd:ur[idx])
		{
			t.update(1,q+2,1,xd.when,0);
		}
	}
	return s;
}

Compilation message (stderr)

candies.cpp: In function 'std::vector<int> distribute_candies(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
candies.cpp:54:7: warning: 'ans' may be used uninitialized in this function [-Wmaybe-uninitialized]
   54 |   if(l>=ql&&r<=qr)return tree[idx];
      |      ~^~~~
candies.cpp:86:26: note: 'ans' was declared here
   86 |   int low=1,high=q+2,mid,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...