题目链接: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+多种操作+鬼畜的代码)的更多相关文章

  1. Sequence operation(线段树区间多种操作)

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. 线段树区间更新操作及Lazy思想(详解)

    此题题意很好懂:  给你N个数,Q个操作,操作有两种,‘Q a b ’是询问a~b这段数的和,‘C a b c’是把a~b这段数都加上c. 需要用到线段树的,update:成段增减,query:区间求 ...

  3. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. HDU-4578 Transformation(线段树的多种区间操作)

    http://acm.hdu.edu.cn/showproblem.php?pid=4578 Time Limit: 15000/8000 MS (Java/Others)    Memory Lim ...

  5. hdu 4578 Transformation 线段树多种操作裸题

    自己写了一个带结构体的WA了7.8次 但是测了几组小数据都对..感觉问题应该出在模运算那里.写完这波题解去对拍一下. 以后线段树绝不写struct!一般的struct都带上l,r 但是一条线段的长度确 ...

  6. Transformation 线段树好题 好题 (独立写出来对线段树不容易)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  7. HDU 4578 Transformation --线段树,好题

    题意: 给一个序列,初始全为0,然后有4种操作: 1. 给区间[L,R]所有值+c 2.给区间[L,R]所有值乘c 3.设置区间[L,R]所有值为c 4.查询[L,R]的p次方和(1<=p< ...

  8. POJ2528 线段树的区间操作

    首先应该对该[0,10000000]进行离散化 即先将点集进行排序,然后从小到大缩小其中的间距,使得最后点数不会超过2*n 然后就是线段树操作 只需进行染色,然后最后用nlgn进行一个个查询颜色记录即 ...

  9. 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 ...

随机推荐

  1. 201621123034 《Java程序设计》第5周学习总结

    作业05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:关键字:接口.继承.多态 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般 ...

  2. Python的7种性能测试工具:timeit、profile、cProfile、line_profiler、memory_profiler、PyCharm图形化性能测试工具、objgraph

    1.timeit: >>> import timeit >>> def fun(): ): a = i * i >>> timeit.timeit ...

  3. Jenkins系列-Jenkins介绍与部署

    Jenkins是什么? Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Jenkins可以用于一些测 ...

  4. chrome扩展程序中以编程方式插入内容脚本不生效的问题

    chrome扩展程序中内容脚本有两种插入方式:(https://crxdoc-zh.appspot.com/extensions/content_scripts) 1. 清单文件: 这种方式会在打开每 ...

  5. .NET环境下,通过LINQ操作SQLite数据库

    //对应数据库中的某个表 [Table(Name = "main.Student")]    public class Student    {        [Column(Na ...

  6. 网卡多ip 再看arp; arp队列也会缓存skb

    [结论] 当协议失效的时候,skb会挂载arp的neigt的一个链表上,然后直接返回了,相当于数据包发下了,当arp收到数据包去修复neigh的目的地址的时候,会把之前所有的neihe中等待的skb全 ...

  7. 【转】Jsp自定义标签详解

    一.前言 原本是打算研究EXtremeComponents这个jsp标签插件,因为这个是自定义的标签,且自身对jsp的自定义标签并不是非常熟悉,所以就打算继续进行扫盲,开始学习并且整理Jsp自定义标签 ...

  8. lambda 分组练习

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } List<Person> per ...

  9. 【数据库】Sql Server备份还原脚本

    USE master RESTORE DATABASE 新建的没有任何数据的数据库名 FROM DISK = 'e:\数据库备份文件.bak' WITH MOVE '原来的逻辑名称' TO 'e:\新 ...

  10. 【数据库】Sql Server 2008完全卸载方法(其他版本类似)

    本文介绍如何卸载 Microsoft SQL Server 2008的方法.当您按照本文中的步骤时,您还准备系统以便可以重新安装 SQL Server 2008版本 一.    SQL2008卸载. ...