2020-2021 ACM-ICPC Latin American Regional Programming Contest J. Job Allocator
Preface
今天因为下午被强行拉回老家了,而且没带电脑回去
然后就变成了徐神和祁神两个人写,我拿个手机在后面口胡了3h
最后变成了在缺我一个人的前提下还能4h过10题的情况,感觉就算我在的话最多就是快点过H然后把剩下的时间拿去写个J
这场因为没啥参与就不写整场的博客了,把赛后写的这个J题补一下
Solution
这题上来就发现非常典啊,就是插入/删除一个\(k\)维向量,然后每次询问每一维都大于等于某个给定向量的向量有多少个
首先一眼KD-Tree维护高维偏序,然后徐神说KD-Tree跑维度比较高的时候会很慢(我怎么记得是维度越高越快来着),遂弃了
后面想到用bitset乱搞,但复杂度是\(O(\frac{n^2k}{\omega})\)的,跑起来感觉有点炸裂(没试过),遂再次弃疗
而这题真正的做法其实很简单,注意到题目中这样输入其实保证了每次操作的向量的每一维加起来的和\(\le 8\),再加上向量的维度大小也\(\le 8\)
因此我们发现所有不同的状态一共就\(9^8=43046721\)个,同时对于某个给定向量,我们可以直接计算它对哪些状态能产生贡献
而暴力计算这部分的复杂度最坏是\((1+1)^8=256\)的,可以轻松通过
#include<cstdio>
#include<iostream>
#include<utility>
#include<vector>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<set>
#include<array>
#include<random>
#include<bitset>
#include<ctime>
#include<limits.h>
#include<assert.h>
#include<unordered_set>
#include<unordered_map>
#define RI register int
#define CI const int&
#define mp make_pair
#define fi first
#define se second
#define Tp template <typename T>
using namespace std;
typedef long long LL;
typedef long double LDB;
typedef unsigned long long u64;
typedef __int128 i128;
typedef pair <int,int> pi;
typedef vector <int> VI;
typedef array <int,3> tri;
const int N=100005,S=43046721+5;
int n,k,cnt,sum[S],c[N][10],b[10];
inline void DFS(CI opt,CI now=0,CI cur=0)
{
if (now>=k) return (void)(sum[cur]+=opt);
for (RI i=0;i<=b[now];++i) DFS(opt,now+1,cur*9+i);
}
int main()
{
RI i,j; for (scanf("%d%d",&n,&k),i=1;i<=n;++i)
{
char opt[5]; int x,y; scanf("%s",opt);
if (opt[0]=='C')
{
memset(b,0,sizeof(b)); scanf("%d",&x);
for (j=1;j<=x;++j) scanf("%d",&y),++b[y-1];
for (DFS(1),++cnt,j=0;j<k;++j) c[cnt][j]=b[j];
} else if (opt[0]=='D')
{
scanf("%d",&x); for (j=0;j<k;++j) b[j]=c[x][j]; DFS(-1);
} else
{
int cur=0; memset(b,0,sizeof(b)); scanf("%d",&x);
for (j=1;j<=x;++j) scanf("%d",&y),++b[y-1];
for (j=0;j<k;++j) cur=cur*9+b[j];
printf("%d\n",sum[cur]);
}
}
return 0;
}
辣鸡老年选手AFO在即

浙公网安备 33010602011771号