HDU 5828 Rikka with Sequence(线段树)
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5828
【题目大意】
给出一个数列,要求支持区间加法,区间开方和区间和查询操作。
【题解】
考虑开方后会出现成片相同的数字,因此我们在每个区间额外维护区间内数字是否相同的tag,如果区间内数字均相同,那么开方就可以转化为减法的标记,即t=sqrt(t)转化为tag=sqrt(t)-t。剩下就是简单的标记维护了。
【代码】
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=2000000;
struct node{int l,r,f,a,b;long long tag,max,val;}T[N];
int cas,tot,n,m,l,r,c,op,num;
void addtag(int x,int tag){
T[x].tag+=tag;
T[x].max+=tag;
T[x].val+=(long long)tag*(T[x].b-T[x].a+1);
}
void pb(int x){
if(T[x].l){addtag(T[x].l,T[x].tag);addtag(T[x].r,T[x].tag);}
T[x].tag=0;
}
void up(int x){
T[x].max=max(T[T[x].l].max,T[T[x].r].max);
T[x].val=T[T[x].l].val+T[T[x].r].val;
if(T[T[x].l].f&&T[T[x].r].f&&T[T[x].l].max==T[T[x].r].max)T[x].f=1;
else T[x].f=0;
}
void build(int l,int r){
int x=++tot;
T[x].a=l;T[x].b=r;T[x].f=0;
T[x].tag=T[x].l=T[x].r=T[x].max=T[x].val=0;
if(l==r){T[x].f=1;scanf("%lld",&T[x].val);T[x].max=T[x].val;return;}
int mid=(l+r)>>1;
T[x].l=tot+1;build(l,mid);
T[x].r=tot+1;build(mid+1,r);
up(x);
}
void change(int x,int a,int b,int p){
if(T[x].a>=a&&T[x].b<=b){addtag(x,p);return;}
if(T[x].tag)pb(x); int mid=(T[x].a+T[x].b)>>1;
if(mid>=a&&T[x].l)change(T[x].l,a,b,p);
if(mid<b&&T[x].r)change(T[x].r,a,b,p);up(x);
}
long long query_sum(int x,int a,int b){
if(T[x].a>=a&&T[x].b<=b)return T[x].val;
if(T[x].tag)pb(x);int mid=(T[x].a+T[x].b)>>1;long long res=0;
if(mid>=a&&T[x].l)res+=query_sum(T[x].l,a,b);
if(mid<b&&T[x].r)res+=query_sum(T[x].r,a,b);
return res;
}
void Tsqrt(int x,int a,int b){
if(T[x].a>=a&&T[x].b<=b){
if(T[x].f){
long long t=T[x].max;
t=sqrt(t);
addtag(x,t-T[x].max);
return;
}
}if(T[x].tag)pb(x); int mid=(T[x].a+T[x].b)>>1;
if(mid>=a&&T[x].l)Tsqrt(T[x].l,a,b);
if(mid<b&&T[x].r)Tsqrt(T[x].r,a,b);up(x);
}
int main(){
scanf("%d",&cas);
while(cas--){
scanf("%d%d",&n,&m);
build(1,n);tot=0;
while(m--){
scanf("%d",&op);
if(op==1){
scanf("%d%d%d",&l,&r,&num);
change(1,l,r,num);
}else if(op==2){
scanf("%d%d",&l,&r);
Tsqrt(1,l,r);
}else{
scanf("%d%d",&l,&r);
printf("%lld\n",query_sum(1,l,r));
}
}
}return 0;
}
HDU 5828 Rikka with Sequence(线段树)的更多相关文章
- hdu 5828 Rikka with Sequence 线段树
Rikka with Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...
- HDU 5828 Rikka with Sequence (线段树+剪枝优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5828 给你n个数,三种操作.操作1是将l到r之间的数都加上x:操作2是将l到r之间的数都开方:操作3是 ...
- HDU 5828 Rikka with Sequence(线段树区间加开根求和)
Problem DescriptionAs we know, Rikka is poor at math. Yuta is worrying about this situation, so he g ...
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence
// 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence // 题意:三种操作,1增加值,2开根,3求和 // 思路:这题与HDU 4027 和HDU 5634 ...
- HDU 5828 Rikka with Sequence (线段树)
Rikka with Sequence 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...
- HDU 5828 Rikka with Sequence(线段树 开根号)
Rikka with Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- hdu 4893 Wow! Such Sequence!(线段树)
题目链接:hdu 4983 Wow! Such Sequence! 题目大意:就是三种操作 1 k d, 改动k的为值添加d 2 l r, 查询l到r的区间和 3 l r. 间l到r区间上的所以数变成 ...
- HDU 6089 Rikka with Terrorist (线段树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6089 题解 这波强行维护搞得我很懵逼... 扫描线,只考虑每个点能走到左上方(不包括正上方,但包括正左 ...
- HDU 5634 Rikka with Phi 线段树
题意:bc round 73 div1 D 中文题面 分析:注意到10^7之内的数最多phi O(log(n))次就会变成1, 因此可以考虑把一段相同的不为1的数缩成一个点,用平衡树来维护. 每次求p ...
随机推荐
- [整理]DLL延时加载 && 设置进程私有环境变量
DLL延时加载鉴于静态和动态加载之间,即无需在代码中显示加载但它内队依然是动态加载的方式只是系统帮处理了.这样做好处是: 1. 可以加快启动时间(因为它是动态加载在需要的时间加载), 2. 减小编写L ...
- centos安装中文支持(转)
安装中文支持包. yum install fonts-chineseyum install fonts-ISO8859-2 -------- 一.安装中文支持方法1.在安装光盘中找到一下包进行安装.r ...
- 用JavaScript获取地址栏参数的方法
/** * 获取地址栏参数 * * @example GetUrlString('id') * * @desc 调用时加上判断,保证程序不会出错 * var myurl = GetUrlString( ...
- js私有化属性
我们先来看一个例子: var Demo1 = function(val){ this.value = val; this.getValue = function(){ return this.valu ...
- linux使用工具记录
linux工具查询手册: http://linuxtools-rst.readthedocs.io/zh_CN/latest/index.html
- Orchard 源码探索(Log)
简单工厂模式.抽象工厂模式和适配器模式 依赖倒置原则也叫依赖倒转原则,Dependence Inversion Principle,对抽象进行编程,不要对实现进行编程. A.高层次的模块不应该依赖于低 ...
- Apache commons (Java常用工具包)简介
Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...
- 详述USB OTG发展及协议标准
USB On-The-Go 扩大了USB 的应用领域,将USB 从传统的PC 与外设通讯的模式,扩展到移动电子和嵌入式领域中,抛开主机PC,实现通常的外设与外设之间点对点(Point to Point ...
- [Leetcode][Python]22: Generate Parentheses
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 22: Generate Parentheseshttps://oj.leet ...
- 特卖电商俏物悄语或面临破产 ihush域名夭折?:域名新闻:域名门户:eName.CN
特卖电商俏物悄语或面临破产 ihush域名夭折?:域名新闻:域名门户:eName.CN 特卖电商俏物悄语或面临破产 ihush域名夭折?