比赛 EYOI与SBOI开学欢乐赛1st 评测结果 AAAAWATTTT
题目名称 芳姐零食部 最终得分 50
用户昵称 ZRQ 运行时间 4.402 s
代码语言 C++ 内存使用 11.74 MiB
提交时间 2022-08-29 21:22:29
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=1e5+10,INF=0x3f3f3f3f;
bool vis[N];
int n;
int a,b,dis[N];
long long ans;
int hd[N],nt[N<<3],e[N<<3],w[N<<3],c[N<<3],idx=1,fr[N],flw,st,ed,incf[N];
char ch;
inline void read(int &x){x=0;ch=getchar();while(ch<48||ch>57)ch=getchar();while(ch>47&&ch<58)x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return;}
void add(int x,int y,int u,int v)
{
	nt[++idx]=hd[x],hd[x]=idx,e[idx]=y,w[idx]=u,c[idx]=v;
	nt[++idx]=hd[y],hd[y]=idx,e[idx]=x,w[idx]=-u,c[idx]=0;
}
bool SPFA()
{
    queue<int> q;
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    dis[st]=0;
    incf[st]=INF;
    q.push(st);
    while(!q.empty())
    {
        int now=q.front();
        q.pop();
        vis[now]=0;
        for(int i=hd[now];i;i=nt[i])
        {
            int next=e[i];
            if(c[i]&&dis[now]+w[i]<dis[next])
            {
                dis[next]=dis[now]+w[i];
                incf[next]=min(incf[now],c[i]);
                fr[next]=i;
                if(!vis[next])
                {
                    vis[next]=1;
                    q.push(next);
                } 
            }
        }
    }
    if(dis[ed]==INF) return 0;
    ans+=(long long)incf[ed]*dis[ed];
    return 1;
}
void updata()
{
    int x=ed;
    while(x!=st)
    {
        int i=fr[x];
        c[i]-=incf[ed];
        c[i^1]+=incf[ed];
        x=e[i^1];
    }
    return ;
}
int main()
{
	freopen("snack.in","r",stdin);
	freopen("snack.out","w",stdout);
	read(n);
	st=n+1,ed=n+2;
	for(int i=1;i<=n;++i)
	{
		read(a),read(b);
		add(st,i,0,a);
		add(i,ed,0,b);
		if(i==n) add(n,1,1,INF);
		else add(i,i+1,1,INF);
		if(i==1) add(1,n,1,INF);
		else add(i,i-1,1,INF);
	}
	while(SPFA()) updata();
	printf("%lld\n",ans);
	return 0;
}