QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#571904 | #9315. Rainbow Bracket Sequence | zhouhuanyi | TL | 0ms | 3860kb | C++23 | 2.5kb | 2024-09-18 10:11:30 | 2024-09-18 10:11:31 |
Judging History
answer
#include<iostream>
#include<cstdio>
#include<queue>
#define N 1000
#define M 200000
using namespace std;
const int inf=(int)(1.5e9);
int read()
{
char c=0;
int sum=0;
while (c<'0'||c>'9') c=getchar();
while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
return sum;
}
struct node
{
int v,data,cost,nxt;
};
node edge[M+1];
struct reads
{
int num,data;
bool operator < (const reads &t)const
{
return data>t.data;
}
};
int T,n,m,s,t,len=1,cnt[N+1],l[N+1],c[N+1],v[N+1],head[N+1],cur[N+1],dis[N+1];
bool used[N+1],vis[N+1];
long long delta[N+1];
void add(int x,int y,int z,int w)
{
edge[++len]=(node){y,z,w,head[x]},head[x]=len;
edge[++len]=(node){x,0,-w,head[y]},head[y]=len;
return;
}
bool dijkstra()
{
int top;
priority_queue<reads>q;
for (int i=s;i<=t;++i) dis[i]=inf,used[i]=0;
dis[s]=0,q.push((reads){s,0});
while (!q.empty())
{
top=q.top().num,q.pop();
if (used[top]) continue;
used[top]=1;
for (int i=head[top];i>0;i=edge[i].nxt)
if (edge[i].data&&dis[edge[i].v]>dis[top]+delta[top]-delta[edge[i].v]+edge[i].cost)
dis[edge[i].v]=dis[top]+delta[top]-delta[edge[i].v]+edge[i].cost,q.push((reads){edge[i].v,dis[edge[i].v]});
}
for (int i=s;i<=t;++i) delta[i]+=dis[i];
return used[t];
}
int dinic(int x,int flow)
{
if (x==t) return flow;
int d;
vis[x]=1;
for (int &i=cur[x];i>0;i=edge[i].nxt)
if (edge[i].data&&!vis[edge[i].v]&&delta[edge[i].v]==delta[x]+edge[i].cost)
{
d=dinic(edge[i].v,min(flow,edge[i].data));
if (d)
{
edge[i].data-=d,edge[i^1].data+=d,vis[x]=0;
return d;
}
}
vis[x]=0;
return 0;
}
int main()
{
int flow,rst;
long long res;
bool op;
T=read();
while (T--)
{
n=read(),m=read(),s=rst=res=0,t=(n<<1)+m+1,len=op=1;
for (int i=s;i<=t;++i) head[i]=0;
for (int i=1;i<=m;++i) l[i]=read(),cnt[i]=0;
for (int i=1;i<=(n<<1);++i) c[i]=read(),cnt[c[i]]++;
for (int i=1;i<=(n<<1);++i) v[i]=read(),res+=v[i];
for (int i=1;i<=m;++i)
if (cnt[i]<l[i])
op=0;
if (!op)
{
puts("-1");
continue;
}
for (int i=1;i<=n;++i) add(s,i<<1,1,0);
for (int i=1;i<=(n<<1)-1;++i) add(i,i+1,1,0);
for (int i=1;i<=(n<<1);++i) add(i,(n<<1)+c[i],1,v[i]);
for (int i=1;i<=m;++i) add((n<<1)+i,t,cnt[i]-l[i],0);
while (dijkstra())
{
for (int i=s;i<=t;++i) cur[i]=head[i];
while (flow=dinic(s,inf)) rst+=flow,res-=flow*delta[t];
}
if (rst!=n) puts("-1");
else printf("%lld\n",res);
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3860kb
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
output:
9 -1
result:
ok 2 number(s): "9 -1"
Test #2:
score: -100
Time Limit Exceeded
input:
50 8 6 0 2 2 0 3 1 3 5 1 1 5 3 5 2 3 2 2 1 2 2 4 6 998133227 879226371 59632864 356493387 62611196 827258251 296576565 204244054 812713672 780267148 614679390 447700005 102067050 544546349 116002772 761999375 1 1 1 1 1 343766215 374461155 3 1 2 1 1 1 1 1 1 796323508 303640854 701432076 853325162 610...