社区讨论
求助
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 条回复,欢迎继续交流。
正在加载回复...