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. TW实习日记:第19天

    今天一早上改完信息门户的代码之后,发现接口又出了问题,查了半天都不知道,原来又是网端的问题...真是心累啊,调整了一些细节样式,以及终于把企业微信的消息推送功能做完了.关键就在于有个表存放微信id的字 ...

  2. 【WXS数据类型】Date

    生成 date 对象需要使用 getDate函数, 返回一个当前时间的对象. var date = getDate(); //返回当前时间对象 属性: 名称 值类型 说明 [Date].constru ...

  3. 前端整合MathjaxJS的配置笔记

    这篇文章是我给Pinghsu主题添加数学公式功能的一个小教程,包含我大量的官方文档阅读后的实践,跟着这篇配置教程走,你可以做到给任何一个需要数学公式的站点添加支持. 教程如标题所述是针对 Mathja ...

  4. C# 生成行和列

    private DataTable GetListBind() { DataTable dt = new DataTable(); try { dt.Columns.Add("1" ...

  5. NMAP-服务扫描

    1.版本探测 2.扫描强度 共分1-9级,默认是7级,等级越高强度越高 同-sV一同使用 3.轻量扫描 等价于–version-intensity 2 4重量扫描 等价于–version-intens ...

  6. js学习之正则表达式

    js学习之正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模式 一:语法 ...

  7. this指针与const成员函数

    this指针的类型为:classType *const      // 即指向类类型非常量版本的常量指针 所以,我们不能把this绑定到一个常量对象上 ===>  不能在一个常量对象上调用普通的 ...

  8. kmeans算法理解及代码实现

    github:kmeans代码实现1.kmeans代码实现2(包含二分k-means) 本文算法均使用python3实现 1 聚类算法   对于"监督学习"(supervised ...

  9. sublime Text3 设置用新标签页打开新的文件

    今天用sublime Text3 打开项目文件,发现单击文件就可以打开,但是有一个问题:每次打开新文件就会覆盖当前的标签页,无法在新的标签页打开.于是在网上查了一下. 网上有人说在Preference ...

  10. VMbox复制虚拟机后网卡问题-bring up interface eth0:Device eth0 does not seem to be present

    1.使用 ifconfig -a 查看mac地址 eg:HWaddr:08:00:29:B2:2B   2.vi /etc/sysconfig/network-scripts/ifcfg-eth0 将 ...