QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#571278#9315. Rainbow Bracket SequenceniolleTL 0ms0kbC++142.6kb2024-09-17 21:40:562024-09-17 21:40:56

Judging History

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

  • [2024-09-17 21:40:56]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2024-09-17 21:40:56]
  • 提交

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 2305
#define MAXM 20040
#define inf 99999999
#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];
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(){
	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();
//		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]){
				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 "<<flow[T]<<endl;
		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;
//	cout<<T<<endl;
	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);
	int TT = read();
	while(TT--){
		clr();
		printf("%lld\n",wk());
	}
	return 0;
}

詳細信息

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

output:


result: