Transformation(线段树+HDU4578+多种操作+鬼畜的代码)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578
题目:


题意:n个数初始值为0,进行四种操作:1.将区间内的数字加c;2.将区间内的数字乘c;3.将区间内的数字变成c;4.询问区间内的元素的p次方和。
思路:这个题真的肝到死,找bug贼难受。我们用cnt1来记录一次方和,cnt2记录二次方和,cnt3记录三次方和。

代码实现如下:
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
typedef unsigned long long ull; #define lson i<<1
#define rson i<<1|1
#define bug printf("*********\n");
#define FIN freopen("D://code//in.txt", "r", stdin);
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define IO ios::sync_with_stdio(false),cin.tie(0); const double eps = 1e-;
const int mod = ;
const int maxn = 1e5 + ;
const double pi = acos(-);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f; inline int read() {//读入挂
int ret = , c, f = ;
for(c = getchar(); !(isdigit(c) || c == '-'); c = getchar());
if(c == '-') f = -, c = getchar();
for(; isdigit(c); c = getchar()) ret = ret * + c - '';
if(f < ) ret = -ret;
return ret;
} int n, q, op, x, y, z; struct node {
int l, r;
ll cnt1, cnt2, cnt3, lazy1, lazy2, lazy3, len; //cnt1=siga(ax+b), cnt2=sigs(ax+b)^2,cnt3=siga(ax+b)^3
//lazy1标记加b,lazy2标记乘a,lazy3标记赋值c
}segtree[maxn*]; void push_up(int i) {
segtree[i].cnt1 = (segtree[lson].cnt1 + segtree[rson].cnt1) % mod;
segtree[i].cnt2 = (segtree[lson].cnt2 + segtree[rson].cnt2) % mod;
segtree[i].cnt3 = (segtree[lson].cnt3 + segtree[rson].cnt3) % mod;
} void push_down(int i){
if(segtree[i].lazy3){
ll tmp = segtree[i].lazy3*segtree[i].lazy3%mod*segtree[i].lazy3%mod;
segtree[lson].lazy1=segtree[rson].lazy1=;
segtree[lson].lazy2=segtree[rson].lazy2=;
segtree[lson].lazy3=segtree[rson].lazy3=segtree[i].lazy3; segtree[lson].cnt3 = (segtree[lson].r - segtree[lson].l + )*tmp%mod;
segtree[rson].cnt3 = (segtree[rson].r - segtree[rson].l + )*tmp%mod; segtree[lson].cnt2 =(segtree[lson].r - segtree[lson].l + )*segtree[i].lazy3%mod*segtree[i].lazy3%mod;
segtree[rson].cnt2 = (segtree[rson].r - segtree[rson].l + )*segtree[i].lazy3%mod*segtree[i].lazy3%mod; segtree[lson].cnt1 =(segtree[lson].r - segtree[lson].l + )*segtree[i].lazy3%mod;
segtree[rson].cnt1 = (segtree[rson].r - segtree[rson].l + )*segtree[i].lazy3%mod; segtree[i].lazy3 = ;
}
if(segtree[i].lazy1!=||segtree[i].lazy2!=){
ll add = segtree[i].lazy1, mul = segtree[i].lazy2;
ll l1=segtree[lson].cnt1,l2=segtree[lson].cnt2,l3=segtree[lson].cnt3;
ll r1=segtree[rson].cnt1,r2=segtree[rson].cnt2,r3=segtree[rson].cnt3;
ll tmp = mul*mul%mod*mul%mod; segtree[lson].lazy1=(segtree[lson].lazy1*mul%mod+add)%mod;
segtree[rson].lazy1=(segtree[rson].lazy1*mul%mod+add)%mod;
segtree[lson].lazy2=segtree[lson].lazy2*mul%mod;
segtree[rson].lazy2=segtree[rson].lazy2*mul%mod; segtree[lson].cnt3=(segtree[lson].cnt3*tmp%mod + add*add%mod*add%mod*(segtree[lson].r - segtree[i].l + )%mod + *segtree[lson].cnt2*mul%mod*mul%mod*add%mod + *segtree[lson].cnt1*mul%mod*add%mod*add%mod)%mod;
segtree[rson].cnt3=(segtree[rson].cnt3*tmp%mod + add*add%mod*add%mod*(segtree[rson].r - segtree[rson].l + )%mod + *segtree[rson].cnt2*mul%mod*mul%mod*add%mod + *segtree[rson].cnt1*mul%mod*add%mod*add%mod)%mod; segtree[lson].cnt2=(segtree[lson].cnt2*mul%mod*mul%mod + add*add%mod*(segtree[lson].r - segtree[i].l + )%mod + *mul*add*segtree[lson].cnt1)%mod;
segtree[rson].cnt2=(segtree[rson].cnt2*mul%mod*mul%mod + add*add%mod*(segtree[rson].r - segtree[rson].l + )%mod + *mul*add*segtree[rson].cnt1)%mod; segtree[lson].cnt1=(segtree[lson].cnt1*mul+add*(segtree[lson].r - segtree[i].l + ))%mod;
segtree[rson].cnt1=(segtree[rson].cnt1*mul+add*(segtree[rson].r - segtree[rson].l + ))%mod; segtree[i].lazy1 = ;segtree[i].lazy2 = ;
}
} void build(int i, int l, int r) {
segtree[i].l = l, segtree[i].r = r;
segtree[i].cnt1 = segtree[i].cnt2 = segtree[i].cnt3 = ;
segtree[i].lazy1 = segtree[i].lazy3 = ;
segtree[i].lazy2 = ;
if(l == r) return;
int mid = (l + r) >> ;
build(lson, l, mid);
build(rson, mid + , r);
push_up(i);
} void update(int i, int l, int r, ll c, int op) {
if(segtree[i].l == l && segtree[i].r == r) {
if(op == ) {
segtree[i].cnt1 = c % mod * (segtree[i].r - segtree[i].l + ) % mod;
segtree[i].cnt2 = c * c % mod * (segtree[i].r - segtree[i].l + ) % mod;
segtree[i].cnt3 = c * c % mod * c % mod * (segtree[i].r - segtree[i].l + ) % mod;
segtree[i].lazy3 = c;
segtree[i].lazy2 = ;
segtree[i].lazy1 = ;
return;
} else if(op == ) {
segtree[i].cnt1 = c * segtree[i].cnt1 % mod;
segtree[i].cnt2 = c * c % mod * segtree[i].cnt2 % mod;
segtree[i].cnt3 = c * c % mod * c %mod * segtree[i].cnt3 % mod;
segtree[i].lazy2 = segtree[i].lazy2 * c % mod;
segtree[i].lazy1 = segtree[i].lazy1 * c % mod;
return;
} else {
segtree[i].lazy1 = (c + segtree[i].lazy1) % mod;
ll sum1 = segtree[i].cnt1, sum2 = segtree[i].cnt2, sum3 = segtree[i].cnt3;
segtree[i].cnt1 = (sum1 + c * (segtree[i].r - segtree[i].l + )) % mod;
segtree[i].cnt2 = ((sum2 % mod + * c % mod * sum1 % mod) % mod + c * c % mod * (segtree[i].r - segtree[i].l + ) % mod) % mod;
segtree[i].cnt3 = ((sum3 % mod + * c % mod * (sum2 + sum1 * c) % mod) % mod + c * c % mod * c * (segtree[i].r - segtree[i].l + ) % mod) % mod;
return;
}
}
push_down(i);
int mid = (segtree[i].l + segtree[i].r) >> ;
if(l > mid) update(rson, l, r, c, op);
else if(r <= mid) update(lson, l, r, c, op);
else {
update(lson, l, mid, c, op);
update(rson, mid + , r, c, op);
}
push_up(i);
} ll query(int i, int l, int r, int op) {
if(segtree[i].l == l && segtree[i].r == r) {
if(op == ) return segtree[i].cnt1;
if(op == ) return segtree[i].cnt2;
if(op == ) return segtree[i].cnt3;
}
push_down(i);
int mid = (segtree[i].l + segtree[i].r) >> ;
if(l > mid) return query(rson, l, r, op);
else if(r <= mid) return query(lson, l, r, op);
else {
return (query(lson, l, mid, op) + query(rson, mid + , r, op)) % mod;
}
} int main() {
//FIN;
while(~scanf("%d%d", &n, &q)) {
if(n == && q == ) break;
build(, , n);
while(q--) {
scanf("%d%d%d%d", &op, &x, &y, &z);
if(op == ) {
printf("%lld\n", query(, x, y, z));
} else {
z %= mod;
update(, x, y, z, op);
}
}
}
return ;
}
Transformation(线段树+HDU4578+多种操作+鬼畜的代码)的更多相关文章
- Sequence operation(线段树区间多种操作)
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 线段树区间更新操作及Lazy思想(详解)
此题题意很好懂: 给你N个数,Q个操作,操作有两种,‘Q a b ’是询问a~b这段数的和,‘C a b c’是把a~b这段数都加上c. 需要用到线段树的,update:成段增减,query:区间求 ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- HDU-4578 Transformation(线段树的多种区间操作)
http://acm.hdu.edu.cn/showproblem.php?pid=4578 Time Limit: 15000/8000 MS (Java/Others) Memory Lim ...
- hdu 4578 Transformation 线段树多种操作裸题
自己写了一个带结构体的WA了7.8次 但是测了几组小数据都对..感觉问题应该出在模运算那里.写完这波题解去对拍一下. 以后线段树绝不写struct!一般的struct都带上l,r 但是一条线段的长度确 ...
- Transformation 线段树好题 好题 (独立写出来对线段树不容易)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- HDU 4578 Transformation --线段树,好题
题意: 给一个序列,初始全为0,然后有4种操作: 1. 给区间[L,R]所有值+c 2.给区间[L,R]所有值乘c 3.设置区间[L,R]所有值为c 4.查询[L,R]的p次方和(1<=p< ...
- POJ2528 线段树的区间操作
首先应该对该[0,10000000]进行离散化 即先将点集进行排序,然后从小到大缩小其中的间距,使得最后点数不会超过2*n 然后就是线段树操作 只需进行染色,然后最后用nlgn进行一个个查询颜色记录即 ...
- CodeForces 914DBash and a Tough Math Puzzle(线段树的骚操作)
D. Bash and a Tough Math Puzzle time limit per test 2.5 seconds memory limit per test 256 megabytes ...
随机推荐
- lintcode-152-组合
152-组合 组给出两个整数n和k,返回从1......n中选出的k个数的组合. 样例 例如 n = 4 且 k = 2 返回的解为: [[2,4],[3,4],[2,3],[1,2],[1,3],[ ...
- LR脚本编写时的几个小技巧
参数化空值 如上图所示,当参数化时某个值需要为空值(非空格),直接在参数化文件中空一行/格即可,虽然Parameter List界面上没有显示空的那一行,但并不影响取值. 手工日志跟踪 lr_set_ ...
- 发送缓冲区sk_wmem_queued
sk_wmem_queued是目前发送缓冲区的量 tcp_trim_head 把这快内存给去掉, 什么时候会加入到内存里呢?__tcp_add_write_queue_tail, skb里的内存是啥? ...
- .NET中SQL Server数据库连接方法
1. 使用本机上的SQL Server Express 实例上的用户实例. 用户实例的连接创建了一个新的SQL Server 实例.此连接只能是在本地SQL Server 2005实例上并 ...
- Linux进程间通信简介
本人仅做简介.转自:http://www.linuxidc.com/Linux/2013-06/85904p2.htm 管道( pipe ): (Linux进程间通信) 管道是一种半双工的通信 ...
- React受控组件和非受控组件
受控组件和非受控组件主要是用来解决表单组件状态谁来控制的问题.因为用户的输入会反应在界面上,相当于视图的状态发生了变化,而react是通过虚拟DOM比对修改视图的,这里就要决定谁来控制表单组件的状态. ...
- extjs gridpanel 操作行 得到选中行
extjs gridpanel 操作行 得到选中行的列 在Extjs 3.2.0上适合 var model = grid.getSelectionModel(); model.selectAll(); ...
- Spring源码解析-autowiring自动装配的实现
IoC容器提供了自动依赖装配的方式,为应用IoC容器提供很大的方便.在自动配置中,不需要显式的去指定Bean属性,只需要配置autowiring属性,IoC容器会根据这个属性配置,使用反射的方式查找属 ...
- 背景建模技术(七):预处理(PreProcessor)模块
预处理(PreProcessor)模块是BgsLibrary中一个必选的模块,是真正进入背景建模算法的“预处理”过程,其主要功能包括‘去模糊’.‘获得灰度图’.'应用Canny算子‘等可选模块. 下面 ...
- Gaby And Addition Gym - 101466A (初学字典树)
Gaby is a little baby who loves playing with numbers. Recently she has learned how to add 2 numbers ...