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 ...
随机推荐
- [LeetCode]题解(python):010-Regular Expression Matching
题目来源: https://leetcode.com/problems/regular-expression-matching/ 题意分析: 这道题目定义了两个正则表达式规则.’.’代表任意字符,’* ...
- HTML 5 drag and drop 简介
Html 5 drag and drop 简介 HTML5提供了专门拖拽和拖放的API draggable属性 启用拖拽 draggable属性是否可被拖拽, 可选值: true, false, au ...
- 你会用shuffle打乱列表吗?
在网站上我们经常会看到关键字云(Word Cloud)和标签云(Tag Cloud),用于表明这个关键字或标签是经常被查阅的,而且还可以看到这些标签的动态运动,每次刷新都会有不一样的关键字或便签,让浏 ...
- nova的wsgi介绍【WIP】
有关openstack的所有的帖子. https://www.ustack.com/blog/openstack_hacker/#Nova_Workflow 网上已经很多的分析文章了: http:// ...
- Java反射-简单应用
为了程序更好的维护和扩展,在面向对象思维的世界里,首先是面向接口编程,然后我们应该把做什么和怎么做进行分离. 以下我将用一个开晚会的样例来演示一下,终于达到的效果是:工厂+反射+配置文件实现程序的灵活 ...
- Struts2.x教程(一) Struts2介绍
一.Struts2是什么 Struts2是在WebWork2基础发展而来的.和Struts1一样, Struts2也是基于MVC的web层框架. 那么既然有了Struts1,为何还要Struts2? ...
- 通过pull解析器操作安卓的xml
通过pull解析器操作安卓的xml 例子定义了一个javabean用于存放上面解析出来的xml内容, 这个javabean为Person,代码请见本页下面备注: =================== ...
- asp.net 向后台提交 html 代码段 包括 <> 标签
首先 在默认情况向标签类的东西是不会让你提交的 这是出于.net 的默认安全机制 我们要先在 <%@ page %> 里边加上 ValidateRequest="false&q ...
- oracle 11g常用命令
1.监听启动监听lsnrctl start停止监听 lsnrctl stop 查看监听状态 lsnrctl status 2.启动用oracle用户进入su - oracle运行sqlplus命令,进 ...
- 【百度地图API】获取行政区域的边界
);map.addControl(new BMap.NavigationControl({type: BMAP_NAVIGATION_CONTROL_SMALL}));map.enableScroll ...