zoukankan      html  css  js  c++  java
  • bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle【贪心+线段树】

    按结束时间排序,然后开个线段树,按照排序后的牛群贪心的选
    贪心的依据是选哪头牛都是选,不如给后面的多省一点空间

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=50005;
    int m,n,c,ans;
    struct xds
    {
    	int l,r,mn,lz;
    }t[N<<1];
    struct qwe
    {
    	int s,t,m;
    }a[N];
    bool cmp(const qwe &a,const qwe &b)
    {
    	return a.t<b.t;
    }
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    void build(int ro,int l,int r)
    {
    	t[ro].l=l,t[ro].r=r,t[ro].mn=c;
    	if(l==r)
    		return;
    	int mid=(l+r)>>1;
    	build(ro<<1,l,mid);
    	build(ro<<1|1,mid+1,r);
    }
    void ud(int ro)
    {
    	t[ro<<1].lz+=t[ro].lz;
    	t[ro<<1].mn+=t[ro].lz;
    	t[ro<<1|1].lz+=t[ro].lz;
    	t[ro<<1|1].mn+=t[ro].lz;
    	t[ro].lz=0;
    }
    void update(int ro,int l,int r,int w)
    {
    	if(t[ro].l==l&&t[ro].r==r)
    	{
    		t[ro].lz+=w;
    		t[ro].mn+=w;
    		return;
    	}
    	ud(ro);
    	int mid=(t[ro].l+t[ro].r)>>1;
    	if(r<=mid)
    		update(ro<<1,l,r,w);
    	else if(l>mid)
    		update(ro<<1|1,l,r,w);
    	else
    	{
    		update(ro<<1,l,mid,w);
    		update(ro<<1|1,mid+1,r,w);
    	}
    	t[ro].mn=min(t[ro<<1].mn,t[ro<<1|1].mn);
    }
    int ques(int ro,int l,int r)
    {
    	if(t[ro].l==l&&t[ro].r==r)
    		return t[ro].mn;
    	ud(ro);
    	int mid=(t[ro].l+t[ro].r)>>1;
    	if(r<=mid)
    		return ques(ro<<1,l,r);
    	else if(l>mid)
    		return ques(ro<<1|1,l,r);
    	else
    		return min(ques(ro<<1,l,mid),ques(ro<<1|1,mid+1,r));
    }
    int main()
    {
    	m=read(),n=read(),c=read();
    	for(int i=1;i<=m;i++)
    		a[i].s=read(),a[i].t=read()-1,a[i].m=read();
    	sort(a+1,a+1+m,cmp);
    	// for(int i=1;i<=m;i++)
    		// cerr<<a[i].s<<" "<<a[i].t<<" "<<a[i].m<<endl;
    	build(1,1,n);
    	for(int i=1;i<=m;i++)
    	{
    		int nw=min(ques(1,a[i].s,a[i].t),a[i].m);
    		if(nw)
    		{
    			update(1,a[i].s,a[i].t,-nw);
    			ans+=nw;
    		}
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    June. 26th 2018, Week 26th. Tuesday
    June. 25th 2018, Week 26th. Monday
    June. 24th 2018, Week 26th. Sunday
    June. 23rd 2018, Week 25th. Saturday
    June. 22 2018, Week 25th. Friday
    June. 21 2018, Week 25th. Thursday
    June. 20 2018, Week 25th. Wednesday
    【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)
    June.19 2018, Week 25th Tuesday
    June 18. 2018, Week 25th. Monday
  • 原文地址:https://www.cnblogs.com/lokiii/p/9246083.html
Copyright © 2011-2022 走看看