AC日记——餐巾计划问题 洛谷 P1084

餐巾计划问题

思路:

  氧气优化水过;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 4005
#define maxque 1000005
#define INF 0x7fffffff
#define ll long long
ll n,head[maxn],E[maxque],V[maxque],W[maxque],F[maxque];
ll pi,qt,qc,st,sc,s,t,cnt=1,day[maxn],pre[maxn],dis[maxn];
ll que[maxque],ans;
bool if_[maxn];
inline void in(ll &now)
{
    char Cget=getchar();now=0;
    while(Cget>‘9‘||Cget<‘0‘) Cget=getchar();
    while(Cget>=‘0‘&&Cget<=‘9‘)
    {
        now=now*10+Cget-‘0‘;
        Cget=getchar();
    }
}
inline void edge_add(ll u,ll v,ll w,ll f)
{
    E[++cnt]=head[u],V[cnt]=v,W[cnt]=w,F[cnt]=f,head[u]=cnt;
    E[++cnt]=head[v],V[cnt]=u,W[cnt]=-w,F[cnt]=0,head[v]=cnt;
}
bool spfa()
{
    for(ll i=s;i<=t;i++)dis[i]=INF,if_[i]=false,pre[i]=-1;
    ll h=maxque>>1,tail=h+1,now;que[h]=s,if_[s]=true,dis[s]=0;
    while(h<tail)
    {
        now=que[h++],if_[now]=false;
        for(ll i=head[now];i;i=E[i])
        {
            if(F[i]>0&&W[i]+dis[now]<dis[V[i]])
            {
                pre[V[i]]=i,dis[V[i]]=dis[now]+W[i];
                if(!if_[V[i]])
                {
                    if(dis[V[i]]<=dis[que[h]]&&h<tail) que[--h]=V[i];
                    else que[tail++]=V[i];
                    if_[V[i]]=true;
                }
            }
        }
    }
    return dis[t]!=INF;
}
int main()
{
    in(n),s=0,t=n*2+1;ll pos,now;
    for(ll i=1;i<=n;i++)in(day[i]);
    in(pi),in(qt),in(qc),in(st),in(sc);
    for(ll i=1;i<=n;i++)
    {
        edge_add(s,i,pi,INF);
        edge_add(i,t,0,day[i]);
        edge_add(s,i+n,0,day[i]);
        if(i+qt<=n) edge_add(i+n,i+qt,qc,INF);
        if(i+st<=n) edge_add(i+n,i+st,sc,INF);
        if(i!=n) edge_add(i+n,i+n+1,0,INF);
    }
    while(spfa())
    {
        now=t,pos=INF;
        while(pre[now]!=-1)
        {
            pos=min(pos,F[pre[now]]);
            now=V[pre[now]^1];
        }
        now=t,ans+=dis[t]*pos;
        while(pre[now]!=-1)
        {
            F[pre[now]]-=pos;
            F[pre[now]^1]+=pos;
            now=V[pre[now]^1];
        }
    }
    printf("%lld\n",ans);
    return 0;
}
时间: 2024-10-08 05:59:16

AC日记——餐巾计划问题 洛谷 P1084的相关文章

AC日记——联合权值 洛谷 P1351

题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离.对于图G 上的点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu ×Wv 的联合权值. 请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入输出格式 输入格式: 输入文件名为link .in. 第一行包含1 个整数n . 接下来n - 1 行,

AC日记——双栈排序 洛谷 P1155

双栈排序 思路: 二分图染+模拟: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #define maxm 2000005 int n,head[maxn],E[maxm],V[maxm],cnt,col[maxn]; int minn[maxn],ai[maxn],sta1[maxn],sta2[maxn],top1,top2; bool if_[maxn][maxn]; inline void in(

AC日记——松江1843路 洛谷七月月赛

松江1843路 思路: 三分: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define ll long long struct DataType { ll pi,val,sumval,sumpi; bool operator<(const DataType pos)const { return pi<pos.pi; } }; struct DataType ai[maxn]; ll

AC日记——[HAOI2015]树上操作 洛谷 P3178

题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a .操作 3 :询问某个节点 x 到根的路径中所有点的点权和. 输入输出格式 输入格式: 第一行包含两个整数 N, M .表示点数和操作数.接下来一行 N 个整数,表示树中节点的初始权值.接下来 N-1 行每行三个正整数 fr, to , 表示该树中存在一条边 (fr, to) .再接下来 M 行

AC日记——神奇的幻方 洛谷 P2615(大模拟)

题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. 之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N): 1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列: 2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行: 3.若(K−1)在第一行最后一列,则将K填在(K−1)

AC日记——逃离僵尸岛 洛谷 P3393

逃离僵尸岛 思路: spfa: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 200005 #define maxque 1800056 #define INF 1e12 #define ll long long ll n,m,E[maxque],V[maxque],cnt,

AC日记——封锁阳光大学 洛谷 P1330

封锁阳光大学 思路: bfs染色: 如果当前点能通往已染色的点则不能完成: 图不一定联通: 来,上代码: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 10005 #define maxm 200005 struct EdgeType {

AC日记——教辅的组成 洛谷 P1231

题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可以大致判断这是一本书还是练习册或答案,并且能够大致知道一本书和答案以及一本书和练习册的对应关系(即仅仅知道某书和某

AC日记——I Hate It 洛谷 P1531

题目背景 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 题目描述 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩 输入输出格式 输入格式: 第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目.学生ID编号分别从1编到N.第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i