K - Transformation-hdu 4578(多操作混合区间更新)线段树
#include<algorithm>
#include<stdio.h>
using namespace std; #define lson u<<1
#define rson u<<1|1 const int MAXN = 1e5+5;
const int mod = 1e4+7; struct node
{///num表示这个区间的数(区间里面的值都相等,不相等时候为0),mul记录乘的次数,add表示需要加的数
int l, r, num, mul, add, cover;///cover 等于0的时候表示区间的值不相同,等于1表示区间进行覆盖操作,等于2表示区间的值相同
int m(){return (l+r)>>1;}
int len(){return r-l+1;}
}a[MAXN<<2]; void Up(int u)
{
if( a[lson].cover && a[rson].cover )
if( a[lson].num == a[rson].num )
a[u].num = a[lson].num, a[u].cover = 2;
}
void Down(int u)
{
if(a[u].l != a[u].r)
{
if( a[u].cover == 1 )
{
a[lson].cover = a[rson].cover = 1;
a[lson].num = a[rson].num = a[u].num;
a[lson].add = a[rson].add = 0;
a[lson].mul = a[rson].mul = 1; a[u].cover = 2, a[u].mul = 1, a[u].add = 0;
}
if( a[u].mul > 1 )
{
(a[lson].mul *= a[u].mul)%=mod, (a[rson].mul *= a[u].mul)%=mod;
(a[lson].num *= a[u].mul)%=mod, (a[rson].num *= a[u].mul)%=mod;
(a[lson].add *= a[u].mul)%=mod, (a[rson].add *= a[u].mul)%=mod; a[u].mul = 1;
} if( a[u].add )
{
(a[lson].add += a[u].add)%=mod, (a[rson].add += a[u].add)%=mod;
(a[lson].num += a[u].add)%=mod, (a[rson].num += a[u].add)%=mod; a[u].add = 0;
}
}
}
void Build(int u, int l, int r)
{
a[u].add = 0, a[u].cover = 2, a[u].mul = 1;
a[u].num = 0, a[u].l = l, a[u].r = r; if(l == r)
return ; Build(lson, l, a[u].m());
Build(rson, a[u].m()+1, r);
}
void Insert(int u, int l, int r, int op, int val)
{
if(a[u].l == l && a[u].r == r && a[u].cover)
{
if(op == 3)
a[u].add=0, a[u].cover = 1, a[u].mul = 1, a[u].num = val;
else if(op == 2)
(a[u].mul *= val)%=mod, (a[u].add *= val)%=mod, (a[u].num *= val)%=mod;
else
(a[u].add += val)%=mod, (a[u].num += val)%=mod; return ;
} Down(u); a[u].cover = 0; if(r <= a[u].m())
Insert(lson, l, r, op, val);
else if(l > a[u].m())
Insert(rson, l, r, op, val);
else
{
Insert(lson, l, a[u].m(), op, val);
Insert(rson, a[u].m()+1, r, op, val);
} Up(u);
}
int Query(int u, int l, int r, int p)
{ if(a[u].l == l && a[u].r == r && a[u].cover)
{
int ans = 1;
while(p--) (ans *= a[u].num)%=mod;
ans = (ans * a[u].len())%mod; return ans;
} Down(u); if(r <= a[u].m())
return Query(lson, l, r, p);
else if(l > a[u].m())
return Query(rson, l, r, p);
else
{
int lsum = Query(lson, l, a[u].m(), p);
int rsum = Query(rson, a[u].m()+1, r, p); return (lsum+rsum) % mod;
}
} int main()
{
int N, M; while(scanf("%d%d", &N, &M), N+M)
{
int u, v, op, c; Build(1, 1, N); while(M--)
{
scanf("%d%d%d%d", &op, &u, &v, &c); if(op != 4)
Insert(1, u, v, op, c);
else
printf("%d\n", Query(1, u, v, c));
}
} return 0;
}
K - Transformation-hdu 4578(多操作混合区间更新)线段树的更多相关文章
- Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 【区间更新 线段树】
传送门:http://codeforces.com/contest/1108/problem/E2 E2. Array and Segments (Hard version) time limit p ...
- K - Transformation HDU - 4578 线段树经典题(好题)
题意:区间 加 变成定值 乘 区间查询:和 平方和 立方和 思路:超级超级超级麻烦的一道题 设3个Lazy 标记分别为 change 改变mul乘 add加 优先度change>m ...
- Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树
https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- HDU 1754:I Hate It(线段树模板)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针
BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...
- xdoj-1324 (区间离散化-线段树求区间最值)
思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i] 覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...
- 2017 CCPC 杭州 HDU6273J 区间修改(线段树&差分数组)
http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf 解析 线段树区间延迟更新 或 差分数组 两个数 统计2和3的最少的 ...
- 【题解】P1712 [NOI2016]区间(贪心+线段树)
[题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...
随机推荐
- 简单说明Python中的装饰器的用法
简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下 装饰器对与 ...
- Retrofit2 简介 语法 案例
简介 官网:http://square.github.io/retrofit/ GitHub:https://github.com/square/retrofit/ compile 'com.squa ...
- js面向对象--类式继承
//待研究//类式继承 //js中模拟类式继承的3个函数 //简单的辅助函数,让你可以将新函数绑定到对象的 prototype 上 Function.prototype.method = functi ...
- python面对对象编程----------7:callable(类调用)与context(上下文)
一:callables callables使类实例能够像函数一样被调用 如果类需要一个函数型接口这时用callable,最好继承自abc.Callable,这样有些检查机制并且一看就知道此类的目的是c ...
- Oracle创建表空间以及用户,并授权
//创建临时表空间 create temporary tablespace testtemp tempfile 'D:/app/Administrator/oradata/testdata/te ...
- 创建dblink遇到一系列问题
创建dblink遇到一系列问题,有时间 把问题整理一下
- Sqlite 错误码
#define SQLITE_OK 0 /* 成功 | Successful result */ /* 错误码开始 */ #define SQLITE_ERROR 1 /* SQL错误 或 丢失数据库 ...
- Java数据库连接池的几种配置方法(以MySQL数据库为例)
Java数据库连接池的几种配置方法(以MySQL数据库为例) 一.Tomcat配置数据源: 前提:需要将连接MySQL数据库驱动jar包放进Tomcat安装目录中common文件夹下的lib目录中 1 ...
- 记录GDI 文本的设置
需要说明的是,在GDI+中,我们可以通过SetTextRenderingHint来控制文本输出的质量.例如下面的代码,其结果如图7.15所示. Graphics graphics( pDC->m ...
- 【USACO 2.4.5】分数化小数
[描述] 写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式. 如果小数有循环节的话,把循环节放在一对圆括号中. 例如, 1/3 =0.33333333 写成0.(3), 4 ...