http://acm.hdu.edu.cn/showproblem.php?pid=6562

题意:

q次操作

1.将第l~r个数的左边和和右边都加上一个数d, 使得这个数变成 dsiddsid的形式

2.询问区间和.

题解:对于一个数字x若执行第一个操作则  

则若对于一个区间sum(l,r)执行第一个操作则  

设 

则便可以用线段树去维护这两个东西便可,这里只考虑了d是一位数的情况,但是在线段树下传标记的过程中可能一个区间多次执行第一个操作,那么wrap的d便不是一位数,而且左右两边的d是镜像的,我们便要用两个lazy标记,lazy1维护左边加的数,lazy2维护右边加的数,同时可以用lazylen表示这两个lazy的,然后好好考虑一下如何维护sum和sumlen即可

个人感悟:在敲的时候思路是基本对的 , 但是我在维护 的时候 为了计算10的多少次幂,我维护的是一个长度 ,然后查询的时候,用一个阶乘的fac10[]数组 , 果然RE了 , 大神的代码, 发现别人维护的是一个10^(len)的值,其实细想也是,我们主要维护的就是这个,我居然多次了一举,太菜了我

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <queue>
#define MAXN 400010
#define inf 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=1e7+;
const int mod = 1e9+;
struct node{
int l,r; //区间[l,r]
LL addl,addr; //区间的延时标记
LL sum,laz,all; /// 区间和 laz增加位数 all=10^位数
}tree[MAXN<<];//一定要开到4倍多的空间
void pushup(int index) {
tree[index].sum = (tree[index<<].sum+tree[index<<|].sum)%mod;
tree[index].all = (tree[index<<].all+tree[index<<|].all)%mod;
}
void pushdown(int index) {
if(tree[index].laz > ) {
tree[index<<].addl = (tree[index].addl*tree[index<<].laz%mod + tree[index<<].addl%mod)%mod;
tree[index<<|].addl = (tree[index].addl*tree[index<<|].laz%mod + tree[index<<|].addl%mod)%mod; tree[index<<].addr = (tree[index<<].addr*tree[index].laz%mod + tree[index].addr%mod)%mod;
tree[index<<|].addr = (tree[index<<|].addr*tree[index].laz%mod+ tree[index].addr)%mod; tree[index<<].sum = (( tree[index<<].sum*tree[index].laz%mod
+ tree[index].addl*tree[index<<].all%mod*tree[index].laz%mod)%mod
+ tree[index].addr*(tree[index<<].r-tree[index<<].l+)%mod)%mod;
tree[index<<|].sum = ((tree[index<<|].sum*tree[index].laz%mod
+ tree[index].addl*tree[index<<|].all%mod*tree[index].laz%mod)%mod
+ tree[index].addr*(tree[index<<|].r-tree[index<<|].l+)%mod)%mod; tree[index<<].all = (tree[index<<].all*tree[index].laz%mod*tree[index].laz)%mod;
tree[index<<|].all = (tree[index<<|].all*tree[index].laz%mod*tree[index].laz)%mod;
tree[index<<].laz = tree[index].laz*tree[index<<].laz%mod;
tree[index<<|].laz = tree[index].laz*tree[index<<|].laz%mod;
tree[index].laz = ; tree[index].addl = ;
tree[index].addr = ;
} }
void build(int l,int r,int index){
tree[index].sum = ;
tree[index].l = l; tree[index].r = r;
tree[index].addl = tree[index].addr = ;
tree[index].laz = ;//刚开始一定要清0
if(l == r) {
tree[index].all = ;
return ;
}
int mid = (l+r)>>;
build(l,mid,index<<);
build(mid+,r,index<<|);
pushup(index);
}
void update(int l,int r,int index,LL val) {
if(l <= tree[index].l && r >= tree[index].r) {
tree[index].sum = ((tree[index].sum*%mod
+ val*(tree[index].r-tree[index].l+)%mod)%mod
+ val**tree[index].all %mod )%mod ;
tree[index].all = tree[index].all*%mod;
tree[index].addl = (val*tree[index].laz%mod + tree[index].addl)%mod;
tree[index].laz = tree[index].laz*%mod;
tree[index].addr = (tree[index].addr*%mod + val)%mod;
return ;
}
pushdown(index);
int mid = (tree[index].l+tree[index].r)>>;
if(l <= mid) update(l,r,index<<,val);
if(r > mid) update(l,r,index<<|,val);
pushup(index);
}
LL query(int l,int r,int index) {
if(l <= tree[index].l && r >= tree[index].r) {
return tree[index].sum;
}
pushdown(index);
int mid = (tree[index].l+tree[index].r)>>;
LL ans = ;
if(l <= mid) ans = (ans+query(l,r,index<<))%mod;
if(r > mid) ans = (ans+query(l,r,index<<|))%mod;
return ans;
}
int main()
{
int _; scanf("%d",&_);
for(int ncase=;ncase<=_;ncase++) {
int n,m; scanf("%d%d",&n,&m);
printf("Case %d:\n",ncase);
build(,n,);
while(m--) {
char s[]; scanf("%s",s);
int l,r,v; scanf("%d%d",&l,&r);
if(s[]=='w') {
scanf("%d",&v); update(l,r,,v);
} else {
printf("%lld\n",query(l,r,));
}
}
}
return ;
}

