n(n<=3e5)个整数,第i个数为ai(0<=ai<=3e5),1<=i<=n
如果(ai&aj)>0,则称i到j是可达的,i q(q<=3e5)个询问,每次询问两个下标x和y(x 问在允许中间插入若干个下标位于[x+1,y-1]之间且插入序列单增的ai跳板的情况下,x到y是否可达 例如,ax ai aj ay是插入跳板之后的序列, 那么x到y可达当且仅当x到i可达,i到j可达,j到y可达,且下标满足x
Codeforces Round #562 — Editorial last[i][k]记录大于i的最小下标j,满足aj在二进制表示下第k位为1 go[i][k]记录大于等于i的最小下标j,满足aj在二进制表示下第k位为1,且从i可达 倒着dp,可以把last数组求出来,如果last[i-1][k]能被ai的对应位更新就更新,否则last[i-1][k]沿用last[i][k] ①如果ai在第k位为1,go[i][k]=i显然成立 ②ai自己没有第k位,却要去一个有第k位的最小的位置, 那么它只能,先以自己有的二进制位k为跳板,去到last[i][k]对应的下标j, 再去利用go[j][k],寄希望于aj有第k位,或再重复该跳板过程,到达一个有第k位的最小的位置, 多条j的路径都可以更新go[i][k]的值,于其中取小即为go[i][k] 查询问x是否可达y时,只需检查y的所有二进制为1的位k, 若存在k使得go[x][k]<=y,即说明x->go[x][k]->y,可达; 所有都不符合,则不可达 开始WA了一发,注意初始化 感觉自己思维题还是练的不够吧 但所幸现在能照着turorial大致敲出来,码力还凑活 相信随着积累应该是可以渐渐培养思维的 思路来源
题解
心得
代码
#include