【题目描述】

给出一个长度为 n 的序列,序列的每个元素为一个二元组,代表一种单目运算:

• \((0,x)\): 对于一个数\(a\),将其变为 \(a\&x\)。\((\&=x)\)

• \((1,x)\): 对于一个数\(a\),将其变为 \(a|x\)。\((|=x)\)

现在给出\(q\)次询问,每次询问包含四个整数\(l,r, L, R\),其中\(1 ≤ l ≤ r ≤ n\), \(0 ≤ L ≤ R ≤ 2^{31}-1\)

表示对于在\([L,R]\)之间的整数\(x\),按照序列中第\(l\)到第\(r\)项从左到右结合的

顺序进行运算,求可能的最大的运算结果。

【题目分析】

之前做过一道毒瘤题目叫睡觉困难综合症。

本题类似,我们可以用线段树维护两个值:

本位初始值为\(0\),经过操作后变为\(val[0]\);本位初始值为\(1\),经过操作后变为\(val[1]\)。

那么询问时就能在线段树上直接查询出\(val[0],val[1]\)。然后对\([L,R]\)的数从高位到低位贪心即可。(贪心太菜,考试时没有想出来)。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
inline char Getchar(){
static char buffer[1<<20],*S,*T=S;
return T==S?T=(S=buffer)+fread(buffer,1,1<<20,stdin),*S++:*S++;
}
inline int Getint(){
int w=0,f=1;char ch=Getchar();
while(ch<'0'||ch>'9')ch!='-'?:f=-1,ch=Getchar();
while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=Getchar();
return w*f;
}
typedef unsigned int uint;
const int Maxn=1000005;
const uint inf=0x7fffffff;
int n;
pair<uint,uint>a[Maxn];
uint val[2][Maxn*4];
#define ls v<<1
#define rs v<<1|1
void pushup(int v){
val[0][v]=(val[0][ls]&val[1][rs])|((~val[0][ls])&val[0][rs]);
val[1][v]=(val[1][ls]&val[1][rs])|((~val[1][ls])&val[0][rs]);
}
void Build(int v,int l,int r){
if(l==r){
if(!a[l].first)val[1][v]=inf&a[l].second,val[0][v]=0;
else val[1][v]=inf,val[0][v]=a[l].second;
return;
}
int mid=l+r>>1;
Build(ls,l,mid);Build(rs,mid+1,r);
pushup(v);
}
pair<uint,uint> Query(int v,int l,int r,int a,int b){
if(a<=l&&r<=b)return make_pair(val[0][v],val[1][v]);
int mid=l+r>>1;
if(b<=mid)return Query(ls,l,mid,a,b);
if(a>mid)return Query(rs,mid+1,r,a,b);
pair<uint,uint> p=Query(ls,l,mid,a,mid),q=Query(rs,mid+1,r,mid+1,b);
return make_pair((p.first&q.second)|((~p.first)&q.first),(p.second&q.second)|((~p.second)&q.first));
}
int main(){
n=Getint();
for(int i=1;i<=n;i++)a[i].first=Getint(),a[i].second=Getint();
Build(1,1,n);
int q=Getint();
while(q--){
int a=Getint(),b=Getint(),l=Getint(),r=Getint();
pair<uint,uint>ret=Query(1,1,n,a,b);
static int c[35];
for(int i=30;~i;i--)c[i]=(ret.first>>i&1)+(ret.second>>i&1);
int ans=0,now=0;
for(int i=30;~i;i--){
if((l>>i&1)^(r>>i&1)){
for(;~i;i--){
if(c[i]==2)ans|=(1<<i);
else if(c[i]&&now+(1<<i)<=r)now|=(1<<i),ans|=(1<<i);
}
break;
}
else {
now|=l&(1<<i);
if((l&(1<<i))){
if(ret.second&(1<<i))ans|=(1<<i);
}
else if(ret.first&(1<<i))ans|=(1<<i);
}
}
cout<<ans<<"\n";
}
}

\(Ps:\)然而正解可以不用线段树

