题面传送门

很容易发现一件事情,那就是数组的每一位都是独立的,但由于这题数组长度 \(n\) 很大,我们不能每次修改都枚举每一位更新其对答案的贡献,这样复杂度必炸无疑。但是这题有个显然的突破口,那就是 \(k\) 的取值范围很小,最高只有 \(12\),也就是说每一位的取值最多只有 \(12\) 种可能,我们考虑以此为突破口,设计一个与这 \(k\) 个数的具体取值无关的状态。

首先我们知道每一位是独立的,故我们可以把每一位拆开来考虑,于是问题由二维变成一维:给定 \(k\) 个数 \(a_1,a_2,\dots,a_k\),\(q\) 次操作,每次操作给定两个数 \(i,j\),有两种类型,要么新建一个数 \(a_n=\max(a_i,a_j)\),要么新建一个数 \(a_n=\min(a_i,a_j)\)。

我们先来看一个弱化版本,那就是 \(\forall a_i\in [0,1]\),我们设计一个状态 \(f_{i,S}\),\(f_{i,S}=1\) 表示 \(\forall j\in S,a_j=1\Rightarrow a_i=1\),也就是说如果 \(S\) 中的元素都为 \(1\) 那么 \(a_i\) 就一定为 \(1\),否则不能确定 \(a_i\) 究竟是 \(1\) 还是 \(0\),显然最初对于 \(i\in[1,k]\),满足 \(i\in S\) 的 \(f_{i,S}\) 都为 \(1\),其余的 \(f_{i,S}\) 都为 \(0\)。

我们考虑新建一个 \(a_n=\max(a_i,a_j)\) 会造成什么样的影响,对于集合 \(S\),如果 \(f_{i,S}=1\lor f_{j,S}=1\),那么 \(a_i,a_j\) 中一定至少有一个为 \(1\),故 \(a_n=\max(a_i,a_j)\) 一定为 \(1\),故 \(f_{n,S}=1\)。反之,\(f_{i,S}=f_{j,S}=0\),我们就不能确定 \(a_i,a_j\) 的值,也就是说最坏情况下会出现 \(a_i=a_j=0\) 的情况,此时 \(a_n=0\),故 \(f_{n,S}=0\)。故我们有 \(f_n=f_i\lor f_j\)。同理我们也可将取 \(\min\) 的情况与 \(\land\) 联系在一起。至于查询……比方说我们要查询第 \(x\) 个数组第 \(y\) 列的数,我们记 \(T=\{i|a_{i,y}=1,i\in [1,k]\}\),如果 \(f_{x,T}=1\),根据 \(f\) 数组的定义可知 \(a_{x,y}=1\),反之,根据 \(f\) 数组的定义知在剩下数乱填的情况下,有可能出现 \(a_x=0\) 的情况,显然在“\(T\) 之外的数乱填”的情况下,让 \(a_x\) 值最小的填法是其它数全填 \(0\),而我们有 \(\forall i\notin T,a_{i,y}=0\),故 \(a_x=0\)。也就是说我们只需输出 \(f_{x,T}\) 即可,复杂度 \(q2^k+2^k\),使用 bitset 即可优化到 \(\dfrac{q2^k}{w}+k2^k\)

现在我们考虑将更一般的情况规约到特殊情况,由于每一位是独立的,我们还是将目光聚焦到某一特定的列(假设为第 \(i\) 列)上,对于初始 \(k\) 个数组第 \(i\) 列上的数我们将其从大到小排个序,设排好序的数组为 \(x_{1},x_2,\dots,x_k\),我们对于每个 \(a_{t,i}\)(包括新建的数组)新建 \(k\) 个 0/1 变量 \(b_{t,1,i},b_{t,2,i},\dots,b_{t,k,i}\),其中 \(b_{t,j,i}\) 为 \(1\) 表示 \(a_{t,i}\ge x_j\),反之 \(a_{t,i}<x_j\),查询就从 \(1\) 枚举到 \(k\) 直到遇到第一个 \(b_{x,i,y}=1\) 并输出 \(x_i\) 即可。显然这个小小的修改只不过是将数组长度由 \(n\) 变成了 \(nk\),在弱化版本中我们 \(f\) 数组的定义即求解方法照样使用,复杂度 \(\dfrac{q2^k}{w}+k^22^k\),有点脑子就可以优化到 \(q2^k+k2^k\)。

