题目描述:

给你一个长度为n的最开始为0的数以及m个更新操作以及数据生成器参数X,Y,Z。每次操作,将由数据生成器生成出li,ri,vi。让你从区间[li,ri]中,将所有小于vi的数变为vi。最后让你求从1到n的 i*ai的亦或和。

分析:区间操作优先考虑线段树 , 那线段树存储什么数值呢? 我们知道如果l ,r 的最大值<=val , 那整个l区间都要改成val , 如果最小值>=val  那这个区间就不用修改 ; 那不是这种情况怎么办呢?不可能是for一遍吧 , 其实只要一次跟新操作就好 , 线段树的区间更新是将整课树都遍历一遍 ,所以我们只要在遍历的过程中判断是否到达叶子结点就好拉;

  1. #include <iostream>
  2. #include <string.h>
  3. #include <algorithm>
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include <queue>
  7. #define MAXN 5000001
  8. #define inf 0x3f3f3f3f
  9.  
  10. using namespace std;
  11. unsigned int x,y,z,w,v,b[MAXN*];
  12. int n,m;
  13. long long ans;
  14. unsigned int fun()
  15. {
  16. x=x^(x<<);
  17. x=x^(x>>);
  18. x=x^(x<<);
  19. x=x^(x>>);
  20. w=x^(y^z);
  21. x = y ; y = z ; z = w;
  22. return z;
  23. }
  24. struct node{
  25. int l,r;//区间[l,r]
  26. int add;//区间的延时标记
  27. int mx; //区间最大值
  28. int mn; //区间最小值
  29. }tree[MAXN<<];//一定要开到4倍多的空间
  30.  
  31. void pushup(int index){
  32. tree[index].mx = max(tree[index<<].mx,tree[index<<|].mx);
  33. tree[index].mn = min(tree[index<<].mn,tree[index<<|].mn);
  34. }
  35. void pushdown(int index){
  36. //说明该区间之前更新过
  37. //要想更新该区间下面的子区间,就要把上次更新该区间的值向下更新
  38. if(tree[index].add > ){
  39. //替换原来的值
  40.  
  41. tree[index<<].mx = tree[index].add;
  42. tree[index<<|].mx = tree[index].add;
  43. tree[index<<].mn = tree[index].add;
  44. tree[index<<|].mn = tree[index].add;
  45. tree[index<<].add = tree[index].add;
  46. tree[index<<|].add = tree[index].add;
  47. tree[index].add = ;
  48.  
  49. }
  50. }
  51. void build(int l,int r,int index){
  52. tree[index].l = l;
  53. tree[index].r = r;
  54. tree[index].add = ;//刚开始一定要清0
  55. if(l == r){
  56.  
  57. tree[index].mn = tree[index].mx = ;
  58. return ;
  59. }
  60. int mid = (l+r)>>;
  61. build(l,mid,index<<);
  62. build(mid+,r,index<<|);
  63. pushup(index);
  64. }
  65. void updata(int l,int r,int index,int val){
  66.  
  67. if(tree[index].l==tree[index].r)///到达叶子节点
  68. {
  69. tree[index].mn=max(tree[index].mn , val);
  70. tree[index].mx=max(tree[index].mx , val);
  71. return ;
  72. }
  73. if(l <= tree[index].l && r >= tree[index].r){
  74.  
  75. if(tree[index].mx<=val)
  76. {
  77. tree[index].mn = val;
  78. tree[index].mx = val;
  79. tree[index].add = val;//延时标记
  80. return ;
  81. }
  82. if(tree[index].mn>=val) return ;
  83. }
  84. if(tree[index].mn>=val) return ;
  85. pushdown(index);
  86. int mid = (tree[index].l+tree[index].r)>>;
  87. if(l <= mid){
  88. updata(l,r,index<<,val);
  89. }
  90. if(r > mid){
  91. updata(l,r,index<<|,val);
  92. }
  93. pushup(index);
  94. }
  95. int query(int l,int r,int index,int pos){
  96. if(l==r)
  97. {
  98. return tree[index].mn;
  99. }
  100. int mid=(l+r)>>;
  101. pushdown(index);
  102. if(pos<=mid) return query(l,mid , index<< , pos);
  103. else return query(mid+,r ,index<<| , pos);
  104. }
  105. int main()
  106. {
  107.  
  108. int t,l,r;
  109. scanf("%d",&t);
  110. while(t--)
  111. {
  112. scanf("%d%d%u%u%u",&n , &m , &x , &y , &z);
  113. build(,n,);
  114. for(int i= ; i<=max(n,*m) ; i++)///数据生成器
  115. b[i] = fun();
  116. for(int i= ; i<=m ; i++)
  117. {
  118. l = min(b[*i-]%n+ , b[*i-]%n+);
  119. r = max(b[*i-]%n+ , b[*i-]%n+);
  120. v = b[*i]%(<<);
  121. updata(l,r,,v);
  122. }
  123. ans=;
  124. for(int i= ; i<=n ; i++)
  125. ans^=(long long)i*query(,n,,i);
  126. printf("%lld\n",ans);
  127. }
  128.  
  129. return ;
  130. }

