QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#573679#9315. Rainbow Bracket SequenceniolleWA 1ms3796kbC++202.7kb2024-09-18 19:38:372024-09-18 19:38:38

Judging History

你现在查看的是最新测评结果

  • [2024-09-18 19:38:38]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3796kb
  • [2024-09-18 19:38:37]
  • 提交

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

Details

Tip: Click on the bar to expand more detailed information

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'