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 ...
随机推荐
- spring Cloud 之 Eureka、Feign、Hystrix、Zuul、Config、Bus
一.服务发现——Netflix Eureka Eureka包含两个组件: Eureka Server和Eureka Client 1.创建Eureka Server服务端 (1).引入依赖 父工程po ...
- linux优化
优化linux启动项 1. 使用ntsysv工具讲不需要的服务关闭 2. 默认启动服务可以只保留必要的服务 3. free -m 以m为单位 4. 删除不必要的用户: 5. cp /etc/passw ...
- idea的类头注释和方法注释的编辑
一:配置类头注释 1:点击file,点击settings 2:点击editor,选择 file and code template ,然后看右侧部分点击include,之后选中File Header ...
- vue中的provide/inject讲解
最近在看element-ui的源码,发现了一个这样的属性:inject.遂查看官网provider/inject provider/inject:简单的来说就是在父组件中通过provider来提供变量 ...
- mysql忘记密码/修改密码
关键词:忘记密码,修改密码,mysql忘记密码,mysql修改密码 转自:https://www.cnblogs.com/jdxn/p/6847089.html 方法1: 用SET PASSWORD命 ...
- 加密算法:DES、AES等
指标:运算速度.安全性.资源消耗 对称加密算法(加解密密钥相同): 非对称算法(加密密钥和解密密钥不同): 散列算法比较: 对称与非对称算法比较: 算法选择(从性能和安全性综合) 对称加密: AES( ...
- Java JDK在Mac下的配置方法
Java JDK在Mac.Windows下的配置方法 Mac 第一步:下载JDK 官网下载地址 第二步:安装JDK 安装步骤很简单,一直点击下一步即可. 第三步:配置环境变量 打开terminal(终 ...
- Trie字典树详解
今天上午省选字符串......只会KMP.连hash都不会的我被大佬虐惨了......于是我要发奋图强学习字符串,学习字符串当然就要从Trie树这种可爱的数据结构开始啦!!! 一.什么是Trie树?? ...
- Redis: 分布式锁的正确实现方式(转)
前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...
- JQ的异步文件上传
一,view代码 <form role="form"> <div class="form-group"> <label for=& ...