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 a
lim)break; if(q.size()
表示优先队列好好用,再也不用打堆了
孤独一生(sprung) (StandardIO)
Description
下课了,Polo来到球场,但他到了之后才发现…..被放了飞机……
无事可做的他决心找点乐子,比方说……跳台阶……
球场边有N个台阶拍成一行,第i个台阶的高度是Hi(0<Hi<=10^9),第0个台阶,也就是地面的高度为0。Polo打算把这N个台阶分成两个集合Sa,Sb(可以为空),对于一个台阶集合S={P1,P2,...P|S|},其中P1<P2<...<P|S|,他需要花费的体力值来完成。
现在他希望两次跳跃所需的总体力值最小,你能帮帮他吗?
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