<题目链接>

<转载于 >>> >

题目大意:

有一个序列,有四种操作:

1:区间[l,r]内的数全部加c。

2:区间[l,r]内的数全部乘c。

3:区间[l,r]内的数全部初始为c。

4:询问区间[l,r]内所有数的P次方之和。

解题分析:

不可能全部查询的节点,最好的情况就是查询到一段[l,r],这段区间内所有的值都相等,那么返回(r-l+1)*val 的值即可。只要标记区间内的所有数是否相同,并记录下区间内所有数相同的区间的值即可。每次询问时查询到区间内所有值相同的区间即可。

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long ll;
const int mod=;
const int M =1e5+; #define Lson rt<<1,l,mid
#define Rson rt<<1|1,mid+1,r
int n,m;
bool cnt[M<<];
ll tr[M<<];
void Pushdown(int rt){
if(cnt[rt]){
cnt[rt<<]=cnt[rt<<|]=true;
tr[rt<<]=tr[rt<<|]=tr[rt];
}
}
void Pushup(int rt){
if(!cnt[rt<<]||!cnt[rt<<|])cnt[rt]=false;
else if(tr[rt<<]!=tr[rt<<|])cnt[rt]=false;
else cnt[rt]=true,tr[rt]=tr[rt<<];
}
void update(int rt,int l,int r,int L,int R,int c,int type){
if(cnt[rt]&&L<=l&&r<=R){
if(type==)tr[rt]=(tr[rt]+c)%mod; //分三种情况进行操作
else if(type==)tr[rt]=(tr[rt]*c)%mod;
else tr[rt]=c;
return;
}
Pushdown(rt);
int mid=(l+r)>>;
if(L<=mid)update(Lson,L,R,c,type);
if(R>mid)update(Rson,L,R,c,type);
Pushup(rt);
}
int query(int rt,int l,int r,int L,int R,int c){
if(cnt[rt]&&L<=l&&r<=R){
ll res=;for(int i=;i<=c;i++)res*=tr[rt]; //得到tr[rt]的c次方(因为c<=3,所以可以不用快速幂)
res=res*(r-l+); //乘上区间长度
return res%mod;
}
Pushdown(rt);
int mid=(l+r)>>;
ll ans=;
if(L<=mid)ans+=query(Lson,L,R,c);
if(R>mid)ans+=query(Rson,L,R,c);
return ans%mod;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF,n||m){
memset(tr,,sizeof(tr));
memset(cnt,true,sizeof(cnt));
while(m--){
int op,x,y,c;
scanf("%d%d%d%d",&op,&x,&y,&c);
if(op>=&&op<=)update(,,n,x,y,c,op);
else printf("%d\n",query(,,n,x,y,c));
}
}
return ;
}

2018-09-25

最新文章

  1. Cesium原理篇:Property
  2. 核型SVM
  3. 验证视图状态MAC失败。如果此应用程序由网络场或群集承载,请确保配置指定了相同的validationKey和验证算法(转)
  4. 手机淘宝UWP
  5. HNU 13308 Help cupid
  6. HTML5 实现橡皮擦的擦除效果
  7. mysql主从配置脚本
  8. GetSystemMetrics()
  9. Android性能优化典范(二)
  10. Android(java)学习笔记116:PC_Phone通信程序报错
  11. 【思路、优化】UVa 11491 - Erasing and Winning
  12. Android----------eclipse常用快捷键
  13. 【衡阳八中noip模拟题】国色天香
  14. Spring中Quartz动态设置cronExpression
  15. **ERROR: Ninja build tool not found.
  16. freemarker自定义标签报错(二)
  17. Gradle入门到实战(一) — 全面了解Gradle
  18. 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
  19. python基础篇_002_基础数据类型
  20. python - 添加文件环境变量

热门文章

  1. mysql5.7设置简单密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  2. 《精通Oracle SQL(第2版)》PDF
  3. Confluence 6 用户目录图例 - Confluence 内部目录
  4. npm无反应的问题&amp;npm常用命令
  5. 《剑指offer》 反转链表
  6. WEB漏洞 XSS(一)
  7. vue 中动态绑定class 和 style的方法
  8. Java 写一段字符到指定的文本文档中,如果该文本文档不存在,则创建该文本文档
  9. MySQL is running but PID file could not be found(解决方法)
  10. html表单的使用