Transformation HDU - 4578

题意:

选定一段连续区间[l,r],有三种操作:
操作1:对区间内值+c
操作2:对区间内值*c
操作3:将区间内的值都改为c
操作4:查询区间内每个数p次方的和
p=1,2,3

题解:

参考题解
加强版线段树,对于本题需要三个标记,add的加法标记,mul的乘法标记,alt的修改标记,因为p=1,2,3,所以我们用sum1,sum2,sum3分别表示一次方和,平方和,立方和
然后我们要确定标记的优先级,alt第一,mul第二,add第三,pushdown要按照这样的顺序下压标记
当传来add标记时,更新自身时,要注意计算sum3,sum2,sum1的先后顺序,因为sum3的计算需要sum2和sum1,sum2的计算需要sum1
这三个sum的计算方法:

sum3 = ( sum3%MOD + 3*x%MOD*sum2%MOD + 3*x%MOD*x%MOD*sum1%MOD + (r-l+1)*x%MOD*x%MOD*x%MOD ) % MOD;
sum2 = ( sum2%MOD + 2*x%MOD*sum1%MOD + (r-l+1)%MOD*x%MOD*x%MOD ) % MOD;
sum1 = ( sum1%MOD + (r-l+1)%MOD*x%MOD ) % MOD;

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100000+10;
const int MOD=10007;int n,m;/********************************* Segment Tree - st *********************************/
struct Node
{int l,r;int sum1,sum2,sum3;int add,mul,alt;void Update_Alt(int x){x%=MOD;sum1 = (r-l+1) * x % MOD;sum2 = (r-l+1) * x % MOD * x % MOD;sum3 = (r-l+1) * x % MOD * x % MOD * x % MOD;alt=x;add=0;mul=1;}void Update_Mul(int x){x%=MOD;sum1 = sum1 % MOD * x % MOD;sum2 = sum2 % MOD * x % MOD * x % MOD;sum3 = sum3 % MOD * x % MOD * x % MOD * x % MOD;mul = mul % MOD * x % MOD;add = add % MOD * x % MOD;}void Update_Add(int x){x%=MOD;sum3 = ( sum3%MOD + 3*x%MOD*sum2%MOD + 3*x%MOD*x%MOD*sum1%MOD + (r-l+1)*x%MOD*x%MOD*x%MOD ) % MOD;sum2 = ( sum2%MOD + 2*x%MOD*sum1%MOD + (r-l+1)%MOD*x%MOD*x%MOD ) % MOD;sum1 = ( sum1%MOD + (r-l+1)%MOD*x%MOD ) % MOD;add=(add%MOD+x)%MOD;}
}node[4*maxn];
void Pushdown(int root)
{int ls=root*2, rs=root*2+1;if(node[root].alt!=0){node[ls].Update_Alt(node[root].alt);node[rs].Update_Alt(node[root].alt);node[root].alt=0;}if(node[root].mul!=1){node[ls].Update_Mul(node[root].mul);node[rs].Update_Mul(node[root].mul);node[root].mul=1;}if(node[root].add!=0){node[ls].Update_Add(node[root].add);node[rs].Update_Add(node[root].add);node[root].add=0;}
}
void Pushup(int root)
{int ls=root*2, rs=root*2+1;node[root].sum1=(node[ls].sum1+node[rs].sum1)%MOD;node[root].sum2=(node[ls].sum2+node[rs].sum2)%MOD;node[root].sum3=(node[ls].sum3+node[rs].sum3)%MOD;
}
void Build(int root,int l,int r) //对区间[l,r]建树
{if(l>r) return;node[root].l=l; node[root].r=r;node[root].sum1=0;node[root].sum2=0;node[root].sum3=0;node[root].alt=0;node[root].add=0;node[root].mul=1;if(l<r){int mid=l+(r-l)/2;Build(root*2,l,mid);Build(root*2+1,mid+1,r);Pushup(root);}
}
void Alt(int root,int st,int ed,ll val) //区间[st,ed]全部改成val
{if(st>node[root].r || ed<node[root].l) return;0-9【‘- if(st<=node[root].l && node[root].r<=ed) node[root].Update_Alt(val);else{Pushdown(root);Alt(root*2,st,ed,val);Alt(root*2+1,st,ed,val);Pushup(root);}
}
void Mul(int root,int st,int ed,ll val) //区间[st,ed]全部乘val
{if(st>node[root].r || ed<node[root].l) return;if(st<=node[root].l && node[root].r<=ed) node[root].Update_Mul(val);else{Pushdown(root);Mul(root*2,st,ed,val);Mul(root*2+1,st,ed,val);Pushup(root);}
}
void Add(int root,int st,int ed,ll val) //区间[st,ed]全部加上val
{if(st>node[root].r || ed<node[root].l) return;if(st<=node[root].l && node[root].r<=ed) node[root].Update_Add(val);else{Pushdown(root);Add(root*2,st,ed,val);Add(root*2+1,st,ed,val);Pushup(root);}
}
int Query(int root,int st,int ed,int p) //查询区间[st,ed]的p次方和
{if(st>node[root].r || ed<node[root].l) return 0;if(st<=node[root].l && node[root].r<=ed){if(p==1) return node[root].sum1;if(p==2) return node[root].sum2;if(p==3) return node[root].sum3;}else{Pushdown(root);int ls=Query(root*2,st,ed,p)%MOD;int rs=Query(root*2+1,st,ed,p)%MOD;Pushup(root);return (ls+rs)%MOD;}
}
/********************************* Segment Tree - st *********************************/int main()
{while(scanf("%d%d",&n,&m) && n*m!=0){Build(1,1,n);for(int i=1;i<=m;i++){int op; scanf("%d",&op);if(op==1){int x,y,k;scanf("%d%d%d",&x,&y,&k);Add(1,x,y,k);}if(op==2){int x,y,k;scanf("%d%d%d",&x,&y,&k);Mul(1,x,y,k);}if(op==3){int x,y,k;scanf("%d%d%d",&x,&y,&k);Alt(1,x,y,k);}if(op==4){int l,r,p;scanf("%d%d%d",&l,&r,&p);printf("%d\n",Query(1,l,r,p));}}}
}