HDU 6356 (线段树-l,r 之间小于val 的变val+单点求值)的更多相关文章

  1. hdu 5124(区间更新+单点求值+离散化)

    lines Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. UPC 2224 Boring Counting (离线线段树,统计区间[l,r]之间大小在[A,B]中的数的个数)

    题目链接:http://acm.upc.edu.cn/problem.php?id=2224 题意:给出n个数pi,和m个查询,每个查询给出l,r,a,b,让你求在区间l~r之间的pi的个数(A< ...

  3. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. hdu 1542 线段树扫描(面积)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  6. hdu 1828 线段树扫描线(周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. hdu 3954 线段树 (标记)

    Level up Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. HDU 4902 (线段树)

    Problem Nice boat(HDU 4902) 题目大意 维护一个序列,两种操作. 第一种操作,将一段区间[l,r]赋值为x. 第二种操作,将一段区间[l,r]中大于等于x的数与x求gcd. ...

  9. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

随机推荐

  1. 基于Nginx实现集群原理

    1)安装Nginx 2)配置多个Tomcat,并修改端口号(两个端口号不一样即可) 3)在Nginx的Nginx.conf添加如下配置:

  2. c语言实践 统计输入的一串正整数里面奇数和偶数的个数

    怎么考虑这个问题. 首先先确定肯定是需要一个变量保存输入的数据的,我们叫它input,最后结果要的是个数,所以需要另外两个变量来保存奇数的个数和偶数的个数. int input int countJ ...

  3. setnx()

    setnx(key,value):当指定的key不存在时,为你设置指定的值

  4. using JSTL

    http://docs.oracle.com/javaee/5/tutorial/doc/bnake.html JSTL(JSP Standard Tag Library)

  5. Struts2 配置及运行时遇到问题

    1.java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilt ...

  6. Python Lambda 的简单用法

    下面代码简单举例介绍以下 lambda的用法. from functools import reduce #1 python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而de ...

  7. 使用java实现单链表----(java中的引用就是指针)

    //一直以为java中没有指针,其实java的引用就是指针,只不过堆栈中的引用储存了在堆中的地址,可以看做java中的指针.public class sibgleLink<E> { // ...

  8. SignalR 跨域解决方案全面

    SignalR 分:PersistentConnection和Hub 2种模式. 跨域又分:UseCors和JsonP  2种方法 所以例子写了4种. 核心代码: UseCors //Persiste ...

  9. Lua入门(一)

    嵌入式语言 作为一门扩展式语言,Lua 没有 "main" 程序的概念: 它只能 嵌入 一个宿主程序中工作, 该宿主程序被称为 被嵌入程序 或者简称 宿主 . 宿主程序可以调用函数 ...

  10. 基于 cookie 的 node 中间层灰度流程的一些思考

    此文已由作者申国骏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 关于灰度发布的意义此处就不进行介绍了,可以先读下这两篇文章 <微服务部署:蓝绿部署.滚动部署.灰 ...