202512/202601集训模拟赛记录

写了的都有代码,没代码的就是看了题解没写。没写出来的就是没补。

不排除有没来得及写的。

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;
}

20251217

  • [matrix] 优化枚举
  • [exp] 积分
  • [capella] 构造

80+100+0=180

posted @ 2025-12-24 15:10  Aysct  阅读(1)  评论(0)    收藏  举报