2018 CCPC 吉林站 H Lovers
2018 CCPC 吉林站 H Lovers
传送门:https://www.spoj.com/problems/LIS2/en/
题意:
q次操作
1.将第l~r个数的左边和和右边都加上一个数d, 使得这个数变成 \(ds_id\)的形式
2.询问区间和
题解:
线段树题
这个update操作不好维护,我们来冷静分析一下
对于一个数x,他的长度为len,我们在他后面加上一个数d,那么他的长度就变成了len+1,这个数x就变成了\(x*10+d\)
同理,在前面加上一个数,这个数x就变成了\(d*10^{len(x)}+x\)
那么对于每次的update操作,我们需要更新,区间长度,区间和,左右添加的数,右边的标记每次要*10+d,左边的标记每次要加上len*val
下推标记时
要更新区间和,区间长度,左右标记,10的幂标记
注意取模问题
代码:
#include <set>
#include <map>
#include <cmath>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define bug printf("*********\n")
#define FIN freopen("input.txt","r",stdin);
#define FON freopen("output.txt","w+",stdout);
#define IO ios::sync_with_stdio(false),cin.tie(0)
#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"
#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n"
#define debug3(x,y,z) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<" "<<#z<<" "<<z<<"]\n"
const int maxn = 3e5 + 5;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
LL sum1[maxn << 2];
LL sum2[maxn << 2];
LL lazy1[maxn << 2];
LL lazy2[maxn << 2];
LL lazylen[maxn << 2];
void push_up(int rt) {
sum1[rt] = (sum1[ls] + sum1[rs]) % mod;
sum2[rt] = (sum2[ls] + sum2[rs]) % mod;
}
void build(int l, int r, int rt) {
lazy1[rt] = lazy2[rt] = 0;
lazylen[rt] = 1;
sum1[rt] = r - l + 1;
sum2[rt] = 0;
if(l == r) return;
int mid = (l + r) >> 1;
build(lson);
build(rson);
push_up(rt);
}
void push_down(int l, int r, int rt) {
if(lazylen[rt] > 1) {
int mid = (l + r) >> 1;
sum2[ls] = (lazy1[rt] % mod * sum1[ls] % mod * lazylen[rt] % mod +
sum2[ls] % mod * lazylen[rt] % mod +
lazy2[rt] % mod * 1LL * (mid - l + 1) % mod) % mod;
sum2[rs] = (lazy1[rt] % mod * sum1[rs] % mod * lazylen[rt] % mod +
sum2[rs] % mod * lazylen[rt] % mod +
lazy2[rt] % mod * 1LL * (r - mid) % mod) % mod;
sum1[ls] = (sum1[ls] % mod * lazylen[rt] % mod * lazylen[rt] % mod) % mod;
sum1[rs] = (sum1[rs] % mod * lazylen[rt] % mod * lazylen[rt] % mod) % mod;
lazy1[ls] = (lazy1[rt] % mod * lazylen[ls] % mod + lazy1[ls] % mod) % mod;
lazy1[rs] = (lazy1[rt] % mod * lazylen[rs] % mod + lazy1[rs] % mod) % mod;
lazy2[ls] = (lazy2[ls] % mod * lazylen[rt] % mod + lazy2[rt] % mod) % mod;
lazy2[rs] = (lazy2[rs] % mod * lazylen[rt] % mod + lazy2[rt] % mod) % mod;
lazylen[ls] = (lazylen[ls] % mod * lazylen[rt] % mod) % mod;
lazylen[rs] = (lazylen[rs] % mod * lazylen[rt] % mod) % mod;
lazylen[rt] = 1;
lazy1[rt] = 0;
lazy2[rt] = 0;
}
}
void update(int L, int R, int val, int l, int r, int rt) {
if(L <= l && r <= R) {
sum2[rt] = (val % mod * sum1[rt] % mod * 10 % mod + sum2[rt] % mod * 10 % mod + (r - l + 1) % mod * val % mod) % mod;
sum1[rt] = (sum1[rt] % mod * 100) % mod;
lazy1[rt] = (lazylen[rt] % mod * val % mod + lazy1[rt] % mod) % mod;
lazy2[rt] = (lazy2[rt] % mod * 10 % mod + val % mod) % mod;
lazylen[rt] = (lazylen[rt] * 10) % mod;
return;
}
int mid = (l + r) >> 1;
push_down(l, r, rt);
if(L <= mid) update(L, R, val, lson);
if(R > mid) update(L, R, val, rson);
push_up(rt);
}
LL query(int L, int R, int l, int r, int rt) {
if(L <= l && r <= R) {
return sum2[rt];
}
int mid = (l + r) >> 1;
push_down(l, r, rt);
LL ans = 0;
if(L <= mid) ans = (ans + query(L, R, lson)) % mod;
if(R > mid) ans = (ans + query(L, R, rson)) % mod;
return ans % mod;
}
int main() {
#ifndef ONLINE_JUDGE
FIN
#endif
int T;
int cas = 1;
scanf("%d", &T);
while(T--) {
int n, m;
scanf("%d%d", &n, &m);
build(1, n, 1);
printf("Case %d:\n", cas++);
while(m--) {
char op[10];
scanf("%s", op);
if(op[0] == 'w') {
int l, r, d;
scanf("%d%d%d", &l, &r, &d);
update(l, r, d, 1, n, 1);
// debug2(n,m);
} else {
int l, r;
scanf("%d%d", &l, &r);
printf("%lld\n", query(l, r, 1, n, 1) % mod);
}
}
}
return 0;
}
2018 CCPC 吉林站 H Lovers的更多相关文章
- 2018 CCPC 吉林站 H Lovers || HDU 6562 (线段树哦)
http://acm.hdu.edu.cn/showproblem.php?pid=6562 题意: q次操作 1.将第l~r个数的左边和和右边都加上一个数d, 使得这个数变成 dsiddsid的形式 ...
- 2018 CCPC 桂林站(upc复现赛)补题
2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...
- 2018年9月22日CCPC吉林站参赛总结
发现思维题是硬伤,代码能力是硬伤,对知识点的理解不深刻是硬伤 接下来要做的就是 1.熟悉每一个知识点,把每一个知识点和实现它的代码联系在一起学习 2.多见题,看看他们是怎么考察这些知识点的,等比赛的时 ...
- Lovers(HDU6562+线段树+2018年吉林站)
题目链接 传送门 题意 初始时有\(n\)个空串,然后进行\(q\)次操作,操作分为以下两种: wrap l r x:把\(l,r\)中的每个字符串的首尾都加入\(x\),如\(s_i=121,x=3 ...
- CCPC吉林站
A.The Fool #include <bits/stdc++.h> using namespace std; inline int read() { ,f=;char ch=getch ...
- 2018 CCPC 桂林站(upc复现赛)总结
比赛一开始盯上了A题和G题,一个小时过去了还没有出题,心里有些乱.这时我看D题很多人过了,于是宝儿去看D题,说D题简单,转化成二进制暴力,于是就去做了.写的时候好像思路有点卡,WA了一发,后来马上发现 ...
- The Tower(HDU6559+2018年吉林站+数学)
题目链接 传送门 题意 告诉你圆锥的底部圆的半径和圆锥的高,再给你一个点的坐标及其运动向量,问你这个点什么时候会与这个圆锥相撞. 思路 比赛场上二分一直没过但是有人二分过了,今天再写这题想再试下二分, ...
- 2018 ccpc吉林 The Tower
传送门:HDU - 6559 题意 在一个三维空间,给定一个点和他的三维速度,给定一个圆锥,问这个点最早什么时候能撞上圆锥. 题解 本来一直想着怎么求圆锥的方程,然后....队友:这不是二分吗!然后问 ...
- Justice(HDU6557+2018年吉林站+二进制)
题目链接 传送门 题意 给你\(n\)个数,每个数表示\(\frac{1}{2^{a_i}}\),要你把这\(n\)个数分为两堆,使得每堆的和都大于等于\(\frac{1}{2}\). 思路 首先我们 ...
随机推荐
- JavaScript实现,控制一个文本框只能输入正整数,如输入不符合条件则文本框全部字体标红
腾讯2014年研发职位笔试题Web前端方向简单题第一题. 代码: <html> <head> <title>test JavaScript</title> ...
- day4_python之名称空间与作用域、闭包函数、嵌套函数
一.名称空间与作用域 名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方 内置名称空间:在python解释器启动时产生,存放一些python内置的名字 全局名称空间:在执行文件 ...
- oracle回滚机制深入研究
这篇文章主要描写叙述oracle的回滚机制,篇幅可能较长,由于对于oracle的回滚机制来说,要讨论和描写叙述的实在太多,仅仅能刷选自己觉得最有意义的一部分进行深入研究和分享 一.我们来看一个DML语 ...
- vuex之仓库数据的设置与获取
如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那么接下来我们就来学习 ...
- 手写call,bind,apply
//实现call var that = this ; //小程序环境 function mySymbol(obj){ let unique = (Math.random() + new Date(). ...
- php-textarea 换行
PHP接收表单提交的信息之后 存入数据库 再次从数据库获取数据再前端显示时 空格还有回车都消失了: 解决办法: 1,存入数据库时候进行替换 2,或者在取出数据之后进行替换 然后再在html中显示 s ...
- hdu 1503 LCS输出路径【dp】
hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左 ...
- SDUT-2117_数据结构实验之链表二:逆序建立链表
数据结构实验之链表二:逆序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入整数个数N,再输入N个整数,按照 ...
- React Native中pointerEvent属性
在React Native界面开发中, 如果使用绝对定位布局,在代码运行时的某个时刻有可能会遮盖住它的下方的某个组件.这是因为绝对定位只是说这个组件的位置由它父组件的边框决定. 绝对定位的组件可以被认 ...
- oracle使用DECODE函数来减少处理时间
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. 例如: SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0020 AND ENAM ...