背包的一些idea
题解:
给出n个物品,每次能使用l-r之间的物品,问能不能表示出k,m次询问
k<=100,m,n=1e5
想了线段树分治 发现是k^2(n+m)logn
claris告诉我可以直接分治
我们对mid-r mid-l分别求一次背包
这样是nklogn的
我们就可以对包含mid的公司做处理
o(k) 查询
for(i=0;i<=k;i++)ans|=f[l][i]&g[r][k-i]
然后就解决了
还有个问题是怎么找对应mid的区间
我的思路是对每层都枚举所有询问暴力二分一下h的后继(把所有区间起点搞出来)
这样是mlog^2 n (虽然不影响)
claris提供了一种mlogn的做法
原理是每个有效点只会进入log次
做法就是每次对不在区间内的扔了 做好的也扔了(不然指数级递增的)