题解

做了一下SCOI2015,于是决定搬运SCOI2016= v =

如果没有加法,我们可以向左向右节点查找

每个总权值是2^18 - 1,然后左右分,那么每次是一个完整的节点

如果有了加法,那么我们如果希望有数满足某一位是1或者0,是一段取值的区间,我们要保证这个区间的左右端点减少x后这个区间里还有值

我们可以通过一次\(\log n\)的操作完成这个东西

那么我们二分的话,复杂度也是\(\log n\)的

所以总复杂度就是\(O(m \log^2 n)\)的

代码

#include <bits/stdc++.h>
//#define ivorysi
#define MAXN 200005
typedef long long int64;
typedef unsigned int u32;
using namespace std;
const int MOD = 1000000007;
int n,m;
int a[MAXN];
struct node {
int lc,rc;
int size;
}tr[MAXN * 20];
int rt[MAXN],nodecnt;
int MAXVAL = 100000;
void add(const int &x,int &y,int l,int r,int pos) {
y = ++nodecnt;
tr[y] = tr[x];
tr[y].size++;
if(l == r)return;
int mid = (l + r) >> 1;
if(pos <= mid) add(tr[x].lc,tr[y].lc,l,mid,pos);
else add(tr[x].rc,tr[y].rc,mid + 1,r,pos);
}
int query(const int &u,int l,int r,int ql,int qr) {
if(l == ql && r == qr) return tr[u].size;
int mid = (l + r) >> 1;
if(qr <= mid) return query(tr[u].lc,l,mid,ql,qr);
else if(ql > mid) return query(tr[u].rc,mid + 1,r,ql,qr);
else {
return query(tr[u].lc,l,mid,ql,mid) + query(tr[u].rc,mid + 1,r,mid + 1,qr);
}
}
void Init() {
scanf("%d%d",&n,&m);
for(int i = 1 ; i <= n ; ++i) {
scanf("%d",&a[i]);
add(rt[i - 1],rt[i],0,MAXVAL,a[i]);
}
}
int getsize(int L,int R,int ql,int qr) {
if(ql < 0) ql = 0; qr = min(qr,MAXVAL);
if(qr < ql) return 0 ;
return query(rt[R],0,MAXVAL,ql,qr) - query(rt[L - 1],0,MAXVAL,ql,qr);
}
int Binary(int b,int x,int Lrt,int Rrt) {
int L = 0,R = (1 << 18) - 1;
int NUM = 0;
for(int i = 17 ; i >= 0 ; --i) {
if(b >> i & 1) {
int T = NUM + (1 << i) - 1;
if(getsize(Lrt,Rrt,L - x,T - x) > 0) {
R = T;
}
else {
L = T + 1;
NUM += (1 << i);
}
}
else {
int T = NUM + (1 << i);
if(getsize(Lrt,Rrt,T - x,R - x) > 0) {
NUM += (1 << i);
L = T;
}
else R = T - 1;
}
}
return b ^ NUM;
}
void Solve() {
Init();
int b,x,l,r;
while(m--) {
scanf("%d%d%d%d",&b,&x,&l,&r);
printf("%d\n",Binary(b,x,l,r));
}
} int main() {
#ifdef ivorysi
freopen("food1.in","r",stdin);
#endif
Solve();
}

