题意:区间加,区间乘,单点询问

思路:假设一个点为a,那么他可以表示为m * a + sum,所以区间加就变为m * a + sum + sum2,区间乘变为m * m2 * a + sum * m2。左右两边的块要先puhs down。

代码:

#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + 10;
const int M = maxn * 30;
const ull seed = 131;
const int INF = 0x3f3f3f3f;
const int MOD = 1e4 + 7;
struct Block{
int l, r;
}b[maxn];
int a[maxn], sum[maxn], mult[maxn], belong[maxn];
int n, block;
void down(int bl){
for(int i = b[bl].l; i <= b[bl].r; i++){
a[i] = (a[i] * mult[bl] + sum[bl]) % MOD;
}
mult[bl] = 1;
sum[bl] = 0;
}
void add(int l, int r, int c){
int bl = belong[l], br = belong[r];
if(bl == br){
down(bl);
for(int i = l; i <= r; i++){
a[i] = (a[i] + c) % MOD;
}
}
else{
down(bl);
for(int i = l; i <= b[bl].r; i++){
a[i] = (a[i] + c) % MOD;
}
for(int i = bl + 1; i <= br - 1; i++){
sum[i] = (sum[i] + c) % MOD;
}
down(br);
for(int i = b[br].l; i <= r; i++){
a[i] = (a[i] + c) % MOD;
}
}
}
void mul(int l, int r, int c){
int bl = belong[l], br = belong[r];
if(bl == br){
down(bl);
for(int i = l; i <= r; i++){
a[i] = (a[i] * c) % MOD;
}
}
else{
down(bl);
for(int i = l; i <= b[bl].r; i++){
a[i] = (a[i] * c) % MOD;
}
for(int i = bl + 1; i <= br - 1; i++){
mult[i] = (mult[i] * c) % MOD;
sum[i] = (sum[i] * c) % MOD;
}
down(br);
for(int i = b[br].l; i <= r; i++){
a[i] = (a[i] * c) % MOD;
}
}
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
}
block = sqrt(n);
for(int i = 1; i <= n; i++){
belong[i] = (i - 1) / block + 1;
}
for(int i = 1; i <= belong[n]; i++){
b[i].l = (i - 1) * block + 1;
b[i].r = min(n, b[i].l + block - 1);
sum[i] = 0, mult[i] = 1;
}
for(int i = 1; i <= n; i++){
int o, l, r;
int c;
scanf("%d%d%d%d", &o, &l, &r, &c);
if(o == 0){
add(l, r, c);
}
else if(o == 1){
mul(l, r, c);
}
else{
int ans = (a[r] * mult[belong[r]] % MOD + sum[belong[r]]) % MOD;
printf("%d\n", ans);
}
}
return 0;
}

最新文章

  1. ArcGIS AddIN开发:如何调用ArcMap中的选择工作空间的窗体
  2. LinkedHashMap及其源码分析
  3. hdu-5933----hdu-5943
  4. eclipse基础及开发插件
  5. Android -- 加载布局
  6. python学习之认识字符串
  7. petapoco-SQLServer模型增加注释
  8. Unity shader(CG) 写一个 散色、折射、反射、菲涅尔、gamma、简单后期屏幕特效
  9. Lucene:信息检索与全文检索
  10. C与OC、C++的区别
  11. css画小米、遨游logo
  12. jQuery中Ajax的应用
  13. DiskLruCache硬盘缓存技术详解
  14. Prometheus-Consul-Api
  15. [Swift]LeetCode646. 最长数对链 | Maximum Length of Pair Chain
  16. 【go】golang中置new()函数和make()函数的区别
  17. python小练习:使用循环和函数实现一个摇骰子小游戏。游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11&lt;=总值&lt;=18为“大”,3&lt;=总值&lt;=10为“小”。然后告诉玩家猜对或者是猜错的结果。
  18. eclipse中安装windowbuilder插件、应用及卸载
  19. codeforces982A
  20. urllib2特点--urllib2.Request对象,定制请求头部信息

热门文章

  1. 图像Demosaic算法及其matlab实现
  2. Docker容器日志清理方案
  3. 使用Bat自动打包并通过FTP发送到备份服务器——实战测试
  4. jQuery 多选与清除
  5. error Unexpected use of comma operator no-sequences解决过程
  6. uni-app请求uni.request封装使用
  7. circus reload
  8. Python基础(函数)
  9. P1663 山
  10. 收集整理Idea常用配置及插件