QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#573679 | #9315. Rainbow Bracket Sequence | niolle | WA | 1ms | 3796kb | C++20 | 2.7kb | 2024-09-18 19:38:37 | 2024-09-18 19:38:38 |
Judging History
answer
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dwn(i,a,b) for(int i=a;i>=b;i--)
#define lowbit(x) (x&(-x))
#define MAXN 305
#define MAXM 2040
#define inf 199999999
#define mp(x,y) make_pair(x,y)
using namespace std;
typedef long long ll;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-') f=-1; ch=getchar();}
while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
int cnt[MAXN],t[MAXN],n,S,T,c[MAXN],m,v[MAXN],TT;
int fir[MAXN],to[MAXM],nxt[MAXM],val[MAXM],tot,cost[MAXM];
int pre[MAXN],lst[MAXN],dis[MAXN],flow[MAXN],num,vis[MAXN];
ll sum;
void clr(){
memset(fir,-1,sizeof(fir));
tot = -1;
sum = 0; S = 0;
}
void ade(int x,int y,int z,int w){
// cout<<"ADE:"<<x<<" "<<y<<" "<<z<<" "<<w<<endl;
to[++tot] = y;
nxt[tot] = fir[x];
fir[x] = tot;
val[tot] = z;
cost[tot] = w;
}
queue<int> Q;
bool spfa(){
rep(i,S,T) pre[i] = -1, dis[i] = inf,lst[i] = -1, vis[i] = 0;
// if(TT > 2) cout<<"QAQ:"<<S<<" "<<T<<" "<<n<<" "<<m<<" "<<num<<endl;
// memset(pre,-1,sizeof(pre));
// memset(dis,127,sizeof(dis));
// memset(lst,-1,sizeof(lst));
// memset(vis,0,sizeof(vis));
while(!Q.empty()) Q.pop();
flow[S] = inf; dis[S] = 0;
Q.push(S);
while(!Q.empty()){
int x = Q.front(); Q.pop();
if(x > T) cout<<"NOW:"<<x<<endl;
vis[x] = 0;
for(int k=fir[x];k!=-1;k=nxt[k]){
if(dis[to[k]] > dis[x] + cost[k] && val[k]){
if(!flow[x]) continue;
flow[to[k]] = min(flow[x], val[k]);
dis[to[k]] = dis[x] + cost[k];
pre[to[k]] = x;
lst[to[k]] = k;
if(!vis[to[k]]) vis[to[k]] = 1, Q.push(to[k]);
}
}
}
if(pre[T] == -1) return 0;
return 1;
}
ll FYL(){
ll ansflow = 0, ansval = 0;
int x;
while(spfa()){
// cout<<"OK\n";
ansflow += flow[T];
ansval += 1ll * flow[T] * dis[T];
x = T;
while(x != S){
val[lst[x]] -= flow[T];
val[lst[x]^1] += flow[T];
// cout<<x<<"<--"<<pre[x]<<" "<<flow[T]<<endl;
x = pre[x];
}
}
// cout<<"QAQ:"<<ansflow<<" "<<ansval<<endl;
if(ansflow != n / 2) return -1;
return sum - ansval;
}
ll wk(){
n = read(); m = read(); n *= 2;
rep(i,1,m) t[i] = read();
rep(i,1,m) cnt[i] = 0;
rep(i,1,n) c[i] = read(), cnt[c[i]]++;
rep(i,1,n) v[i] = read(), sum += 1ll * v[i];
num = n;
rep(i,1,m){
++num;
if(cnt[i] < t[i]) return -1;
ade(S,num,cnt[i]-t[i],0); ade(num,S,0,0);
}
rep(i,1,n){
ade(n+c[i],i,1,v[i]); ade(i,n+c[i],0,-v[i]);
}
dwn(i,n-1,1){
ade(i+1,i,inf,0); ade(i,i+1,0,0);
}
T = n + m + 1;
rep(i,1,n) if(!(i&1)) ade(i,T,1,0), ade(T,i,0,0);
return FYL();
}
int main(){
// freopen("1.in","r",stdin);
// freopen("my.out","w",stdout);
TT = read();
while(TT--){
clr();
printf("%lld\n",wk());
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 3796kb
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
Wrong Answer
time: 1ms
memory: 3780kb
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...
output:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
result:
wrong answer 2nd numbers differ - expected: '343766215', found: '-1'