Transformation

Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)
Total Submission(s): 7144    Accepted Submission(s): 1811

Problem Description
Yuanfang is puzzled with the question below:
There are n integers, a1, a2, …, an. The initial values of them are 0. There are four kinds of operations.
Operation 1: Add c to each number between ax and ay inclusive. In other words, do transformation ak<---ak+c, k = x,x+1,…,y.
Operation 2: Multiply c to each number between ax and ay inclusive. In other words, do transformation ak<---ak×c, k = x,x+1,…,y.
Operation 3: Change the numbers between ax and ay to c, inclusive. In other words, do transformation ak<---c, k = x,x+1,…,y.
Operation 4: Get the sum of p power among the numbers between ax and ay inclusive. In other words, get the result of axp+ax+1p+…+ay p.
Yuanfang has no idea of how to do it. So he wants to ask you to help him.
 
Input
There are no more than 10 test cases.
For each case, the first line contains two numbers n and m, meaning that there are n integers and m operations. 1 <= n, m <= 100,000.
Each the following m lines contains an operation. Operation 1 to 3 is in this format: "1 x y c" or "2 x y c" or "3 x y c". Operation 4 is in this format: "4 x y p". (1 <= x <= y <= n, 1 <= c <= 10,000, 1 <= p <= 3)
The input ends with 0 0.
 
Output
For each operation 4, output a single integer in one line representing the result. The answer may be quite large. You just need to calculate the remainder of the answer when divided by 10007.
 
Sample Input
5 5
3 3 5 7
1 2 4 4
4 1 5 2
2 2 5 8
4 3 5 3
0 0
 
Sample Output
307
7489
 
这题是好题  
太太太恶心了
简直爆炸  ,这题我写了N次
取模取模  
最后的query也要取模
找BUG找了好久找不到
这题最傻逼的做法是用3个lazy 和 3 个sum 
但是这里对于不同的lazy优先级不同 
而且还有取模操作,那样写下来及其的繁琐
我参考大佬博客 发现这题最优化的写法应该是
开一个线段树 维护区间里面相同的值
这样的话无论C多少都好求
        for (int i = 1 ; i <= c ; i++)
               ans = (ans * tree[rt].eq) % mod;
        return (ans * ((tree[rt].r - tree[rt].l + 1) % mod) % mod) % mod;
如果C是10用多个lazy维护代码量就直接爆炸了
这样的方法还有一个很好的优化
就是pushdown操作一直递归下去,直到到达底层
这样的话就有效的解决繁琐的优先级处理问题
这样处理优先级问题就很容易了
我菜爆了,用线段树维护区间相同的值 ,太强了
 
附送一个fuck函数
 
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
typedef long long LL;
#define fuck(x) cout<<"["<<x<<"]";
#define rtl rt<<1
#define rtr rt<<1|1
const int maxn = 1e5 + ;
const int mod = 1e4 + ;
const int INF = 2e9 + ;
int n, m;
struct node {
int l, r, eq, add, mul;
int mid() {
return (l + r) >> ;
}
} tree[maxn << ];
void build(int l, int r, int rt) {
tree[rt].l = l, tree[rt].r = r;
tree[rt].add = , tree[rt].mul = , tree[rt].eq = -;
if (l == r) {
tree[rt].eq = ;
return ;
}
int m = (l + r) >> ;
build(l, m, rtl);
build(m + , r, rtr);
}
void pushdown(int rt) {
if (tree[rt].l == tree[rt].r) return ;
if (tree[rt].eq != -) {
tree[rtl].eq = tree[rtr].eq = tree[rt].eq;
tree[rtl].add = tree[rtr].add = ;
tree[rtl].mul = tree[rtr].mul = ;
tree[rt].eq = -;
return ;
}
if (tree[rt].mul != ) {
if (tree[rtl].eq != -) tree[rtl].eq = (tree[rtl].eq * tree[rt].mul) % mod;
else {
pushdown(rtl);
tree[rtl].mul = (tree[rtl].mul * tree[rt].mul) % mod;
}
if (tree[rtr].eq != -) tree[rtr].eq = (tree[rtr].eq * tree[rt].mul) % mod;
else {
pushdown(rtr);
tree[rtr].mul = (tree[rtr].mul * tree[rt].mul) % mod;
}
tree[rt].mul = ;
}
if (tree[rt].add) {
if (tree[rtl].eq != -) tree[rtl].eq = (tree[rtl].eq + tree[rt].add) % mod;
else {
pushdown(rtl);
tree[rtl].add = (tree[rtl].add + tree[rt].add) % mod;
}
if (tree[rtr].eq != -) tree[rtr].eq = (tree[rtr].eq + tree[rt].add) % mod;
else {
pushdown(rtr);
tree[rtr].add = (tree[rtr].add + tree[rt].add) % mod;
}
tree[rt].add = ;
}
} void update(int L, int R, int rt, int op, int c) {
if (L <= tree[rt].l && tree[rt].r <= R ) {
if (op == ) {
tree[rt].eq = c;
tree[rt].mul = ;
tree[rt].add = ;
return ;
}
if (tree[rt].eq != -) {
if (op == ) tree[rt].eq = (tree[rt].eq + c) % mod;
else tree[rt].eq = (tree[rt].eq * c) % mod;
} else {
pushdown(rt);
if (op == ) tree[rt].add = (tree[rt].add + c) % mod;
else tree[rt].mul = (tree[rt].mul * c) % mod;
}
return ;
}
pushdown(rt);
int m = tree[rt].mid();
if (L <= m) update(L, R, rtl, op, c);
if (R > m) update(L, R, rtr, op, c);
} int query(int L, int R, int rt, int c) {
if (L <= tree[rt].l && tree[rt].r <= R && tree[rt].eq != -) {
int ans = ;
for (int i = ; i <= c ; i++)
ans = (ans * tree[rt].eq) % mod;
return (ans * ((tree[rt].r - tree[rt].l + ) % mod) % mod) % mod;
}
pushdown(rt);
int m = tree[rt].mid();
if (R <= m) return query(L, R, rtl, c);
else if (L > m) return query(L, R, rtr, c);
else return query(L, m, rtl, c) + query(m + , R, rtr, c);
}
int main() {
while(scanf("%d%d", &n, &m) != EOF) {
if (n == && m == ) break;
build(, n, );
while(m--) {
int op, x, y, c;
scanf("%d%d%d%d", &op, &x, &y, &c);
if (op == ) printf("%d\n", query(x, y, , c)%mod);
else update(x, y, , op, c);
}
}
return ;
}
 