【9.29 模拟】T3 小清新最优化(easy)的更多相关文章

  1. 一篇文教你使用python Turtle库画出“精美碎花小清新风格树”快来拿代码!

    Turtle库手册可以查询查询 python图形绘制库turtle中文开发文档及示例大全,手册中现有示例,不需要自己动手就可以查看演示. 使用Turtle画树,看了一下网上的代码,基本上核心的方法是使 ...

  2. 三石推荐!把 Bootstrap 小清新带回家!

    无敌传送门:http://fineui.com/demo_pro/default.aspx?theme=bootstrap1&menu=accordion   喜欢就来赞一个! 把麻烦留给三石 ...

  3. 小清新的jQuery ck-slide 图片轮播

    ck_slide 是一款小清新的jQuery 幻灯片插件,它非常小巧,压缩后仅 3KB,基本功能可以满足.它支持淡入淡出/左右滚动.箭头/圆点控制.自动播放. 在线实例 默认(淡入淡出) 左右滚动 自 ...

  4. easyui小清新俺也晒晒 视频管理软件bs项目

    easyui小清新俺也晒晒 视频管理软件bs项目 针对设备的管理软件 这是我听到最多的话.视频管理软件bs项目.easyui 好与坏我不去评价 项目做了好几个月,其实代码看来也没用多少,但是做需求,时 ...

  5. Photoshop调出外景婚片蓝色小清新艺术效果

    春季婚纱旺季来了,好多童鞋给我抱怨说客片太难转色了,春天的小清新感都转不了,其实并不难,运用好互补色来进行加减色,能很快调整好照片的偏色,互补色也可称为对比色,后期调色的加也可称为减,如加蓝=减黄.加 ...

  6. LuoguP3674 小清新人渣的本愿 && BZOJ4810: [Ynoi2017]由乃的玉米田

    题目地址 小清新人渣的本愿 [Ynoi2017]由乃的玉米田 所以这两题也就输出不一样而已 题解 这种lxl的题还是没修改操作的题基本就是莫队 分开考虑每个询问 1.减法 \(a-b=x⇒a=b+x\ ...

  7. P3674 小清新人渣的本愿

    P3674 小清新人渣的本愿 一道妙不可言的题啊,,, 一看就知道是个莫队 考虑求答案 1号操作就是个大bitset,动态维护当前的bitset \(S\),把能取哪些值都搞出来,只要\(S\ and ...

  8. 【Luogu3676】小清新数据结构题(动态点分治)

    [Luogu3676]小清新数据结构题(动态点分治) 题面 洛谷 题解 先扯远点,这题我第一次看的时候觉得是一个树链剖分+线段树维护. 做法大概是这样: 我们先以任意一个点为根,把当前点看成是一棵有根 ...

  9. 【洛谷3674】小清新人渣的本愿(莫队,bitset)

    [洛谷3674]小清新人渣的本愿(莫队,bitset) 题面 洛谷,自己去看去,太长了 题解 很显然的莫队. 但是怎么查询那几个询问. 对于询问乘积,显然可以暴力枚举因数(反正加起来也是\(O(n\s ...

随机推荐

  1. spring对异步的支持

    spring中异步方法的配置 1.在web.xml文件中设置org.springframework.web.servlet.DispatcherServlet的async-supported属性为tr ...

  2. linux 入门命令总结

    1,tree -d /etc/ 参数表示只显示目录 -f 显示内容的完整 -i 不显示树枝显示完整路径2,mkdir -p 递归创建多级目录 -v 显示创建目录的过程 -m 设置目录的默认权限 mkd ...

  3. LeetCode 112.路径总和(C++)

    给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = 22 ...

  4. Java面试题搜集

    这里是一些Java面试题,从"程序员小灰"公众号转载过来,备用. 项目介绍 明确项目是做什么的 明确项目的价值.(为什么做这个项目,它解决了用户什么痛点,它带来什么价值?) 明确项 ...

  5. 让C:\Users文件夹放在D盘

    新安装win7 在安装Win7的过程中,要求输入用户名及密码的时候,先不如输入任何信息,按“Shift+F10”呼出DOS窗口,输入以下命令: robocopy "C:\Users" ...

  6. TOJ 4002 Palindrome Generator

    描述 A palindrome is a number that reads the same whether you read it from left to right or from right ...

  7. pat1012. The Best Rank (25)

    1012. The Best Rank (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue To eval ...

  8. 九度oj题目1181:遍历链表

    题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2600 解决:1125 题目描述: 建立一个升序链表并遍历输出. 输入: 输入的每个案例中第一行包括1个整数:n(1 ...

  9. 用R处理不平衡的数据

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自云+社区翻译社,作者ArrayZoneYour 在分类问题当中,数据不平衡是指样本中某一类的样本数远大于其他的类别样本数.相比于多分 ...

  10. ubuntu中mysql5.7表名区分大小写解决方案

    在/etc/mysql/mysql.conf.d/mysqld.cnf 添加lower_case_table_names=1