noip10-04-14

选择困难症(perdant) (Standard IO)
Time Limits: 1000 ms  Memory Limits: 131072 KB     
Description

又到吃饭时间,Polo面对饭堂里琳(fei)琅(chang)满(keng)目(die)的各种食品,又陷入了痛苦的抉择中:该是吃手(jiao)打肉饼好呢,还是吃豆(cai)角(chong)肉片好呢?嗯……又不是天秤座怎么会酱紫呢?
具体来说,一顿饭由M个不同的部分组成(荤菜,素菜,汤,甜品,饮料等等),Polo要在每个部分中选一种作为今天的午饭。俗话说的好,永远没有免费的午餐,每种选择都需要有一定的花费。长者常常教导我们,便宜没好货,最便宜的选择估计比较坑爹,可囊中羞涩的Polo还要把钱省下来给某人买生日礼物,这该怎么办呢?
于是一个折中方案出来了:第K便宜的组合要花多少钱?这就要靠你了。

Input

第一行两个数M,K,含义如上所述。
接下来M行,先是一个整数Ai,表示第i个部分有多少种选择。接下来用空格分开的Ai个整数表示每种选择的价格。

Output

一行一个整数表示答案。
【样例解释】
    最便宜的选择是第一部分选择1块钱的,第二部分选择2块的。但由于第二部分里2块钱有两种不同的选择,所以第二便宜的总花费仍然是3块。

Sample Input

2 2
2 1 3
2 2 2

Sample Output

3

Data Constraint

因为只要保留k位数,所以一行行加过去,用优先队列存最大的比较,且队列中只保留k个数。

#include
#include
#include
#include


using namespace std;

typedef  long long ll;

priority_queue q;
ll f[11][500010];
ll b[100010];
ll i,j,k,a[11],po[11],m;

bool cmp(ll  a,ll b){
	return alim)break;
				if(q.size()

表示优先队列好好用,再也不用打堆了


孤独一生(sprung) (StandardIO)

Description

下课了,Polo来到球场,但他到了之后才发现…..被放了飞机……
无事可做的他决心找点乐子,比方说……跳台阶……
球场边有N个台阶拍成一行,第i个台阶的高度是Hi(0,第0个台阶,也就是地面的高度为0Polo打算把这N个台阶分成两个集合Sa,Sb(可以为空),对于一个台阶集合S={P1,P2,...P|S|},其中P1,他需要花费的体力值来完成。
现在他希望两次跳跃所需的总体力值最小,你能帮帮他吗?

Input

第一行一个数N
第二行N个整数Hi

Output

一行一个整数,表示最小的总体力值。

SampleInput

3
1 3 1

SampleOutput

4

DataConstraint

对于10%的数据N<=20
对于20%的数据N<=100
对于50%的数据N<=5000
对于100%的数据1<=N<=500000


分析这个问题可知全部台阶被两个集合分割成一段段的连续的区间,且相邻区间集合不同

sum[i]=sum[i-1]+|h[i]-h[i-1]|

g[i]=g[j]+sum[i-1]-sum[j]+|h[i]-h[j]|

此时时间复杂度为O(n^2)

可以用两棵线段树分别维护g[j]-sum[j]+h[j]

   g[j]-sum[j]-h[j]的值


为了确定对于h[i]    h[j]该是正的还是负的,我们需要离散化h数组并以离散化后的值来作为线段树的下标。

代码如下:

#include
#include
#include
#include

using namespace std;

typedef long long ll;

ll i,j,k,n,g[500010],p,sum[500010];
ll h[500010],disz[500010];
ll oo;
struct diz{
	ll v,p;
}z[500010];
struct ecc{
	ll T[2000010];
	void build(){
		memset(T,120,sizeof(T));
	}
	ll qry(ll i,ll j,ll l,ll r,ll k){
		if(i>r||j>1;
		if(j<=mid)return qry(i,j,l,mid,k*2);else
			if(i>mid)return qry(i,j,mid+1,r,k*2+1);else
				return min(qry(i,mid,l,mid,k*2),qry(mid+1,j,mid+1,r,k*2+1));
	}
	void ins(ll va ,ll disv,ll l,ll r,ll k){
		if(T[k]>va)T[k]=va;
		if(l==r&&l==disv)return;
		ll mid=(l+r)>>1;
		if(disv<=mid)ins(va,disv,l,mid,k*2);else
			ins(va,disv,mid+1,r,k*2+1);
	}

}a,b;

bool cmp(diz a ,diz b){
		return a.v



你可能感兴趣的:(noip10-04-14)