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 a 
        
          lim)break; if(q.size() 
          
         
       
      
      
     
     
    
    
   
   

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


孤独一生(sprung) (StandardIO)

Description

下课了,Polo来到球场,但他到了之后才发现…..被放了飞机……
无事可做的他决心找点乐子,比方说……跳台阶……
球场边有N个台阶拍成一行,第i个台阶的高度是Hi(0<Hi<=10^9),第0个台阶,也就是地面的高度为0Polo打算把这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 
          
        
       
       
      
      
     
     
    
    



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值