【BZOJ】3502 PA2012 Tanie linie
【算法】贪心,一般DP
【题解】
---
胡策k≤10的环状DP做法:
1.钦定法:先确定第一位(可能和第n位)的状态,然后后面正常做DP,显然正确答案是一定会被记录的,因为从整体上看不会有影响。
2.环的特性:取的段和不取的段数量相等,位置互补。所以1和n的连接处都选或都不选都会有不被包括的情况,一选一不选就和链一样了。
---
正解贪心:
因为相邻的正数或相邻的负数肯定是要选一起选,所以点缩成正负正负…的数列形式,那么考虑先选择全部正的。
如果选择的段数过多,考虑删除则有两种选择:舍弃一个正数(相当于舍弃一个正数和两个负数,把这三个数视为一个负数),选择一个负数(相当于选择一个负数和两个正数,把这三个数视为一个正数)。
那么显然这两种行为是等价的:都是合并相邻的三个数字,可以视为对绝对值最小的数字操作最优,然后过程中用堆动态维护即可。
非环的情况特殊处理:不可能选择头尾的负数,因为没办法合并两个正数,过程中需要判断这个,而且这个头尾还会变化。
对拍还是查找错误相当重要的方式!考试一定要写暴力拍!
据说可以开头特判一些东西跳掉没用的数据——数据是死的,人是活的,出题人是懒的。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=; long long a[maxn],n,m,k,b[maxn],pre[maxn],suc[maxn];
bool f[maxn];
struct cyc
{
long long num,ord;
bool p;
bool operator <(const cyc &a) const
{
return num>a.num;
}
}qp;
priority_queue<cyc>q;
int main()
{ // freopen("input","r",stdin); scanf("%lld%lld",&n,&k);
bool now=;long long tot,m=;
long long ans=;
scanf("%lld",&a[]);
b[(tot=)]=a[];now=a[]>;
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]);
if(a[i]>&&!now)
{
now=;
b[++tot]=a[i];
}
else if(a[i]<=&&now)
{
now=;
b[++tot]=a[i];
}
else b[tot]+=a[i];
}
// if((b[tot]>0)==(b[1]>0)&&tot!=1){b[1]+=b[tot];tot--;}//操作顺序
for(int i=;i<=tot;i++)
{
pre[i]=i-;suc[i]=i+;
if(b[i]>){ans+=b[i];m++;}
q.push((cyc){(b[i]>?b[i]:-b[i]),i,b[i]>});
}
// pre[1]=tot;suc[tot]=1;
suc[tot]=;
long long en=tot,be=;
for(int i=m;i>k;i--)
{
while(f[q.top().ord]||((q.top().ord==be||q.top().ord==en)&&!q.top().p))q.pop();
qp=q.top();q.pop();
long long sum=;long long A=pre[qp.ord],B=suc[qp.ord];
if(qp.p)sum=qp.num+b[A]+b[B];
else sum=b[A]+b[B]-qp.num;
ans-=qp.num;
if(suc[pre[A]])suc[pre[A]]=qp.ord;pre[qp.ord]=pre[A];
if(pre[suc[B]])pre[suc[B]]=qp.ord;suc[qp.ord]=suc[B];
f[A]=f[B]=;b[qp.ord]=sum;
//printf("ord=%lld num=%lld sum=%lld\n",qp.ord,qp.num,sum);
if(B==en)en=qp.ord;
if(A==be)be=qp.ord;
q.push((cyc){(sum>?sum:-sum),qp.ord,sum>});
}
printf("%lld",ans);//开long long
return ;
}
【BZOJ】3502 PA2012 Tanie linie的更多相关文章
- 【BZOJ3502/2288】PA2012 Tanie linie/【POJ Challenge】生日礼物 堆+链表(模拟费用流)
[BZOJ3502]PA2012 Tanie linie Description n个数字,求不相交的总和最大的最多k个连续子序列. 1<= k<= N<= 1000000. Sam ...
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- 【BZOJ】1013: [JSOI2008]球形空间产生器sphere
[BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...
- 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
- 【BZOJ】【3083】遥远的国度
树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...
- 【BZOJ】【2434】【NOI2011】阿狸的打字机
AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...
- 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法
整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...
随机推荐
- java---Map接口实现类
Map是一个双列集合接口,如果实现了Map接口,特点是数据以键值对形式存在,键不可重复,值可以重复.java中主要有HashMap.TreeMap.Hashtable.本文主要介绍Map的接口方法: ...
- ACM 第七天
水题 B - Minimum’s Revenge There is a graph of n vertices which are indexed from 1 to n. For any pair ...
- Redis的概述和简单使用(转载)
文章来源:http://jingyan.baidu.com/article/db55b60996d0124ba30a2f92.html Redis是一个基于key-value的高速缓存系统,类似于me ...
- SFTPHelper
public class SFTPHelper { #region 字段或属性 private readonly SftpClient _sftp; /// <summary> /// S ...
- xpath获取块元素下<br>下的信息
再爬虫取字段的时候遇到一种类似下面的结构: <p> <br> "通用名称:xxxxxx" </p> 用xpath取的方式://p//text() ...
- Flink的序列化与flink-hadoop-compatibility
最近 用户提交了一个问题 说他的jar包里明明包含相关的类型 但是在提交Flink作业的时候 却报出classnotfound的错误 查看之后发现 这里是flink的一个没有说的太明白的地方 用户的代 ...
- 利用FluidMoveBehavior制作出手机通讯录平滑的效果
最近学习Blend,原来Blend制作动画等效果非常棒.下面演示一下FluidMoveBehavior应用,利用Blend中行为中的FluidMoveBehavior制作出手机通讯录平滑的效果 1.在 ...
- java 文本读取 写入指定长度的内容
- HUAS 1482 lsy的后宫(DP+矩阵快速幂)
这道题的DP是很好想的,令dp[i][j]表示第i个位置摆第j种妹子的方法数,j为0表示不摆妹子的方法数. dp[i][j]=sigma(dp[i-1][k])(s[j][k]!='1').容易看出这 ...
- openstack之keystone部署
前言 openstack更新频率是挺快的,每六个月更新一次(命名是是以A-Z的方式,Austin,Bexar...Newton).博主建议大家先可一种版本研究,等某一版本研究透彻了,在去研究新的版本. ...