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有自己的收益,求最大收益,且满足每个连续K天,只是有Ms天选择了S,Me天选择了E。

输出最大收益,以及对应的方案。

思路:和上一题有点像,不过加了下界,问题不大,直接去看题解就好了。

只需要把相邻的边容量改为最大-最小即可。 对于输出方案,只需要看对应的流是否用掉即可。

#include<bits/stdc++.h>
#define ll long long
#define maxn 1010
#define inf 1<<30
using namespace std;
int To[maxn<<2],Laxt[maxn],Next[maxn<<2],cap[maxn<<2],cost[maxn<<2],tag[maxn];
int N,S,T,cnt=1;  ll dis[maxn],ans;//费用
bool inq[maxn],vis[maxn];
deque<int>q;
void add(int u,int v,int c,int cc)
{ Next[++cnt]=Laxt[u];Laxt[u]=cnt;To[cnt]=v;cap[cnt]=c;cost[cnt]=cc; }
bool spfa()
{
    memset(inq,0,sizeof(inq));
    for(int i=0;i<=T;i++) dis[i]=1LL<<40;
    inq[T]=1; dis[T]=0; q.push_back(T);
    while(!q.empty())
    {
        int u=q.front(); q.pop_front();
        inq[u]=0;
        for(int i=Laxt[u];i;i=Next[i])
        {
            int v=To[i];
            if(cap[i^1]&&dis[v]>dis[u]-cost[i])
            {
                dis[v]=dis[u]-cost[i];
                if(!inq[u]){
                    inq[v]=1;
                    if(q.empty()||dis[v]>dis[q.front()]) q.push_back(v);
                    else q.push_front(v);
                }
            }
        }
    }
    return dis[S]<(1LL<<40);
}
int dfs(int u,int flow)
{
    vis[u]=1;
    if(u==T||flow==0) return flow;
    int tmp,delta=0;
    for(int i=Laxt[u];i;i=Next[i])
    {
        int v=To[i];
        if((!vis[v])&&cap[i]&&dis[v]==dis[u]-cost[i])
        {
            tmp=dfs(v,min(cap[i],flow-delta));
            delta+=tmp; cap[i]-=tmp; cap[i^1]+=tmp;
        }
    }
    return delta;
}
int s[maxn],e[maxn];
int main()
{
    int N,K,mn,mx,ans=0,i;
    scanf("%d%d%d%d",&N,&K,&mx,&mn);
    for(i=1;i<=N;i++) scanf("%d",&s[i]),ans+=s[i];
    for(i=1;i<=N;i++) scanf("%d",&e[i]),e[i]-=s[i];
    mx=K-mx; S=0; T=N+1;
    add(S,1,mx,0); add(1,S,0,0);
    for(i=1;i<=N;i++) add(i,i+1,mx-mn,0),add(i+1,i,0,0);
    for(i=1;i<=N;i++) add(i,i+K>N?T:i+K,1,-e[i]),tag[i]=cnt,add(i+K>N?T:i+K,i,0,e[i]);
    while(spfa()){
        vis[T]=1;
        while(vis[T]){
            memset(vis,0,sizeof(vis));
            int tmp=dfs(S,inf);
            ans-=(ll)tmp*dis[S];
        }
    }
    printf("%I64d\n",ans);
    for(i=1;i<=N;i++)
       if(cap[tag[i]]) putchar(‘S‘);
       else putchar(‘E‘);
    return 0;
}

原文地址:https://www.cnblogs.com/hua-dong/p/9392290.html

时间: 2024-10-05 05:04:48

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

【模拟】ECNA 2015 I What&#39;s on the Grille? (Codeforces GYM 100825)

题目链接: http://codeforces.com/gym/100825 题目大意: 栅栏密码.给定N(N<=10),密钥为一个N*N的矩阵,'.'代表空格可以看到,'X'代表被遮挡,还有密文字符串S,长度为N*N 每次将这个矩阵顺时针旋转90°,把矩阵中空格对应的位置按照从上到下从左到右的顺序依次填充上密文字符,求最终这个密文字符能否填满N*N的矩阵,能按顺序输出得到的答案,不能输出"invalid grille" 题目思路: [模拟] 直接模拟即可.旋转的坐标公式很好推.

Codeforces Gym 101190M Mole Tunnels - 费用流

题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\right\rfloor$个巢穴连通.第$i$个巢穴在最终时允许$c_i$只醒来的鼹鼠最终停留在这.已知第$i$只鼹鼠在第$p_i$个巢穴睡觉.要求求出对于每个满足$1 \leqslant k \leqslant n$的$k$,如果前$k$只鼹鼠醒来,最小的移动距离的总和. 考虑费用流的建图和暴力做法,把原图的

Codeforces gym Hello 2015 Div1 B and Div2 D

Codeforces gym 100571 problem D Problem 给一个有向图G<V,E>和源点S,边的属性有长度L和颜色C,即E=<L,C>.进行Q次询问,每次给定一个点X,输出S到X的最短路的长度(不存在则输出 -1).但要求S到X的路径中相邻两条边颜色不一样. Limits Time Limit(ms): 1000 Memory Limit(MB): 256 |V|, |E|: [1, 10^5] X, S: [1, |V| ] L: [1, 10^9] |C|

Codeforces gym Hello 2015 Div1 E

Codeforces gym 100570 problem E (一种处理动态最长回文子串问题的方法) Problem 给一个长度为N的字符串S,字符集是'a'-'z'.进行Q次操作,操作分三种.一,修改位置X的字符为C:二,查询以P位置为中心的最长回文子串的长度,并输出:三,查询以P与P+1的中间位置为中心的最长回文子串的长度,并输出. More 第二种操作子串长度为奇数,一定存在:第三种操作子串长度为偶数,若不存在,输出 -1. Limits Time Limit(ms): 4000(1s足

Codeforces gym Hello 2015 Div1 C and Div2 E

Codeforces gym 100570 problem C Codeforces gym 100571 problem E Problem 给一个N行M列的矩阵Ma,进行Q次(Q<=10)查询,每次给定一个K,问有多少子矩阵,满足最大值max - 最小值min <=K. Limits Time Limit(ms): 8000 Memory Limit(MB): 512 N, M: [1, 400] Q: [1, 10] Ma(i, j), K: [1, 10^9] Solution (Th

Codeforces Gym 100002 E &quot;Evacuation Plan&quot; 费用流

"Evacuation Plan" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100002 Description The City has a number of municipal buildings and a number of fallout shelters that were build specially to hide municipal workers in case 

Codeforces gym Hello 2015 Div2 B

Codeforces gym 100571 problem B Problem 设函数F(x),F(1)与F(2)已知,且当 i>=3,F(i)=a*F(i-2)+b*F(i-1).再给一个长度为N的数列A,进行Q次如下操作:每次给一个区间[L, R],对于每个k(L=<k<=R),将A[k]=A[k]+F[k-L+1].最后输出数列A(mod 10^9+7). Limits Time Limit(ms): 1000 Memory Limit(MB): 256 N, Q: [1, 10^

Codeforces Gym - 101147J Whistle&#39;s New Car

Discription Statements Whistle has bought a new car, which has an infinite fuel tank capacity. He discovered an irregular country since it has n cities and there are exactly n?-?1roads between them, of course, all cities are connected. He is so much

Codeforces Gym 101174 A Within Arm&#39;s Reach 贪心 手臂

#include<iostream> #include<stdio.h> #include <string.h> #include <algorithm> #include <vector> #include <math.h> using namespace std; #define LL long long const int maxn=25; double a[maxn],l[maxn],r[maxn]; double ex,ey