BZOJ 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle 线段树_贪心

Code:

#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin) 
#define maxn 10000000 
#define ls (x<<1) 
#define rs ((x<<1)|1)
#define mid ((l+r)>>1) 
using namespace std;
struct Q
{
	int l,r,num; 
	bool operator<(Q e)const 
	{
		return r==e.r?l>e.l:r<e.r;  
	}
}q[maxn]; 
int k,n,c; 
int maxv[maxn],lazy[maxn]; 
void pushup(int x) 
{ 
	maxv[x]=max(maxv[ls],maxv[rs]);  
}       
void mark(int x,int delta)
{ 
	lazy[x]+=delta,maxv[x]+=delta; 
}
void pushdown(int l,int r,int x)
{
	if(lazy[x]) 
	{
		if(mid>=l)  mark(ls, lazy[x]); 
		if(mid+1<=r)mark(rs, lazy[x]);
		lazy[x]=0; 
	}
}
int query(int l,int r,int x,int L,int R)
{
	if(l>=L&&r<=R) return maxv[x]; 
	pushdown(l,r,x); 
	int t=0;
	if(L<=mid) t = query(l,mid,ls,L,R); 
	if(R>mid)  t = max(t,query(mid+1,r,rs,L,R)); 
	return t; 
} 
void update(int l,int r,int x,int L,int R,int delta)
{
	pushdown(l,r,x); 
	if(l>=L&&r<=R) 
	{
		mark(x, delta); 
		return; 
	}	
	if(L<=mid) update(l,mid,ls,L,R,delta); 
	if(R>mid) update(mid+1,r,rs,L,R,delta); 
	pushup(x); 
}
int main()
{
	//setIO("input"); 
	scanf("%d%d%d",&k,&n,&c); 
	for(int i=1;i<=k;++i) scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].num); 
	sort(q+1,q+1+k);  
	int ans=0;    
    for(int i=1;i<=k;++i) 
    {      
    	int tmp=query(1,n,1,q[i].l,q[i].r-1);      
    	ans+=min(q[i].num, c - tmp);             
    	update(1,n,1,q[i].l,q[i].r-1,min(q[i].num,c - tmp));  
    }
    printf("%d\n",ans); 
    return 0; 
}

  

猜你喜欢

转载自www.cnblogs.com/guangheli/p/10975370.html