比赛 |
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;
}