社区讨论

求助

CF1641D Two Arrays参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo8zldvb
此快照首次捕获于
2023/10/28 03:08
2 年前
此快照最后确认于
2023/10/28 03:08
2 年前
查看原帖
RT 似乎被卡常了?有无大佬看看程序里有没有常数大的地方可以修改?
CPP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <set>
#include <cstdlib>
#include <unordered_map>
#include <map>
using namespace std;
const int N = 100005;
const int INF = 2e9;
typedef unsigned long long ull;
typedef pair<ull , int> pui;
ull b[N][(1 << 5) + 2];
int cnt[1 << 6] , n , m , id[N] , w[N] , res = INF;
map<pui , int> mp; 
vector<int> a[N];
inline int read() {
    int x=0,ff=1;
    char ch=getchar();
	while(ch<'0'||ch>'9') {
        if(ch=='-')
            ff=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*ff;
}

inline bool cmp(int u , int v) {return a[u][m] < a[v][m];}

int main () {
	n = read(); m = read();
	for(int i = 1;i <= n;i++) {
		for(int j = 1;j <= m;j++) {
			int x = read(); a[i].push_back(x);
		}
		int w = read();
		sort(a[i].begin() , a[i].end()); a[i].push_back(w); id[i] = i;
	} 
	cnt[0] = 0; for(int i = 1;i < (1 << m);i++) cnt[i] = cnt[i >> 1] + (i & 1) , w[i] = (cnt[i] & 1 ? 1 : -1);
	sort(id + 1 , id + n + 1 , cmp);
	int r = n; 
	for(int i = 1;i <= n;i++) {
		for(int j = 1;j < (1 << m);j++) {
			ull s = 0;
			for(int k = 0;k < m;k++) {
				if(j & (1 << k)) s = s * 1331ull + (unsigned long long)a[id[i]][k];
			} 
			mp[make_pair(s , cnt[j])]++;
			b[id[i]][j] = s;
		}
	}
	for(int i = 1;i <= n;i++) {
		int st = r;
		while(r >= 1) {
			int Ans = 0;
			for(int j = 1;j < (1 << m);j++) {
			//	if(mp.find(make_pair(b[i][j] , cnt[j])) != mp.end()) {
					Ans = Ans + mp[make_pair(b[id[i]][j] , cnt[j])] * w[j];
			//	}
				//有交 1 无交 0 
			}
			if(Ans == r) {if(st ^ r) res = min(res , a[id[i]][m] + a[id[r + 1]][m]); break;}
			for(int j = 0;j < (1 << m);j++) mp[make_pair(b[id[r]][j] , cnt[j])]--; r--;
		}
		if(!r) {
			res = min(res , a[id[i]][m] + a[1][m]); break;
		}
	} 
	printf("%d\n" , res == INF ? -1 : res);
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...