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. 【ABAP系列】SAP ABAP 优化LOOP循环的一点点建议

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 优化LOOP循 ...

  2. 【ABAP系列】SAP ABAP 模拟做成像windows一样的计算器

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP ABAP 模拟做成像wind ...

  3. 虚拟机 vs 容器

    虚拟机 虚拟机本质上是模拟,模拟物理机上的硬件 虚拟机必须安装操作系统 一个虚拟机操作系统的崩溃不会影响到其他虚拟机 容器 容器的本质是经过隔离与限制的linux进程 容器使用的是物理机的资源 容器之 ...

  4. Queen Attack -- 微软2017年预科生计划在线编程笔试第二场

    #!/usr/bin/env python # coding:utf-8 # Queen Attack # https://hihocoder.com/problemset/problem/1497 ...

  5. The Log-Structured Merge-Tree(译)

    coming from http://duanple.blog.163.com/blog/static/7097176720120391321283/

  6. spring源码下载及转入ECLIPSE

    转自:https://www.cnblogs.com/scevecn/p/6043284.html 本例spring源码版本是4.3.0的, 所以jdk需要准备1.8的(不同版本源码要求的jdk不一样 ...

  7. sql server死锁跟踪

    我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息.但这种方式有一个很大的敝端,就是消耗很大.据国外某大神测试,profiler甚至可以占到服务器总带宽的35%,所以,在一 ...

  8. Windows7无法删除EFI分区解决办法

    Windows7无法删除第二块儿硬盘的EFI分区的解决办法: 1.Win+R,diskpart. 2.在命令行中输入list disk 命令. 发现本机有两块儿磁盘,我们需要删除的EFI分区在磁盘1中 ...

  9. PgSQL · 特性分析 · PG主备流复制机制

    原文地址:http://mysql.taobao.org/monthly/2015/10/04/ PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在 ...

  10. ASE Alpha Sprint - backend scrum 2

    本次scrum于2019.11.5再sky garden进行,持续30分钟. 参与人: Zhikai Chen, Jia Ning, Haifeng Chen, Hao Wang 请假: Xin Ka ...