求求求求求助QWQ
查看原帖
求求求求求助QWQ
579699
Self_Killer楼主2023/8/12 21:16
#include<bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
int n,m,x[100010],y[100010],z[50],q[50];double sum,d[50],f[41][1048576],ans;bool vst[50][50];
vector<int> u,v;
signed main(){
	cin >> n >> m;
	for(int i = 1;i <= n;i++){
		cin >> x[i] >> y[i];
		sum += x[i];
		d[i] = (y[i] - x[i]) / 2.0;
	}
	for(int i = 1;i <= m;i++){
		cin >> x[i] >> y[i];
		if(x[i] == y[i]){
			if(d[x[i]] > -0.4){
				sum += 2 * d[x[i]];
				d[x[i]] = -d[x[i]];
			} 
			continue;
		}
	}
	for(int i = 1;i <= n;i++){
		if(d[i] > -0.4){
			v.push_back(i);
			z[i] = v.size() - 1;
		}
		else u.push_back(i);
	}
	for(int i = 1;i <= m;i++){
		if(x[i] == y[i] || vst[x[i]][y[i]]) continue;
		vst[x[i]][y[i]] = vst[y[i]][x[i]] = 1;
		if(d[x[i]] > -0.4) q[y[i]] += (1 << z[x[i]]);
		if(d[y[i]] > -0.4) q[x[i]] += (1 << z[y[i]]);
	}
	int o = 0;
	for(int i = 1;i <= n;i++){
		if(d[i] > -0.4) o = o | q[i];
	}
	if(u.size() < v.size()){
		for(int i = 0;i < (1 << u.size());i++){
			double cnt = 0;int l = 1,r = 1,p = o;
			for(int j = 0;j < u.size();j++){
				 if((i / l) % 2){
				 	cnt += d[u[j]];
				 	p = p | q[u[j]];
				 }
				 if(i < l) break; 
				 l = l * 2;
			}
			for(int j = 0;j < v.size();j++){
				if((p / r) % 2) cnt += d[v[j]];
				r = r * 2;
			}
			ans = max(ans,cnt);
		}
	}
	else{
		for(int i = 0;i <= u.size();i++){
			for(int j = 1;j < (1 << v.size());j++) f[i][j] = -1000000000000000000;
		}
		for(int i = 0;i < u.size();i++){
			for(int j = 0;j < (1 << v.size());j++){
				f[i + 1][j] = max(f[i + 1][j],f[i][j]);
				f[i + 1][j | q[u[i]]] = max(f[i][j] + d[u[i]],f[i + 1][j | q[u[i]]]);
			}
		}
		for(int j = 0;j < (1 << v.size());j++){
			double cnt = 0;int l = 1,k = j | o;
			for(int i = 0;i < v.size();i++){
				if((k / l) % 2) cnt += d[v[i]];
				l = l * 2;
			}
			ans = max(ans,cnt + f[u.size()][j]);
		}
	}
	cout << fixed << setprecision(7) << ans + sum; 
	return 0;
}

听取WA声一片

2023/8/12 21:16
加载中...