写了的都有代码,没代码的就是看了题解没写。没写出来的就是没补。
20251215
- [A.vector] 初见杀交互。
- [B.min-max] 毛毛虫。
- [C.grid] 计数。
50+0+0=50.
A.vector
由于是 max 所以只要不漏就好。考虑一个二进制串 \(s_i\),\(s_{i,j}\) 表示第 \(i\) 个向量在第 \(j\) 个询问中是否出现。
令所有 \(s_i\) 为 14 位二进制串满足 \(|s_i|=7\),\(|\circ|\) 为 popcount。显然是可以为所有 \(i\) 分配不同的 \(s_i\),因为 \(\binom{14}{7}=3432>2000\)。
于是对于任意 \(i \neq j\) 都能找到位 \(k\) 使得 \(s_{i,k}=0,s_{j,k}=1\)。于是我们只要把 \(i\) 不出现的询问结果并起来即可。
代码
#include "vector.h"
#include<bits/stdc++.h>
using namespace std;
int id[2005];
void Gen(){static int a[14]={0,0,0,0,0,0,0,1,1,1,1,1,1,1};int rd=0;do{rd++;for(int i=0;i<14;i++){id[rd]<<=1;id[rd]|=a[i];}if(rd==2000)break;}while(next_permutation(a,a+14));
}
vector<vector<int> > solve(int n,int k,int q){Gen();vector<vector<int> > res(n,vector<int>(k,0));for(int i=0;i<=13;i++){vector<int> s;for(int j=1;j<=n;j++){if(id[j]>>i&1)s.push_back(j);}if(s.empty())continue;vector<int> t=query(s);for(int j=1;j<=n;j++){if(id[j]>>i&1^1){for(int l=0;l<k;l++){res[j-1][l]=max(res[j-1][l],t[l]);}}}}return res;
}