2018 CCPC 吉林站 H Lovers || HDU 6562 (线段树哦)
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 (线段树哦)的更多相关文章
- 2018 CCPC 吉林站 H Lovers
2018 CCPC 吉林站 H Lovers 传送门:https://www.spoj.com/problems/LIS2/en/ 题意: q次操作 1.将第l~r个数的左边和和右边都加上一个数d, ...
- 2018 CCPC 桂林站(upc复现赛)补题
2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...
- 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 ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 4533 线段树(问题转化+)
威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
随机推荐
- 001--PowerDesigner连接MySQL
PowerDesigner连接MySQL(一) 博客地址:https://blog.csdn.net/codemonkey_king/article/details/53263597 https:// ...
- 000 (H5*) 知识点总结
https://note.youdao.com/ynoteshare1/index.html?id=ff02e616917fba868f39241c8383d7c7&type=note 目录 ...
- python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- mysql树查询、递归查询
关键词:mysql树查询,mysql递归查询 转自:http://www.cnblogs.com/c-h-y/p/9420726.html 之前一直用的是Oracle,对于树形查询可以使用start ...
- S5PV210刷机
一. 刷机初识 1.1. 什么是刷机 a. 刷机就是通过各种手段把相应镜像烧录到设备中,让设备可以运行起来.常见的刷机如:安卓刷机,QT刷机 1.2. S5PV210刷机镜像 1.2.1. 刷安卓所需 ...
- docker pull使用 代理
[root@fdfs- ~]# cat /usr/lib/systemd/system/docker.service [Unit] Description=Docker Application Con ...
- 将图片地址转为blob格式的例子
HTML代码: <div id="forAppend" class="demo"></div> Javascript代码: <sc ...
- 跨域问题解决----NO 'Access-Control-Allow-Origin' header is present on the requested resource.Origin'http://localhost:11000' is therfore not allowed access'
NO 'Access-Control-Allow-Origin' header is present on the requested resource.Origin'http://localhost ...
- jQuery中$.get()和$.post()的异同点
相同点:两者都是向服务器异步请求数据的. 不同点: 1.$.get() 方法使用GET方法来进行异步请求的,$.post() 方法使用POST方法来进行异步请求的. 2.如果前端使用$.get() 方 ...
- Azkaban和Oozie的区别
Azkaban和Oozie的区别: 当前,实际生产中最流行的两种Hadoop工作流引擎是Azkaban与Oozie.但活跃度最高的当是Azkaban了,下面对两者的异同之处作如下对比. 功能对比 Az ...