2018 CCPC 吉林站 H Lovers || HDU 6562 (线段树哦)的更多相关文章

  1. 2018 CCPC 吉林站 H Lovers

    2018 CCPC 吉林站 H Lovers 传送门:https://www.spoj.com/problems/LIS2/en/ 题意: q次操作 1.将第l~r个数的左边和和右边都加上一个数d, ...

  2. 2018 CCPC 桂林站(upc复现赛)补题

    2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...

  3. 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 ...

  4. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  7. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  9. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

随机推荐

  1. C# DropDownList绑定添加新数据的三种方法

    一.在前台手动绑定 <asp:DropDownList ID="DropDownList1" runat="server">    <asp: ...

  2. 如何实现动态水球图 --》 echars结合echarts-liquidfill实现

    1)项目中作为项目依赖,安装到项目当中(注意必须要结合echars) npm install echarts vue-echarts --save npm install echarts-liquid ...

  3. 2019春第十一周作业Compile Summarize

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 这里 我在这个课程的目标是 能按自己的想法解出题目 这个作业在那个具体方面帮助我实现目标 能朝着软件工程师方向发展 参考文献与网址 C语言 ...

  4. instanceof和getClass的区别

    instanceof对比getClass: instanceof 比较的是继承关系或者实现关系的类类型,子类对象或者实现类对象放在前面:而getClass得到的是确切的类型,并不考虑继承,它判断的是引 ...

  5. Spring Boot & Restful API 构建实战!

    作者:liuxiaopeng https://www.cnblogs.com/paddix/p/8215245.html 在现在的开发流程中,为了最大程度实现前后端的分离,通常后端接口只提供数据接口, ...

  6. 《剑指offer》面试题14 调整数组顺序使奇数位于偶数前面 Java版

    (输入整数数组,使所有奇数位于前半部分,所有偶数位于后半部分.) 我的方法:想到用两个下标分别表示奇数和偶数的界线,一个在开头,一个在末尾,判断每一个数字的类别,然后将它放入对应的范围内,移动下标,直 ...

  7. VS2017运行emwin模拟机不能运行的解决部分

    宇宙第一开发工具的功能太强大了,今天我们来介绍怎么解决VS2017的C++功能运行emwin模拟机不能运行的解决部分 编译软件:Visual Studio 2017:     emwin模拟机版本:S ...

  8. 【题解】Oh My Holy FFF

    题目大意   有\(n\)个士兵(\(1 \leq n \leq 10^5\)),第\(i\)个士兵的身高为\(h_{i}\),现在要求把士兵按照原来的顺序分成连续的若干组,要求每组的士兵数量不超过\ ...

  9. Python 中的 os 模块常见方法?

    os.remove() 删除文件 os.rename() 重命名文件 os.walk() 生成目录树下的所有文件名 os.chdir() 改变目录 os.mkdir/makedirs 创建目录/多层目 ...

  10. 创建带标签页的MDI WinForms应用程序

    http://www.cnblogs.com/island/archive/2008/12/02/mditab.html 创建MDI应用程序 先创建”Windows窗体应用程序”解决方案Tabable ...