bzoj 4842: [Neerc2016]Delight for a Cat

Description

ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打隔膜

,因此一个小时内他只能选择睡觉或者打隔膜,当然他也必须选择睡觉或打隔膜,对于每一个小时,他选择睡觉或

打隔膜的愉悦值是不同的,对于第i个小时,睡觉的愉悦值为si,打隔膜的愉悦值为ei,同时又有一个奥妙重重的

规定:对于任意一段连续的k小时,ls必须至少有t1时间在睡觉,t2时间在打隔膜。那么ls想让他获得的愉悦值尽

量大,他该如何选择呢?

Input

第一行四个整数,n,k(1<=k<=n<=1000),t1,t2(0<=t1,t2<=k;t1+t2<=k),含义如上所述。

接下来一行n个整数,第i个整数si(0<=si<=1e9)表示睡觉的愉悦值。

接下来一行n个整数,第i个整数ei(0<=ei<=1e9)表示打隔膜的愉悦值。

Output

第一行输出最大的愉悦值。

接下来一行输出一个长度为n的字符串

第i个字符为E则代表第i小时在打隔膜,第i个字符为S则代表第i个小时在睡觉。

将每个点和每个长度D的区间看作边,限制条件看作流量上下界,差分建图,无源汇最大费用费用流

#include<cstdio>
#include<queue>
typedef long long i64;
const int N=50007;
const i64 inf=1ll<<60;
int n,k,L,R,as[N],bs[N];
int S,T,es[N],enx[N],ev[N],ec[N],e0[N],ep=2,pe[N];
i64 l[N],ans=0;
bool in[N];
std::queue<int>q;
void ae(int a,int b,int v,int c){
    if(!v)return;
    es[ep]=b;enx[ep]=e0[a];ev[ep]=v;ec[ep]=c;e0[a]=ep++;
    es[ep]=a;enx[ep]=e0[b];ev[ep]=0;ec[ep]=-c;e0[b]=ep++;
}
void mins(int&a,int b){if(a>b)a=b;}
bool sp(){
    for(int i=1;i<=T;++i)l[i]=-inf;
    l[S]=0;
    q.push(S);
    while(q.size()){
        int w=q.front();q.pop();
        for(int i=e0[w];i;i=enx[i])if(ev[i]){
            int u=es[i];
            if(l[u]<l[w]+ec[i]){
                l[u]=l[w]+ec[i];
                pe[u]=i;
                if(!in[u])in[u]=1,q.push(u);
            }
        }
        in[w]=0;
    }
    if(l[T]>-inf){
        int f=100000;
        for(int w=T,e;w!=S;w=es[e^1]){
            e=pe[w];
            mins(f,ev[e]);
        }
        for(int w=T,e;w!=S;w=es[e^1]){
            e=pe[w];
            ev[e]-=f;
            ev[e^1]+=f;
        }
        ans+=l[T]*f;
        return 1;
    }
    return 0;
}
int ee[N];
int main(){
    scanf("%d%d%d%d",&n,&k,&L,&R);
    R=k-R;
    for(int i=1;i<=n;++i)scanf("%d",as+i);
    for(int i=1;i<=n;++i)scanf("%d",bs+i);
    S=n-k+3;T=S+1;
    for(int i=1;i<=n-k+1;++i)ae(i,i+1,R-L,0);
    ae(1,T,L,0);
    ae(S,n-k+2,L,0);
    for(int i=1;i<=n;++i){
        ans+=bs[i];
        int x=i-k+1,y=i+1;
        if(x<1)x=1;
        mins(y,n-k+2);
        int c=as[i]-bs[i];
        if(c<=0)ee[i]=ep,ae(y,x,1,c);
        else{
            ae(y,T,1,0);
            ae(S,x,1,c);
            ee[i]=ep;
            ae(x,y,1,-c);
        }
    }
    while(sp());
    printf("%lld\n",ans);
    for(int i=1;i<=n;++i){
        int c=as[i]-bs[i];
        putchar((c<=0)==(!ev[ee[i]])?‘S‘:‘E‘);
    }
    return 0;
}
时间: 2024-08-07 07:22:02

bzoj 4842: [Neerc2016]Delight for a Cat的相关文章

【BZOJ4842】[Neerc2016]Delight for a Cat 线性规划+费用流

[BZOJ4842][Neerc2016]Delight for a Cat Description ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打隔膜,因此一个小时内他只能选择睡觉或者打隔膜,当然他也必须选择睡觉或打隔膜,对于每一个小时,他选择睡觉或打隔膜的愉悦值是不同的,对于第i个小时,睡觉的愉悦值为si,打隔膜的愉悦值为ei,同时又有一个奥妙重重的规定:对于任意一段连续的k小时,ls必须至少有t1时间在睡觉,t2时间在打隔膜.那么ls想让

Codeforces Gym 101190 NEERC 16 .D Delight for a Cat (上下界的费用流)

ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打隔膜 ,因此一个小时内他只能选择睡觉或者打隔膜,当然他也必须选择睡觉或打隔膜,对于每一个小时,他选择睡觉或 打隔膜的愉悦值是不同的,对于第i个小时,睡觉的愉悦值为si,打隔膜的愉悦值为ei,同时又有一个奥妙重重的 规定:对于任意一段连续的k小时,ls必须至少有t1时间在睡觉,t2时间在打隔膜.那么ls想让他获得的愉悦值尽 量大,他该如何选择呢? 题意:就是N天,每天可以选择S或者E,每一天S或者E有

【CF802C】Heidi and Library

CF的C题就这么难,自闭了. 题面 https://www.luogu.org/problem/CF802C 题解 除了秒切的,费用流题大体上分成2种: 从点的角度思考:流量守恒列方程,把方程看做点,把变量看成边,典型的有志愿者招募.Delight for a Cat. 从流的角度思考:一个流代表一个过程,典型的有餐巾计划问题和最长k可重区间集问题. 模型: 分类模型:可以看做最小割的加强版,如序列48分做法. 调整模型:方伯伯运椰子.球队收益. 从流的角度思考的一道好题,同时也是我的第一道最小

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

Linux常用命令(echo、date、ls、cd、history、cat)

一.linux常用命令有很多今天我们来总结一下常用的入门命令: 1.linux下关机命令:poweroff.init 0.halt.shutdown -h now 2.linux下重启命令:reboot.init 6.shutdown -r now 3.shutdown命令: 格式:shutdown  options TIME 其中options有以下几个: -r:执行重启 -c:取消shutdown命令 -h:执行关机 其中TIME有以下几个: now:表示现在 +m:相对时间表示法,从命令提

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

【BZOJ】[HNOI2009]有趣的数列

[算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为-1,做奇数标为+1,显然当偶数多于奇数时不合法,因为它压不住后面的奇数. 然后其实这种题目,打表就可知啦--QAQ 然后问题就是求1/(n+1)*C(2n,n)%p了,p不一定是素数. 参考bzoj礼物的解法. 看到网上清一色的素数筛+分解质因数解法,不解了好久,感觉写了假的礼物-- 后来觉得礼物的做法才比

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)

012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MB Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列