【LOJ】#2016. 「SCOI2016」美味的更多相关文章

  1. loj#2016. 「SCOI2016」美味

    题目链接 loj#2016. 「SCOI2016」美味 题解 对于不带x的怎么做....可持久化trie树 对于带x,和trie树一样贪心 对于答案的二进制位,从高往低位贪心, 二进制可以表示所有的数 ...

  2. AC日记——「SCOI2016」美味 LiBreOJ 2016

    #2016. 「SCOI2016」美味 思路: 主席树: 代码: #include <bits/stdc++.h> using namespace std; #define maxa 26 ...

  3. 「SCOI2016」美味 解题报告

    「SCOI2016」美味 状态极差无比,一个锤子题目而已 考虑每次对\(b\)和\(d\)求\(c=d \ xor \ (a+b)\)的最大值,因为异或每一位是独立的,所以我们可以尝试按位贪心. 如果 ...

  4. loj#2013. 「SCOI2016」幸运数字 点分治/线性基

    题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...

  5. loj#2015. 「SCOI2016」妖怪 凸函数/三分

    题目链接 loj#2015. 「SCOI2016」妖怪 题解 对于每一项展开 的到\(atk+\frac{dnf}{b}a + dnf + \frac{atk}{a} b\) 令$T = \frac{ ...

  6. loj#2012. 「SCOI2016」背单词

    题目链接 loj#2012. 「SCOI2016」背单词 题解 题面描述有点不清楚. 考虑贪心 type1的花费一定不会是优的,不考虑, 所以先把后缀填进去,对于反串建trie树, 先填父亲再填儿子, ...

  7. 「SCOI2016」美味

    「SCOI2016」美味 题目描述 一家餐厅有 \(n\) 道菜,编号 \(1 \ldots n\) ,大家对第 \(i\) 道菜的评价值为 \(a_i \:( 1 \leq i \leq n )\) ...

  8. loj #2013. 「SCOI2016」幸运数字

    #2013. 「SCOI2016」幸运数字 题目描述 A 国共有 n nn 座城市,这些城市由 n−1 n - 1n−1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以 ...

  9. LOJ #2013「SCOI2016」幸运数字

    时限为什么这么大啊 明摆着放多$ log$的做法过啊$QAQ$ LOJ #2013 题意 有$ Q$次询问,每次询问树上一条链,点有点权,你需要选择一些链上的点使得异或和尽量大 点数$ \leq 2* ...

随机推荐

  1. git clone 指定分支的内容

    使用Git下载指定分支命令为:git clone -b 分支名仓库地址 使用Git下载v.2.8.1分支代码,使用命令:git clone -b v2.8.1 https://git.oschina. ...

  2. Java面试题:多继承

    招聘和面试对开发经理来说是一个无尽头的工作,虽然有时你可以从HR这边获得一些帮助,但是最后还是得由你来拍板,或者就像另一篇文章"Java 面试题:写一个字符串的反转"所说: 面试开 ...

  3. [DeeplearningAI笔记]序列模型3.9-3.10语音辨识/CTC损失函数/触发字检测

    5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.9语音辨识 Speech recognition 问题描述 对于音频片段(audio clip)x ,y生成文本 ...

  4. [DeeplearningAI笔记]卷积神经网络1.9-1.11池化层/卷积神经网络示例/优点

    4.1卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.9池化层 优点 池化层可以缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性. 池化层操作 池化操作与卷积操作类似 ...

  5. git入门篇shell

    什么是shell 在计算机科学中,Shell俗称壳,用来区别于Kernel(核),是指“提供使用者使用界面”的软件(命令解析器),它类似于windows系统下的cmd.exe, 它接收用户命令,然后调 ...

  6. NOIP模拟1

    期望得分:100+100+100=300 实际得分:94+96+97=287 T1  #6090. 「Codeforces Round #418」尘封思绪 #include<cstdio> ...

  7. 批量提取图片主要3个颜色匹配中文名字并写入到excel设置对应颜色的背景

    from gevent import monkey monkey.patch_all() import gevent from haishoku.haishoku import Haishoku im ...

  8. json属性名为什么要双引号?

    原因一: 更加规范,利于解析 原因二: 避免class等关键字引起的不兼容问题 原因三: 可能也是最隐晦的: var a = 00; var b = {00: 12}; a in b; --> ...

  9. RabbitMQ使用简记

    RabbitMQ是什么 MQ全称为Message Queue, 即消息队列.MQ是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们 ...

  10. python常用库之base64

    1. 什么是base64 base64是一种将不可见字符转换为可见字符的编码方式. 2. 如何使用 最简单的使用方式 import base64 if __name__ == '__main__': ...