题目链接:点击查看

题目大意:给出n个数,以及m个操作,每个操作分为两种:

  1. 1 x y:将第x个数变为y
  2. 2 x y:判断闭区间[x,y]中的数能否在进行升序排序后构成一段连续且上升序列

题目分析:因为涉及到了区间修改和区间查询的问题,所以我们首先想到利用线段树来辅助解决,第一个操作很简单,单点修改,主要是我们该怎么样在规定时间内完成第二个操作才是问题,这个题目的n和m给的都是5e5,那么我们每次查询最多只能以logn的复杂度查询,就已经达到2e7的时间复杂度了,线段树已经占用掉了logn的复杂度,所以留给我们的只能用O(1)的复杂度来判断这个条件了。我想过能不能用归并树来实现这个题,应该不大行,毕竟是已经被淘汰了的数据结构,之前兴致勃勃的用归并树做主席树的题,很失望的T掉了555。说回这个题,我们需要知道一个结论,就是从1~n异或出来的结果是有规律的,详情请看我的上个博客,有了这个就好判断了,我们可以用线段树维护一个最小值,一个区间和,一个异或值,判断的时候,我们可以通过最小值和区间长度判断出最大值(因为数都是连续的,所以最小值加上区间长度就是最大值了。。),然后首先利用等差数列求和公式求一下这段的区间和应该是多少,再和线段树中储存的比较一下,如果相等再接着用异或的那个规律比较一下,这样就能通过O(1)判断是否满足条件了。

对了有个细节需要注意一下,若求0~n区间异或的函数是xor_n(int n),那么我们想求x~y区间内的异或,应该是xor_n(y)^xor_n(x-1)

而不是xor_n(y)-xor_n(x-1),想一想,为什么?

好了直接上代码了:

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=5e5+100;struct Node
{int l,r;int mmin,xor_;LL sum;
}tree[N<<2];void pushup(int k)
{tree[k].mmin=min(tree[k<<1].mmin,tree[k<<1|1].mmin);tree[k].xor_=tree[k<<1].xor_^tree[k<<1|1].xor_;tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
}void build(int k,int l,int r)
{tree[k].l=l;tree[k].r=r;if(l==r){scanf("%d",&tree[k].mmin);tree[k].sum=tree[k].xor_=tree[k].mmin;return;}int mid=l+r>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);pushup(k);
}void update(int k,int pos,int val)
{if(tree[k].l==tree[k].r){tree[k].sum=tree[k].mmin=tree[k].xor_=val;return;}int mid=tree[k].l+tree[k].r>>1;if(mid>=pos)update(k<<1,pos,val);elseupdate(k<<1|1,pos,val);pushup(k);
}int querymin(int k,int l,int r)
{if(tree[k].r<l||tree[k].l>r)return inf;if(tree[k].r<=r&&tree[k].l>=l)return tree[k].mmin;return min(querymin(k<<1,l,r),querymin(k<<1|1,l,r));
}int queryxor(int k,int l,int r)
{if(tree[k].r<l||tree[k].l>r)return 0;if(tree[k].r<=r&&tree[k].l>=l)return tree[k].xor_;return queryxor(k<<1,l,r)^queryxor(k<<1|1,l,r);
}LL querysum(int k,int l,int r)
{if(tree[k].r<l||tree[k].l>r)return 0;if(tree[k].r<=r&&tree[k].l>=l)return tree[k].sum;return querysum(k<<1,l,r)+querysum(k<<1|1,l,r);
}int xor_n(int n)
{int temp=n&3;if(temp&1)return temp/2^1;return temp/2^n;
}bool check(int len,int mmin,int xor_,LL sum)
{int mmax=mmin+len-1;LL ssum=(1LL)*len*mmin+(1LL)*len*(len-1)/2;if(ssum!=sum)return false;int _xor_=xor_n(mmax)^xor_n(mmin-1);if(_xor_!=xor_)return false;return true;
}int main()
{int n,m;scanf("%d%d",&n,&m);build(1,1,n);while(m--){int op,x,y;scanf("%d%d%d",&op,&x,&y);if(op==1)update(1,x,y);else{int mmin=querymin(1,x,y);int xor_=queryxor(1,x,y);LL sum=querysum(1,x,y);if(check(y-x+1,mmin,xor_,sum))printf("Yes\n");elseprintf("No\n");}}return 0;
}

