[bzoj2288][POJ Challenge]生日礼物

  用堆维护双向链表来贪心。。。

  数据范围显然不容许O(nm)的傻逼dp>_<。。而且dp光是状态就n*m个了。。显然没法优化

  大概就会想到贪心乱搞了吧。。。一开始想贪心地通过几段小的负数把正数连接成一段,但到底是要连接在一起还是直接扔掉不好判断

  然后就跑去翻题解了。。。题解讲的挺好的,连我都看懂了>_<。。题解网址:http://www.cnblogs.com/tuigou/p/4868127.html

  虽然选正数和负数的意义不同,但实际的操作都是把两边的数合并起来。还有就是,对于在左端或右端的负数,把它删去后并不会减少当前选取的段数。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstdlib>
 7 #include<cmath>
 8 #define ll long long
 9 using namespace std;
10 const int maxn=100233;
11 struct zs{
12     int id;
13 };
14 priority_queue <zs>q;
15 int a[maxn],cnt,pre[maxn<<1],next[maxn<<1],v[maxn<<1];
16 int i,j,n,m,zsnum,ans;
17 bool del[maxn<<1];
18
19 int ra,fh;char rx;
20 inline int read(){
21     rx=getchar(),ra=0,fh=1;
22     while((rx<‘0‘||rx>‘9‘)&&rx!=‘-‘)rx=getchar();
23     if(rx==‘-‘)fh=-1,rx=getchar();
24     while(rx>=‘0‘&&rx<=‘9‘)ra*=10,ra+=rx-48,rx=getchar();return ra*fh;
25 }
26 bool operator <(zs a,zs b){return abs(v[a.id])>abs(v[b.id]);}
27 int main(){
28     n=read(),m=read();if(!m){puts("0");return 0;}
29     for(i=1;i<=n;i++)a[i]=read();cnt=0;
30     for(i=1;i<=n;v[cnt]+=a[i++])
31         if((ll)a[i]*(ll)v[cnt]<0||!cnt)cnt++;
32     for(i=1;i<=cnt;i++)if(v[i]>0)zsnum++,ans+=v[i];
33     if(zsnum>m){
34         for(i=1;i<=cnt;i++)q.push((zs){i}),pre[i]=i-1,next[i]=i+1;//,printf("  %d",v[i]);puts("");
35         pre[1]=next[cnt]=0;
36         for(i=zsnum-m;i;i--){
37             while(!q.empty()&&del[q.top().id])q.pop();if(q.empty())break;
38             int x=q.top().id,pr=pre[x],nex=next[x];
39
40             q.pop(),ans-=abs(v[x]),del[x]=1;
41             if(!(pr&&nex)){
42                 if(v[x]<0)i++,ans+=abs(v[x]);
43                 if(pr)next[pr]=0;if(nex)pre[nex]=0;
44             }
45             else{
46                 del[pr]=del[nex]=1;
47                 v[++cnt]=v[pr]+v[x]+v[nex];
48                 q.push((zs){cnt});
49                 if(pre[pr])pre[cnt]=pre[pr],next[pre[cnt]]=cnt;
50                 if(next[nex])next[cnt]=next[nex],pre[next[cnt]]=cnt;
51             }
52         }
53     }
54     printf("%d\n",ans);
55     return 0;
56 }

时间: 2024-10-12 22:14:27

[bzoj2288][POJ Challenge]生日礼物的相关文章

BZOJ2288: 【POJ Challenge】生日礼物

2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 771  Solved: 238[Submit][Status][Discuss] Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知道选择元素之和的最大值.你能帮助她吗? Input

【BZOJ 2288】 2288: 【POJ Challenge】生日礼物 (贪心+优先队列+双向链表)

2288: [POJ Challenge]生日礼物 Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知道选择元素之和的最大值.你能帮助她吗? Input 第1行,两个整数 N (1 ≤ N ≤ 105) 和 M (0 ≤ M ≤ 105), 序列的长度和可以选择的部分. 第2行, N 个整数 A1, A2, ..., AN (0

2292: 【POJ Challenge 】永远挑战

2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 553  Solved: 230[Submit][Status][Discuss] Description lqp18_31和1tthinking经常出题来虐ftiasch.有一天, lqp18_31搞了一个有向图,每条边的长度都是1. 他想让ftiasch求出点1到点 N 的最短路."水题啊.", ftiasch这么说道. 所以1tth

bzoj2287【POJ Challenge】消失之物(dp+补集转化,好题)

2287: [POJ Challenge]消失之物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 657  Solved: 382[Submit][Status][Discuss] Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢?” -- 这是经典的问题了.她把答案记为 Count(

BZOJ2295: 【POJ Challenge】我爱你啊

2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 126  Solved: 90[Submit][Status] Description ftiasch是个十分受女生欢迎的同学,所以她总是收到许多情书.虽然她十分有魅力,然而她却是个低调的人.因此她从来不会告诉别人她到底收到了多少情书. ftiasch的好朋友1tthinking想知道她到底收到了多少情书.1tthinking知道,ftiasch每次收

BZOJ2292: 【POJ Challenge 】永远挑战

2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 513  Solved: 201[Submit][Status] Description lqp18_31和1tthinking经常出题来虐ftiasch.有一天, lqp18_31搞了一个有向图,每条边的长度都是1. 他想让ftiasch求出点1到点 N 的最短路."水题啊.", ftiasch这么说道. 所以1tthinking把某些

BZOJ2287: 【POJ Challenge】消失之物

2287: [POJ Challenge]消失之物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 254  Solved: 140[Submit][Status] Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢?” -- 这是经典的问题了.她把答案记为 Count(i, x) ,想要

BZOJ2293: 【POJ Challenge】吉他英雄

2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 80  Solved: 59[Submit][Status] Description 1tthinking 特别喜欢玩‘guitar hero’. 现在有 N (2 ≤ N ≤ 50) 首歌在这个游戏中,他们被标为 1 到 N. 游戏会随机把歌曲分组 P. 更详细的说, 对于 P = <P1, P2, ... PN>, 游戏会在第 i 首之后播放第

BZOJ 2287 【POJ Challenge】消失之物

2287: [POJ Challenge]消失之物 Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢?” -- 这是经典的问题了.她把答案记为 Count(i, x) ,想要得到所有1 <= i <= N, 1 <= x <= M的 Count(i, x) 表格. Input 第1行:两个整数 N (1 ≤ N ≤ 2