Transformation HDU - 4578相关推荐

  1. hdu 4578 Transformation(线段树)

    线段树上的多操作... 题目大意: 树上 的初始值为0,然后有下列三种操作和求和. 1  x y c  在X-Y的之间全部加上C. 2  x y c  在X-Y的之间全部乘上C. 3  x y c   ...

  2. hdu 4578 Transformation

    比较裸的线段树,但是写起来比较烦,昨天无限wrong+TLE.后来发现写的实在太麻烦,只好推倒重写-- 这题主要问题就是处理乘和加的操作,其实这两个操作可以看成一个,乘看成a*c+0,加看成a*1+c ...

  3. Transformation HDU - 6726(百度之星复赛2019 dfs)

    给你一个二元组(a,b)(a,b),支持AB两种操作,分别是将其变成(a,2b−a)(a,2b−a)和(2a−b,b)(2a−b,b).问能否通过大于等于零次操作将其变成(c,d). Input 第一 ...

  4. Codeforces Round #759 (Div. 2, based on Technocup 2022 Elimination Round 3)

    感觉E思路明确只用了stl+树状数组,F线段树复合修改,为什么都是2400. A. Life of a Flower B. Array Eversion C. Minimize Distance E. ...

  5. 线段树 --算法竞赛专题解析(24)

    本系列文章将于2021年整理出版.前驱教材:<算法竞赛入门到进阶> 清华大学出版社 网购:京东 当当   作者签名书:点我 有建议请加QQ 群:567554289 文章目录 1. 线段树概 ...

  6. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  7. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  8. kuangbin带你飞 专题1-23 题单

    kuangbin大神,对于打过ACM比赛的ACMer,无人不知无人不晓. 在此,附上vjudge平台上一位大神整理的[kuangbin带你飞]专题目录链接. [kuangbin带你飞专题目录1-23] ...

  9. 老鱼的-kuangbin专题题解

    kuangbin专题问题一览 专题一 简单搜索 POJ 1321 棋盘问题 POJ 2251 Dungeon Master POJ 3278 Catch That Cow POJ 3279 Flipt ...

最新文章

  1. 16_python_面向对象
  2. C#多线程编程(1)--线程,线程池和Task
  3. Python3.7.1学习(五) 将列表中的元素转化为数字并排序
  4. 步进电机编写单4拍或4-8拍方式的汇编或c语言控制程序.,(毕业设计)基于单片机的步进电机控制系统(汇编及C语言程序各个)...
  5. 教你怎么上传本地代码到github
  6. QT学习笔记(1)----- QT简介
  7. Leetcode--31. 下一个排列
  8. 2017级C语言大作业 - 元气骑士
  9. mysql 交互式和非交互式操作(interactive_timeout和wait_timeout)
  10. 免费PR转场下载 PR形状过渡视频转场MOGRT
  11. 横空出世 | Limelight宣布收购雅虎的Edgecast,打造全球边缘软件解决方案领导者Edgio
  12. java基础热门侠客养成_侠客养成手册攻略大全 新手攻略开局任务流程汇总[多图]...
  13. IE6下position:fixed;兼容
  14. java 断点跳到注释,一个空指针异常,代码如下,打了断点,一到“TOPICID”那里(在下方注释4那里)就抛异常-_-||...
  15. 测试用例设计-淘宝购物车,微信发红包
  16. 互联网大厂办公楼图鉴
  17. win10修复引导工具怎么用【系统天地】
  18. 学生-课程数据库—初识sql语句(04)(注释版)
  19. 默哀STAND SILENTLY!
  20. 广西省谷歌地球高程DEM等高线下载

热门文章

  1. 现在的男生真的太惨了
  2. mysql 中有什么命令_常用mysql命令大全
  3. 频谱分析幅值单位_案例分享丨某水泥厂入窑斗提减速机不对中故障分析及处理...
  4. 润乾报表分组求和_实现报表数据预先计算
  5. gather torch_浅谈Pytorch中的torch.gather函数的含义
  6. 机器学习与气象数据_气象大数据与机器学习联合实验室 大数据和气象的“联姻”...
  7. php云点播源码,乐视云直播 点播服务端api
  8. 解决Java当中 用point 画图时背景颜色变成黑色问题
  9. android交叉编译libxml2,Openwrt 交叉编译libxml2(示例代码)
  10. 蓝桥杯2016初赛-有奖猜谜-模拟