中石油训练赛 - 小A盗墓(线段树+异或结论)相关推荐

  1. 中石油训练赛 - 小A进学校(唯一分解定理)

    题目链接:点击查看 题目大意:求k进制n的阶乘下末尾0的个数 题目分析:之前接触过10进制下求n的阶乘末尾0的个数,当时只知道需要求5出现的个数,但并不知道原理,公式是这样的: int ans=0; ...

  2. 中石油训练赛 - Check List(线段树维护偏序问题)

    题目大意:给出 n 个点,需要计算出满足下列条件的三元对 ( i , j , k ) 的数量: x[ i ] < x[ j ] < x[ k ] y[ k ] > y[ i ] &g ...

  3. 中石油训练赛 - Russian Dolls on the Christmas Tree(树上启发式合并/主席树)

    题目链接:点击查看 题目大意:给出一棵 n 个节点的树,以点 1 为根,现在对于每个节点作为根的子树求解:子树中有多少个编号不相交的连续子段,如:1 2 4 5 7,共有三个连续的段,分别为 [ 1 ...

  4. 中石油训练赛 - Watch Later(状压dp)

    题目链接:点击查看 题目大意: 给出一个长度为 n 的字符串,字符串中共有 k 种不同的字符,现在问删除掉所有字符的最小操作数,对于每种字符需要确定一个先后顺序,每次需要删除掉当前所有的这种字符才能去 ...

  5. 中石油训练赛 - Trading Cards(最大权闭合子图)

    题目大意:给出 n 个卡片,可以自由买卖,且价格都是相同的,再给出 m 个集合,如果已经得到了其中一个集合中的卡片,那么可以获得该集合的收益,问如何操作可以使得收益最大化 题目分析:最大权闭合子图的模 ...

  6. 中石油训练赛 - Bad Treap(数学)

    题目链接:点击查看 题目大意:给出笛卡尔树的定义,现在要求给出 n 个点对 ( x , sin( x ) ),使得笛卡尔树的高度尽可能大 题目分析:如果想让笛卡尔树的高度尽可能大,令其退化为一条链即可 ...

  7. 中石油训练赛 - sciorz画画(区间dp)

    题目描述 众所周知,sciorz会画画.某天,sciorz画了一个凸多边形,这个多边形的每个顶点都有一个权值a[i].sciorz觉得这个凸多边形不够美丽,于是他决定在n个点之间连线,最终用n-3条不 ...

  8. 中石油训练赛 - 奎奎画画(思维+并查集+离线处理)

    题目描述 "为你写诗,为你静止,为你做不可能的事",爱情是一种怪事,它让奎奎开始学习画画.奎奎认为一张画的艺术价值等于画上的白色联通块个数(当一个格子和它上下左右四个方向上的某个相 ...

  9. 中石油训练赛 - Block(二维前缀和+思维)

    题目描述 Alice得到了一张由n×m个黑白像素点组成的图片,她想要压缩这张图片.压缩图片的过程如下: 1.首先,选择一个正整数k(k>1),将图片划分成若干个k×k的小块.如果n,m不能被k整 ...

最新文章

  1. 【AS3代码】访问/修改XML子元素和属性
  2. web页面事件无响应,元素点击不到
  3. Web拾遗--字符集的困扰?
  4. 2021高考襄阳四中成绩查询,襄阳四中2020年高考成绩怎么样(高考喜报)
  5. 一颗站在技术边缘的土豆
  6. vs2010 sp1 安装 Silverlight4_Tools 提示 错误 解决办法
  7. JAVA中自己写的util中的chop,Java StringUtils.chop方法代碼示例
  8. IDEA的创建javaWeb工程以及修改默认的class文件输出
  9. 弱键(Weak Key, ACM/ICPC Seoul 2004, UVa1618)
  10. slideToggle使用
  11. Unity设置为中文
  12. Win10安装pdf虚拟打印机的方法
  13. excel怎么将文本转为数值
  14. CorelDRAW2022下载附带序列号安装教程
  15. java io 操作实例
  16. r4900g3系统安装linux_H3C UniServer R4900 G3
  17. 手机上可以拍一寸证件照吗
  18. Linux安装phpMywind
  19. 冰盾ARP防火墙V1.0 Build 80122
  20. 2019.11.4 英语学习

热门文章

  1. RabbitMQ direct交换机
  2. Spring AOP 源码分析-寻找入口
  3. 执行Bean 实例化
  4. 字节流写数据加异常处理
  5. Nacos配置中心-如何使用Nacos作为配置中心统一管理配置
  6. File类判断功能的方法
  7. StringBuilder的构造方法和append方法
  8. SpringBoot异常处理-@ControlleAdvice
  9. Tomcat集群快速入门:Nginx+Tomcat搭建集群
  10. 设计模式之_动态代理_06