Codeforces 878D - Magic Breeding(bitset,思维题)
很容易发现一件事情,那就是数组的每一位都是独立的,但由于这题数组长度 \(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,思维题)的更多相关文章
- 【CF878D】Magic Breeding bitset
[CF878D]Magic Breeding 题意:有k个物品,每个物品有n项属性值,第i个人的第j个属性值为aij,有q个操作: 1 x y 用x和y合成一个新的物品,新物品的编号是++k,新物品的 ...
- CF878D D. Magic Breeding bitset
D. Magic Breeding time limit per test 4 seconds memory limit per test 1024 megabytes input standard ...
- 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 ...
- Codeforces 515C 题解(贪心+数论)(思维题)
题面 传送门:http://codeforces.com/problemset/problem/515/C Drazil is playing a math game with Varda. Let’ ...
- Codeforces 1188B - Count Pairs(思维题)
Codeforces 题面传送门 & 洛谷题面传送门 虽说是一个 D1B,但还是想了我足足 20min,所以还是写篇题解罢( 首先注意到这个式子里涉及两个参数,如果我们选择固定一个并动态维护另 ...
- Codeforces 1365G - Secure Password(思维题)
Codeforces 题面传送门 & 洛谷题面传送门 首先考虑一个询问 \(20\) 次的方案,考虑每一位,一遍询问求出下标的这一位上为 \(0\) 的位置上值的 bitwise or,再一遍 ...
- Codeforces 1129E - Legendary Tree(思维题)
Codeforces 题面传送门 & 洛谷题面传送门 考虑以 \(1\) 为根,记 \(siz_i\) 为 \(i\) 子树的大小,那么可以通过询问 \(S=\{2,3,\cdots,n\}, ...
- CodeForces - 427A (警察和罪犯 思维题)
Police Recruits Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Sub ...
- E. Magic Stones CF 思维题
E. Magic Stones time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
随机推荐
- 【数据结构与算法Python版学习笔记】目录索引
引言 算法分析 基本数据结构 概览 栈 stack 队列 Queue 双端队列 Deque 列表 List,链表实现 递归(Recursion) 定义及应用:分形树.谢尔宾斯基三角.汉诺塔.迷宫 优化 ...
- centos7 配置ftp服务器搭建(匿名访问,以及本地登录)
大家好,今天来给大家分享一个基于centos 7的ftp服务器搭建 实现功能:匿名访问,本地登录 查看系统版本: [root@localhost ~]# cat /etc/redhat-release ...
- 第五课第四周笔记2:Self-Attention 自注意力
Self-Attention 自注意力 让我们跳进去谈谈transformer的self-attention机制.如果您能了解本视频背后的主要思想,您就会了解变压器网络工作背后最重要的核心思想. 让我 ...
- UltraSoft - Alpha - 发布声明
DDL_Killer Alpha版本发布声明 1. Alpha 阶段功能描述与版本实现 功能描述 设计原型 Alpha实现 登陆界面 注册界面 首页 日历视图 事项详情页 新建事项 列表视图 课程视图 ...
- [no code][scrum meeting] Beta 4
例会时间:5月16日11:30,主持者:伦泽标 下次例会时间:5月18日11:30,主持者:叶开辉 一.工作汇报 人员 昨日完成任务 明日要完成的任务 乔玺华 完成整体框架设计与登录逻辑 与后端对接 ...
- Vue 报错Error in render: “TypeError: Cannot read properties of null (reading ‘xxx’)” found in
前端vue报错 [Vue warn]: Error in render: "TypeError: Cannot read properties of null (reading 'name' ...
- 【学习笔记】Vizing 定理
图染色问题的经典结论 定义 称一个边染色方案合法当且仅当每个顶点连出的所有边的颜色都互不相同,如果此时出现了 \(k\) 个颜色那么称该方案是图的一组 \(k\) 染色 一张无向图的边着色数为最小的 ...
- 单片机STM32学习笔记之寄存器映射详解
我们知道,存储器本身没有地址,给存储器分配地址的过程叫存储器映射,那什么叫寄存器映射?寄存器到底是什么? 在存储器Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共32bit,每一 ...
- 转载:使用Xilinx IP核进行PCIE开发学习笔记(一)简介篇
https://zhuanlan.zhihu.com/p/32786076 最近接触到一个项目,需要使用PCIE协议,项目要求完成一个pcie板卡,最终可以通过电脑进行通信,完成电脑发送的指令.这当中 ...
- 设计模式(1-3)-动态代理(WeakCache的运用)
阅读本篇文章前,请事先阅读 理解Java的强引用.软引用.弱引用和虚引用. 看看什么是强引用.什么是弱引用及它们的用途,很必要!!! 上一节讲到,获取对应的代理类时,首先会从缓存中去拿,若拿不到才会去 ...