Transformation 线段树好题 好题 (独立写出来对线段树不容易)的更多相关文章

  1. 【BZOJ 3196】二逼平衡树 线段树套splay 模板题

    我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...

  2. 51nod 1593 公园晨跑 | ST表(线段树?)思维题

    51nod 1593 公园晨跑 有一只猴子,他生活在一个环形的公园里.有n棵树围绕着公园.第i棵树和第i+1棵树之间的距离是 di ,而第n棵树和第一棵树之间的距离是 dn .第i棵树的高度是 hi ...

  3. UESTC 1591 An easy problem A【线段树点更新裸题】

    An easy problem A Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others ...

  4. ●线段树的三个题(poj 3225,hdu 1542,hdu 1828)

    ●poj 3225 Help with Intervals(线段树区间问题) ○赘述题目 给出以下集合操作: 然后有初始的一个空集S,和以下题目给出的操作指令,并输入指令: 要求进行指令操作后,按格式 ...

  5. HDU 1166 敌兵布阵(线段树/树状数组模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. 【线段树I:母题】hdu 1166 敌兵布阵

    [线段树I:母题]hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 题目大意 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又開始忙乎了.A国在海 ...

  7. HDU 5029 Relief grain --树链剖分第一题

    题意:给一棵树,每次给两个节点间的所有节点发放第k种东西,问最后每个节点拿到的最多的东西是哪种. 解法:解决树的路径上的修改查询问题一般用到的是树链剖分+线段树,以前不会写,后来学了一下树链剖分,感觉 ...

  8. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  9. 【树状数组 思维题】luoguP3616 富金森林公园

    树状数组.差分.前缀和.离散化 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积 ...

随机推荐

  1. bug 调试

    系统性能分析中,CPU.内存和 IO 是主要关注项.----系统层面 1. 对于 CPU,如果是常见的 Linux,可以先用 top 命令查看负载状况. top -H  -p [pid] pstree ...

  2. 【C#】arcface人脸识别使用问题分析

    arcface上线了新版 正好有空 赶紧下载体验了一番 凡是过程中也遇到一些问题 1.初始化 [DllImport("libarcsoft_face_engine.dll", En ...

  3. 3.hadoop完全分布式搭建

    3.Hadoop完全分布式搭建 1.完全分布式搭建 配置 #cd /soft/hadoop/etc/ #mv hadoop local #cp -r local full #ln -s full ha ...

  4. POJ 1873 The Fortified Forest(枚举+凸包)

    Description Once upon a time, in a faraway land, there lived a king. This king owned a small collect ...

  5. “hello world!”团队第三次会议

    团队“hello world!”团队召开的第三次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时间 2017年10 ...

  6. oracle数据库中常见的操作语句(一)

    一 创建表空间 create tablespace lfdc_data logging datafile 'D:\Database\lfdc_data.dbf' size 50m autoextend ...

  7. 第八次作业——项目UML设计

    分工及贡献分评定 成员 参与 贡献比例 朱跃安(031602348) 类图 13% 后敬甲(031602409) 实体关系图+博客整理 14.5% 林志华(031602128) 用例图+活动图 14. ...

  8. LintCode-72.中序遍历和后序遍历树构造二叉树

    中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 注意事项 你可以假设树中不存在相同数值的节点 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: ...

  9. WCF面试精典题汇总

    1.WCF接口中的参数改名问题 在写WCF Web Service接口的时候,如果你对接口的参数名做改动的时候,一定要记住Update所有应用该Web service的客户端的Referrence,否 ...

  10. Java模块化开发

    包配置, 静态资源, 视图解析器, 数据库,