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 ...
随机推荐
- Linux文件系统操作命令
Linux文件系统操作命令 文件系统操作命令: 1. cat:可以显示文件的内容(经常和more搭配使用),或将多个文件合并成一个文件. 2. chgrp:用来改变文件或目录所属的用户组,命令的参数以 ...
- 半平面交 (poj 1279(第一道半平面NlogN)完整注释 )
半平面交的O(nlogn)算法(转载) 求n个半平面的交有三种做法: 第一种就是用每个平面去切割已有的凸多边形,复杂度O(n^2). 第二种就是传说中的分治算法.将n个半平面分成两个部分,分别求完交之 ...
- css总结9:内边距(padding)和外边距(margin)
1 css总结9:内边距和外边距 通过css总结8:盒子模型可知:内边距(padding),外边距(margin).可以影响盒子在浏览器的位置. 1.1 padding使用:{padding:上 右 ...
- Http Live Streaming 实现iphone在线播放视频[转]
http://hi.baidu.com/lphack/item/83865611c5f82c8988a956df 本人新手,难免会出错,请各位指点! 最近要做一个项目,是通过iphone来播放工厂摄像 ...
- 解决Spring Boot(2.1.3.RELEASE)整合spring-data-elasticsearch3.1.5.RELEASE报NoNodeAvailableException[None of the configured nodes are available
Spring Boot(2.1.3.RELEASE)整合spring-data-elasticsearch3.1.5.RELEASE报NoNodeAvailableException[None of ...
- kubernetes api文档
http://kubernetes.kansea.com/docs/api-reference/v1/definitions/
- postgresql删除活动链接的数据库
当我们在使用drop database testdb命令删除数据库时,会提示该数据库正在被使用,这样我们就无法删除,此时我们可以通过如下语句断开该数据库的所有链接: SELECT pg_termina ...
- [51nod]1229 序列求和 V2(数学+拉格朗日差值)
题面 传送门 题解 这种颓柿子的题我可能死活做不出来-- 首先\(r=0\)--算了不说了,\(r=1\)就是个裸的自然数幂次和直接爱怎么搞怎么搞了,所以以下都假设\(r>1\) 设 \[s_p ...
- model中的Meta类
通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(models.Model): bar = models.CharFi ...
- 图层锁定vlisp函数高版本图元自动淡色显示
(defun c:tt(/ obj) (sk_layerLock (getvar "clayer") nil) (princ) ) ;;;name:sk_layerLock ;;; ...