btw 为啥这么神仙的思维题现场那么多人 AC 啊,感觉这些 LGM 都不是人(

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define ffe(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define ppb pop_back
#define mp make_pair
template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;}
template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;}
typedef pair<int,int> pii;
typedef long long ll;
namespace fastio{
#define FILE_SIZE 1<<23
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}
const int MAXK=12;
const int MAXS=1<<MAXK;
const int MAXN=1e5;
int n,k,qu,cnt,a[MAXK+3][MAXN+5];
bitset<MAXS+4> f[MAXN+MAXK+3];
pii ord[MAXN+5][MAXK+3];
bool cmp(pii x,pii y){return a[x.fi][x.se]>a[y.fi][y.se];}
int main(){
scanf("%d%d%d",&n,&k,&qu);cnt=k;
for(int i=1;i<=k;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
for(int j=1;j<=n;j++) for(int i=1;i<=k;i++) ord[j][i]=mp(i,j);
for(int j=1;j<=n;j++) sort(ord[j]+1,ord[j]+k+1,cmp);
for(int i=1;i<=k;i++) for(int j=0;j<(1<<k);j++) if(j>>i-1&1) f[i][j]=1;
while(qu--){
int opt,x,y;scanf("%d%d%d",&opt,&x,&y);
if(opt==1) f[++cnt]=f[x]|f[y];
else if(opt==2) f[++cnt]=f[x]&f[y];
else{
int msk=0;
for(int i=1;i<=k;i++){
msk|=1<<ord[y][i].fi-1;
if(f[x][msk]){
printf("%d\n",a[ord[y][i].fi][y]);
break;
}
}
}
}
return 0;
}

Codeforces 878D - Magic Breeding(bitset,思维题)的更多相关文章

  1. 【CF878D】Magic Breeding bitset

    [CF878D]Magic Breeding 题意:有k个物品,每个物品有n项属性值,第i个人的第j个属性值为aij,有q个操作: 1 x y 用x和y合成一个新的物品,新物品的编号是++k,新物品的 ...

  2. CF878D D. Magic Breeding bitset

    D. Magic Breeding time limit per test 4 seconds memory limit per test 1024 megabytes input standard ...

  3. C. Nice Garland Codeforces Round #535 (Div. 3) 思维题

    C. Nice Garland time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  4. Codeforces 515C 题解(贪心+数论)(思维题)

    题面 传送门:http://codeforces.com/problemset/problem/515/C Drazil is playing a math game with Varda. Let’ ...

  5. Codeforces 1188B - Count Pairs(思维题)

    Codeforces 题面传送门 & 洛谷题面传送门 虽说是一个 D1B,但还是想了我足足 20min,所以还是写篇题解罢( 首先注意到这个式子里涉及两个参数,如果我们选择固定一个并动态维护另 ...

  6. Codeforces 1365G - Secure Password(思维题)

    Codeforces 题面传送门 & 洛谷题面传送门 首先考虑一个询问 \(20\) 次的方案,考虑每一位,一遍询问求出下标的这一位上为 \(0\) 的位置上值的 bitwise or,再一遍 ...

  7. Codeforces 1129E - Legendary Tree(思维题)

    Codeforces 题面传送门 & 洛谷题面传送门 考虑以 \(1\) 为根,记 \(siz_i\) 为 \(i\) 子树的大小,那么可以通过询问 \(S=\{2,3,\cdots,n\}, ...

  8. CodeForces - 427A (警察和罪犯 思维题)

    Police Recruits Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Sub ...

  9. E. Magic Stones CF 思维题

    E. Magic Stones time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

随机推荐

  1. 【UE4 设计模式】建造者模式 Builder Pattern

    概述 描述 建造者模式,又称生成器模式.是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂 ...

  2. SpringCloud微服务实战——搭建企业级开发框架(五):数据库持久化集成MySql+Druid+MyBatis-Plus

      在引入相关数据库持久化相关依赖库之前,我们可以考虑到,当我们因业务开发需要,引入各种各样的依赖库时,Jar包冲突是我们必须面对的一个问题,Spring为了解决这些Jar包的冲突,推出了各种bom, ...

  3. Scrum Meeting 0522

    零.说明 日期:2021-5-22 任务:简要汇报两日内已完成任务,计划后两日完成任务 备注:由于在Beta冲刺阶段的最后一周中团队成员需要准备必修课程计算机网络的相关考试,所以为了保证Beta功能的 ...

  4. RSA加密——前端JSEncrypt

    RSA加密--前端JSEncrypt 介绍 ​ JSEncrypt是一个RSA加密库,在没有SSL加密传输通道支持https协议的情况下,该库可以在http传输重要信息如时,保证数据的安全性.我们小组 ...

  5. VMware Workstation 16.2 Pro for Linux SLIC 2.6 & Unlocker

    请访问原文链接:https://sysin.org/blog/vmware-workstation-16-linux-slic/,查看最新版.原创作品,转载请保留出处. 作者:gc(at)sysin. ...

  6. ASP.NET WEBAPI 跨域请求 405错误

    浏览器报错 本来没有报这个错,当我在ajax中添加了请求头信息时报错 405的报错大概就是后端程序没有允许此次请求,要解决这个问题,就是在后端程序中允许请求通过.具体操作就是修改web.config配 ...

  7. valid-palindrome leetcode C++

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...

  8. eclipse配置Tomcat和Tomcat出现无效端口解决办法

    一.eclipse配置Tomcat 1. 按图选择window-preferences 2在server处选择runtime environment . 3.点击右侧add,选择自己的Tomcat版本 ...

  9. php swoft redis 发布和订阅

    //订阅 public function subscribe() { /* @var \Swoft\Redis\Redis $redis */ $redis = App::getBean(\Swoft ...

  10. Vue&Element开发框架中增加工作流处理,工作流的各个管理页面的界面处理

    我在起前面的几篇随笔中,大概介绍了工作流的一些场景化处理,包括如何把具体业务表单组件化,并在查看和编辑界面中,动态加载组件内容,以及对于查看申请单的主页面,把审批.取消.发起会签.会签.批示分阅.阅办 ...