QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#673703 | #9315. Rainbow Bracket Sequence | HHCY | TL | 0ms | 0kb | C++20 | 3.3kb | 2024-10-25 09:11:30 | 2024-10-25 09:11:30 |
answer
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define i64 int64_t
using namespace std;
struct MCFGraph{
struct E{
int v,c,f;
E(int v,int c,int f):v(v),c(c),f(f){}
};
int n;
vector<E> e;
vector<vector<int>> g;
vector<i64> h,dis;
vector<int> pre;
int S,T;//
vector<int> M;//
const int INF=300*50*2;//
bool dijstra(int s,int t){
dis.assign(n+1,numeric_limits<i64>::max());
pre.assign(n+1,-1);
priority_queue<pair<i64,int>,vector<pair<i64,int>>,greater<pair<i64,int>>> que;
dis[s]=0;
que.emplace(0,s);
while(!que.empty()){
i64 d=que.top().first;
int u=que.top().second;
que.pop();
if(dis[u]<d)continue;
for(int i:g[u]){
int v=e[i].v,c=e[i].c,f=e[i].f;
if(c>0&&dis[v]>d+h[u]-h[v]+f){
dis[v]=d+h[u]-h[v]+f;
pre[v]=i;
que.emplace(dis[v],v);
}
}
}
return dis[t]!=numeric_limits<i64>::max();
}
void init(int n){//
this->n=n+2,S=n+1,T=n+2;
g.resize(n+3);M.assign(n+1,0);
}
//(附加)S=n+1,T=n+2,即初始化不用算附加源汇点
i64 limCost=0;//
void addEdge(int u,int v,int l,int r,int f){//
limCost+=(i64)l*f;
if(l<r)add(u,v,r-l,f);
M[u]-=l,M[v]+=l;
}
void add(int u,int v,int c,int f){
g[u].push_back(e.size());
e.emplace_back(v,c,f);
g[v].push_back(e.size());
e.emplace_back(u,0,-f);
}
pair<bool,i64> flowST(int s,int t){//
for(int i=1;i<=n-2;++i)
if(M[i]>0)add(S,i,M[i],0);
else if(M[i]<0)add(i,T,-M[i],0);
add(t,s,INF,0);//无源汇则不需要这行,函数里也不用参数s,t
i64 res=flow(S,T).second;
res+=limCost;
return make_pair(feasibility(),res);
}
bool feasibility(){
for(auto i:g[S])if(e[i].c)return false;
return true;
}
pair<int,i64> flow(int s,int t){
int flow=0;
i64 cost=0;
h.assign(n+1,0);
while(dijstra(s,t)){
for(int i=1;i<=n;++i)h[i]+=dis[i];
int aug=numeric_limits<int>::max();
for(int i=t;i!=s;i=e[pre[i]^1].v)aug=min(aug,e[pre[i]].c);
for(int i=t;i!=s;i=e[pre[i]^1].v){
e[pre[i]].c-=aug;
e[pre[i]^1].c+=aug;
}
flow+=aug;
cost+=i64(aug)*h[t];
}
return make_pair(flow,cost);
}
}mcf;
int c[205],v[205];
int main()
{
int T;scanf("%d",&T);
while(T--)
{
int n,m;scanf("%d%d",&n,&m);
int s=n*2+m+1,t=n*2;
mcf.init(s);
for(int i=1;i<=m;++i){
int l;scanf("%d",&l);
mcf.addEdge(s,n*2+i,l,n,0);
}
for(int i=1;i<=n*2;++i)scanf("%d",&c[i]);
for(int i=1;i<=n*2;++i)scanf("%d",&v[i]);
for(int i=1;i<n*2;++i){
mcf.addEdge(n*2+c[i],i,0,1,-v[i]);
mcf.addEdge(i,i+1,(i+1)/2,n,0);
}
pair<bool,i64> ans=mcf.flowST(s,t);
if(!ans.first)printf("-1\n");
else printf("%lld\n",-ans.second);
}
return 0;
}
/*
前2i-1个必有i个
s->Ci(li,n,0)
Ci->Li(0,1,vi)
2i-1->2i (i,n,0)
2i->2i+1(0,n,0)
s=2n+1,t=2n
*/
詳細信息
Test #1:
score: 0
Time Limit Exceeded
input:
2 3 2 1 2 1 2 2 2 1 2 3 1 4 2 2 1 3 2 2 2 1 2 2 2 1 2 3 1 4 2 2 1