HDU 6356 (线段树-l,r 之间小于val 的变val+单点求值)
题目描述:
给你一个长度为n的最开始为0的数以及m个更新操作以及数据生成器参数X,Y,Z。每次操作,将由数据生成器生成出li,ri,vi。让你从区间[li,ri]中,将所有小于vi的数变为vi。最后让你求从1到n的 i*ai的亦或和。
分析:区间操作优先考虑线段树 , 那线段树存储什么数值呢? 我们知道如果l ,r 的最大值<=val , 那整个l区间都要改成val , 如果最小值>=val 那这个区间就不用修改 ; 那不是这种情况怎么办呢?不可能是for一遍吧 , 其实只要一次跟新操作就好 , 线段树的区间更新是将整课树都遍历一遍 ,所以我们只要在遍历的过程中判断是否到达叶子结点就好拉;
- #include <iostream>
- #include <string.h>
- #include <algorithm>
- #include <stdio.h>
- #include <math.h>
- #include <queue>
- #define MAXN 5000001
- #define inf 0x3f3f3f3f
- using namespace std;
- unsigned int x,y,z,w,v,b[MAXN*];
- int n,m;
- long long ans;
- unsigned int fun()
- {
- x=x^(x<<);
- x=x^(x>>);
- x=x^(x<<);
- x=x^(x>>);
- w=x^(y^z);
- x = y ; y = z ; z = w;
- return z;
- }
- struct node{
- int l,r;//区间[l,r]
- int add;//区间的延时标记
- int mx; //区间最大值
- int mn; //区间最小值
- }tree[MAXN<<];//一定要开到4倍多的空间
- void pushup(int index){
- tree[index].mx = max(tree[index<<].mx,tree[index<<|].mx);
- tree[index].mn = min(tree[index<<].mn,tree[index<<|].mn);
- }
- void pushdown(int index){
- //说明该区间之前更新过
- //要想更新该区间下面的子区间,就要把上次更新该区间的值向下更新
- if(tree[index].add > ){
- //替换原来的值
- tree[index<<].mx = tree[index].add;
- tree[index<<|].mx = tree[index].add;
- tree[index<<].mn = tree[index].add;
- tree[index<<|].mn = tree[index].add;
- tree[index<<].add = tree[index].add;
- tree[index<<|].add = tree[index].add;
- tree[index].add = ;
- }
- }
- void build(int l,int r,int index){
- tree[index].l = l;
- tree[index].r = r;
- tree[index].add = ;//刚开始一定要清0
- if(l == r){
- tree[index].mn = tree[index].mx = ;
- return ;
- }
- int mid = (l+r)>>;
- build(l,mid,index<<);
- build(mid+,r,index<<|);
- pushup(index);
- }
- void updata(int l,int r,int index,int val){
- if(tree[index].l==tree[index].r)///到达叶子节点
- {
- tree[index].mn=max(tree[index].mn , val);
- tree[index].mx=max(tree[index].mx , val);
- return ;
- }
- if(l <= tree[index].l && r >= tree[index].r){
- if(tree[index].mx<=val)
- {
- tree[index].mn = val;
- tree[index].mx = val;
- tree[index].add = val;//延时标记
- return ;
- }
- if(tree[index].mn>=val) return ;
- }
- if(tree[index].mn>=val) return ;
- pushdown(index);
- int mid = (tree[index].l+tree[index].r)>>;
- if(l <= mid){
- updata(l,r,index<<,val);
- }
- if(r > mid){
- updata(l,r,index<<|,val);
- }
- pushup(index);
- }
- int query(int l,int r,int index,int pos){
- if(l==r)
- {
- return tree[index].mn;
- }
- int mid=(l+r)>>;
- pushdown(index);
- if(pos<=mid) return query(l,mid , index<< , pos);
- else return query(mid+,r ,index<<| , pos);
- }
- int main()
- {
- int t,l,r;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d%d%u%u%u",&n , &m , &x , &y , &z);
- build(,n,);
- for(int i= ; i<=max(n,*m) ; i++)///数据生成器
- b[i] = fun();
- for(int i= ; i<=m ; i++)
- {
- l = min(b[*i-]%n+ , b[*i-]%n+);
- r = max(b[*i-]%n+ , b[*i-]%n+);
- v = b[*i]%(<<);
- updata(l,r,,v);
- }
- ans=;
- for(int i= ; i<=n ; i++)
- ans^=(long long)i*query(,n,,i);
- printf("%lld\n",ans);
- }
- return ;
- }
HDU 6356 (线段树-l,r 之间小于val 的变val+单点求值)的更多相关文章
- hdu 5124(区间更新+单点求值+离散化)
lines Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 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< ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 1542 线段树扫描(面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- hdu 1828 线段树扫描线(周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu 3954 线段树 (标记)
Level up Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 4902 (线段树)
Problem Nice boat(HDU 4902) 题目大意 维护一个序列,两种操作. 第一种操作,将一段区间[l,r]赋值为x. 第二种操作,将一段区间[l,r]中大于等于x的数与x求gcd. ...
- 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 ...
随机推荐
- 基于Nginx实现集群原理
1)安装Nginx 2)配置多个Tomcat,并修改端口号(两个端口号不一样即可) 3)在Nginx的Nginx.conf添加如下配置:
- c语言实践 统计输入的一串正整数里面奇数和偶数的个数
怎么考虑这个问题. 首先先确定肯定是需要一个变量保存输入的数据的,我们叫它input,最后结果要的是个数,所以需要另外两个变量来保存奇数的个数和偶数的个数. int input int countJ ...
- setnx()
setnx(key,value):当指定的key不存在时,为你设置指定的值
- using JSTL
http://docs.oracle.com/javaee/5/tutorial/doc/bnake.html JSTL(JSP Standard Tag Library)
- Struts2 配置及运行时遇到问题
1.java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilt ...
- Python Lambda 的简单用法
下面代码简单举例介绍以下 lambda的用法. from functools import reduce #1 python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而de ...
- 使用java实现单链表----(java中的引用就是指针)
//一直以为java中没有指针,其实java的引用就是指针,只不过堆栈中的引用储存了在堆中的地址,可以看做java中的指针.public class sibgleLink<E> { // ...
- SignalR 跨域解决方案全面
SignalR 分:PersistentConnection和Hub 2种模式. 跨域又分:UseCors和JsonP 2种方法 所以例子写了4种. 核心代码: UseCors //Persiste ...
- Lua入门(一)
嵌入式语言 作为一门扩展式语言,Lua 没有 "main" 程序的概念: 它只能 嵌入 一个宿主程序中工作, 该宿主程序被称为 被嵌入程序 或者简称 宿主 . 宿主程序可以调用函数 ...
- 基于 cookie 的 node 中间层灰度流程的一些思考
此文已由作者申国骏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 关于灰度发布的意义此处就不进行介绍了,可以先读下这两篇文章 <微服务部署:蓝绿部署.滚动部署.灰 ...