题意

长度为\(n(1 \le n \le 1000000)\)的账单,\(+\)表示存1,\(-\)表示取1,任意时刻存款不会为负。初始有\(p\),最终有\(q\)。每一次可以耗时\(x\)将某位取反,耗时\(y\)将最后一个移到最前面,求最小耗时使得账单正确。

分析

首先很显然最终\(+\)和\(-\)的数目是可以确定的。

所以我们把账单按照每一个开头扫一遍就行了。

题解

将账单拓展成\(2n\),然后从\(2\)扫到\(n+1\),求以这个开头的最小费用。

对于\(i\)开头的,我们只需要在\(i\)到\(i+n-1\)的账单修改成数目正确的\(+\)和数目正确的\(-\)即可。怎么修改呢?目前我们只需要保证不会出现负数即可。也就是前缀和中没有负数。所以我们找到第一个前缀和最小的位置\(j\)。如果\(s_j\)小于0,则表示在\(i\)到\(j\)需要将\(\left \lceil \frac{-s_j}{2} \right \rceil\)个负的改成正的。然后再根据\(+\)和\(-\)的最终个数和当前个数计算一下费用即可。

求一个区间的最小值可以用单调队列,所以复杂度\(O(n)\)

#include <bits/stdc++.h>
using namespace std;
inline int getint() {
int x=0, c=getchar();
for(; c<48||c>57; c=getchar());
for(; c>47&&c<58; x=x*10+c-48, c=getchar());
return x;
}
const int N=100005;
int a[N], b[N], s[35], c[35];
int main() {
int n=getint(), m=getint();
for(int i=1; i<=n; ++i) {
a[i]=getint();
}
for(int i=1; i<=m; ++i) {
b[i]=getint();
}
sort(b+1, b+1+m);
int tot=0;
for(int i=1; i<=m; ++i) {
if(b[i]!=b[i-1]) {
b[++tot]=b[i];
}
++s[tot];
}
for(int i=1; i<=n; ++i) {
for(int j=tot; j; --j) {
c[j]+=a[i]/b[j];
a[i]%=b[j];
}
}
int ans=0;
for(int i=1; i<=tot; ++i) {
for(int j=i+1; j<=tot && s[i]>c[i]; ++j) {
int cost=b[j]/b[i], rest=s[i]-c[i], need=(rest+cost-1)/cost;
if(need<=c[j]) {
c[j]-=need;
rest=(need*cost-rest)*b[i];
c[i]=s[i];
for(int k=j; k>i; --k) {
c[k]+=rest/b[k];
rest%=b[k];
}
}
else {
c[i]+=c[j]*cost; c[j]=0;
}
}
ans+=min(s[i], c[i]);
}
printf("%d\n", ans);
return 0;
}

【BZOJ】1119: [POI2009]SLO的更多相关文章

  1. 【BZOJ 1119】 1119: [POI2009]SLO (置换)

    1119: [POI2009]SLO Description 对于一个1-N的排列(ai),每次你可以交换两个数ax与ay(x<>y),代价为W(ax)+W(ay) 若干次交换的代价为每次 ...

  2. 【BZOJ】1135: [POI2009]Lyz

    题意 有\(1\)到\(n(1 \le n \le 200000)\)号的溜冰鞋各\(k(1 \le k \le 10^9)\)双.已知\(x\)号脚的人可以穿\(x\)到\(x+d\)的溜冰鞋. 有 ...

  3. 【BZOJ】1115: [POI2009]石子游戏Kam

    http://www.lydsy.com/JudgeOnline/problem.php?id=1115 题意:n堆石子,个数是从左到右单增.每一次可以从任意堆取出任意石子,但要保持单增这个性质.问先 ...

  4. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  5. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  6. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  7. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  8. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  9. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

随机推荐

  1. asmlinkage

    转自:http://www.cnblogs.com/china_blue/archive/2010/01/15/1648523.html 声明,仅为了便于自己记忆和查询,非原创,摘自:http://b ...

  2. Delphi中uses在interfeace和implementation中的区别

    use单元引入分为在interface中引入,如 interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Co ...

  3. 在ASP.NET 5中如何方便的添加前端库

    (此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注.) 题记:ASP.NET 5和之前的ASP.NET版本有很大的不同,其中之一就是对前端库的管理不再使用Nuget,而 ...

  4. 用ajax和js怎么做出滚动条滚到最下面分页

    获取滚动条位置(scrollTop) 获取可视窗口高度(viewportHeight) 获取整个页面可滚动高度(scrollHeight) 当scrollTop+viewportHeight==scr ...

  5. 【前台页面 BUG】回车按钮后,页面自动跳转

    点击回车按钮后,页面自动的迅速跳转 原因: 表单隐式提交了. 解决方法: 在方法执行完成后,加上return false; 代码如下: /** * 注册按钮的点击事件 */ $("#regi ...

  6. svn代码提交注意事项

    先全部add,查看是否有gen和bin,然后再忽略这两个,忽略时选择最后rescury....

  7. jsp遍历、循环

    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 1. <% Te ...

  8. 编解码-marshalling

    JBoss的Marshalling序列化框架,它是JBoss内部使用的序列化框架,Netty提供了Marshalling编码和解码器,方便用户在Netty中使用Marshalling. JBoss M ...

  9. javascript优化--12模式(设计模式)03

    观察者模式 通过创建一个可观察的对象,当发生一个感兴趣的事件时将该事件通告给所有观察者,从而形成松散的耦合 订阅杂志 //发布者对象 var publisher = { subscribers: { ...

  10. 如何定义移动端字体Font-Family?

    1.对于IOS 手机系统,默认中文字体是Heiti SC.默认英文字体是Helvetica.默认数字字体是HelveticaNeue.无微软雅黑字体: 2.对于Android 手机系统,默认中文字体是 ...