zoukankan      html  css  js  c++  java
  • [Usaco2005 oct]Flying Right 飞行航班

    Description
    为了表示不能输给人类,农场的奶牛们决定成立一家航空公司.她们计划每天早晨,从密歇根湖湖岸的最北端飞向最南端,晚上从最南端飞往最北端.在旅途中,航空公司可以安排飞机停在某些机场.他们需要你帮助来决定每天携带哪些旅客.沿着湖岸,有N(1≤N≤10000)个由北至南编号为1到N的农场.每个农场都有一个机场.这天,有k(l≤七≤50000)群牛想要乘坐飞机旅行.每一群牛想要从一个农场飞往另一个农场.航班可以在某些农场停下带上部分或全体的牛.奶牛们登机后会一直停留直至达到目的地 提供给你飞机的容量C(1≤C≤100),同时提供给你想要旅行的奶牛的信息,请你计算出这一天的航班最多能够满足几只奶牛的愿望.

    Input
    第1行:3个用空格隔开的整数K,N和C.
    第2到K+1行:每一行有3个用空格隔开的整数S,E,M.表示有M只奶牛想从农场S乘飞机到农场E.

    Output
    可以完成旅行的奶牛人数的最大值.

    Sample Input
    4 8 3
    1 3 2
    2 8 3
    4 7 1
    8 3 2

    Sample Output
    6


    双倍经验题啊,参考[Usaco2009 Feb]庙会捷运Fair Shuttle,来回一趟,翻倍就好了啊

    /*program from Wolfycz*/
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define inf 0x7f7f7f7f
    using namespace std;
    typedef long long ll;
    typedef unsigned int ui;
    typedef unsigned long long ull;
    inline int read(){
    	int x=0,f=1;char ch=getchar();
    	for (;ch<'0'||ch>'9';ch=getchar())	if (ch=='-')    f=-1;
    	for (;ch>='0'&&ch<='9';ch=getchar())	x=(x<<1)+(x<<3)+ch-'0';
    	return x*f;
    }
    inline void print(int x){
    	if (x>=10)	print(x/10);
    	putchar(x%10+'0');
    }
    const int N=1e4,M=5e4;
    int n,m,K,Ans;
    struct S1{
    	int l,r,v;
    	void insert(int _l,int _r,int _v){l=_l,r=_r,v=_v;}
    	bool operator <(const S1 &x)const{return r!=x.r?r<x.r:l>x.l;}
    }A[M+10];
    struct Segment{
    	#define ls (p<<1)
    	#define rs (p<<1|1)
    	int tree[(N<<3)+10],Lazy[(N<<3)+10];
    	Segment(){
    		memset(tree,0,sizeof(tree));
    		memset(Lazy,0,sizeof(Lazy));
    	}
    	void build(int p,int l,int r){
    		tree[p]=K;
    		if (l==r)	return;
    		int mid=(l+r)>>1;
    		build(ls,l,mid),build(rs,mid+1,r);
    	}
    	void Add_tag(int p,int v){tree[p]+=v,Lazy[p]+=v;}
    	void pushdown(int p){
    		if (!Lazy[p])	return;
    		Add_tag(ls,Lazy[p]);
    		Add_tag(rs,Lazy[p]);
    		Lazy[p]=0;
    	}
    	void Modify(int p,int l,int r,int x,int y,int v){
    		if (x<=l&&r<=y){
    			Add_tag(p,v);
    			return;
    		}
    		pushdown(p);
    		int mid=(l+r)>>1;
    		if (x<=mid)	Modify(ls,l,mid,x,y,v);
    		if (y>mid)	Modify(rs,mid+1,r,x,y,v);
    		tree[p]=min(tree[ls],tree[rs]);
    	}
    	int Query(int p,int l,int r,int x,int y){
    		if (x<=l&&r<=y)	return tree[p];
    		pushdown(p);
    		int mid=(l+r)>>1,res=inf;
    		if (x<=mid)	res=min(res,Query(ls,l,mid,x,y));
    		if (y>mid)	res=min(res,Query(rs,mid+1,r,x,y));
    		return res;
    	}
    }Tree;
    int main(){
    	n=read(),m=read()<<1,K=read();
    	for (int i=1;i<=n;i++){
    		int x=read(),y=read(),z=read();
    		if (x<y)	A[i].insert(x,y-1,z);
    		else	A[i].insert(m-x,m-y-1,z);
    	}
    	sort(A+1,A+1+n);
    	Tree.build(1,1,m);
    	for (int i=1;i<=n;i++){
    		int tmp=min(A[i].v,Tree.Query(1,1,m,A[i].l,A[i].r));
    		Tree.Modify(1,1,m,A[i].l,A[i].r,-tmp),Ans+=tmp;
    	}
    	printf("%d
    ",Ans);
    	return 0;
    }
    
  • 相关阅读:
    read、readline、readlines和linecache的使用
    无法启用internet连接共享,为LAN连接配置的IP地址需要使用自动IP寻址
    虚拟机pycharm
    Ubuntu安装谷歌浏览器
    pandas dataframe重复数据查看.判断.去重
    git 删除误上传的.idea文件
    python logger日志通用配置文件
    pyinstaller打包python文件成exe(原理.安装.问题)
    SSH 免密登录服务器
    homebrew安装和解决brew安装速度慢的问题
  • 原文地址:https://www.cnblogs.com/Wolfycz/p/9715669.html
Copyright © 2011-2022 走看看