2471. [EZOI 2016]源氏的数学课

【题目描述】

给定一个数列,有如下两种操作:

1:将其中的一个数加上s(s为整数)

2:给定区间[l,r],求al* (r-l+1) + al-1*(r-l)+ ...... + ar-1*2 + a1*1的值。

即:

$\Large \sum_{i=l}^{r} a_i·(r-i+1)$

【输入格式】

第一行有2个数n,q,分别表示Teacher数列中数的个数以及操作次数。

接下来的一行有n个数,第i个数表示$a_i$。

再接下来q行,每行三个数;第一个数是order。如果order=1,那么接下来两个数:x, s,即把$a_x$加上s;如果order=2,那么接下来两个数:l, r,即求这一段区间源氏要求的答案。

【输出格式】

对于每一个询问(order=2)输出所求答案

【样例输入】

5 3

2 4 1 3 5

2 2 4

1 2 3

2 2 4

【样例输出】

17

26

【提示】

不保证数列全为正数,但保证是整数。

$n<=100000, q<=100000$,保证答案不超过long long (int64) 范围,保证数据有梯度

【来源】

未知

维护al* (r-l+1) + al-1*(r-l)+ ...... + ar-1*2 + a1*1 这个序列

我们可以发现 这个和前缀和序列很相似

于是我们可以 考虑一下前缀和

S10:  a10+a9 + a8 + a7 + a6 + a+ a+ a+ a+ a1

S9:            a9 + a8 + a7 + a6 + a+ a+ a+ a+ a1

S8:         a8 + a7 + a6 + a+ a+ a+ a+ a1

S7:         a7 + a6 + a+ a+ a+ a+ a1

S6:              a6 + a+ a+ a+ a+ a1

S5:              a+ a+ a+ a+ a1

S4:              a+ a+ a+ a1

S3:                a+ a+ a1

S2:                   a+ a1

S1:                     a1

显然 要查询[6,10] 的话 需要S6+S7+S8+S9+S10-(S5*5) //5为[6,10] 的区间长度

我们可以用线段树维护输入序列前缀和的区间和

单点修改的话 就成了区间修改

修改 从当前位置一直到n

 1 #include <cstdio>
 2 #include <cctype>
 3
 4 typedef long long LL;
 5
 6 const int MAXN=100010;
 7
 8 int n,q;
 9
10 LL a[MAXN];
11
12 struct SgtmentTree {
13     int l,r;
14     int tag;
15     LL sum;
16 };
17 SgtmentTree t[MAXN<<2];
18
19 inline void read(int&x) {
20     int f=1;register char c=getchar();
21     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
22     for(;isdigit(c);x=x*10+c-48,c=getchar());
23     x=x*f;
24 }
25
26 inline void down(int now) {
27     t[now<<1].tag+=t[now].tag;
28     t[now<<1|1].tag+=t[now].tag;
29     t[now<<1].sum+=(t[now<<1].r-t[now].l+1)*t[now].tag;
30     t[now<<1|1].sum+=(t[now<<1|1].r-t[now<<1|1].l+1)*t[now].tag;
31     t[now].tag=0;
32 }
33
34 void build_tree(int now,int l,int r) {
35     t[now].l=l;t[now].r=r;
36     if(l==r) {
37         t[now].sum=a[l];
38         return;
39     }
40     int mid=(l+r)>>1;
41     build_tree(now<<1,l,mid);
42     build_tree(now<<1|1,mid+1,r);
43     t[now].sum=t[now<<1].sum+t[now<<1|1].sum;
44 }
45
46 void modify(int now,int l,int r,int v) {
47     if(l<=t[now].l&&r>=t[now].r) {
48         t[now].sum+=(LL)(t[now].r-t[now].l+1)*v;
49         t[now].tag+=v;
50         return;
51     }
52     if(t[now].tag) down(now);
53     int mid=(t[now].l+t[now].r)>>1;
54     if(l<=mid) modify(now<<1,l,r,v);
55     if(r>mid) modify(now<<1|1,l,r,v);
56     t[now].sum=t[now<<1].sum+t[now<<1|1].sum;
57 }
58
59 LL query(int now,int l,int r) {
60     if(l<=t[now].l&&r>=t[now].r) return t[now].sum;
61     LL ans=0;
62     if(t[now].tag) down(now);
63     int mid=(t[now].l+t[now].r)>>1;
64     if(l<=mid) ans+=query(now<<1,l,r);
65     if(r>mid) ans+=query(now<<1|1,l,r);
66     return ans;
67 }
68
69 int hh() {
70     freopen("overwatch.in","r",stdin);
71     freopen("overwatch.out","w",stdout);
72     read(n);read(q);
73     for(int x,i=1;i<=n;++i) read(x),a[i]+=a[i-1]+x;
74     build_tree(1,1,n);
75     for(int type,x,y,i=1;i<=q;++i) {
76         read(type);read(x);read(y);
77         if(type==1) modify(1,x,n,y);
78         else {
79             LL ans=0;
80             ans=query(1,x,y)-query(1,x-1,x-1)*(y-x+1);
81             printf("%lld\n",ans);
82         }
83     }
84     return 0;
85 }
86
87 int sb=hh();
88 int main(int argc,char**argv) {;}

代码

2471. [EZOI 2016]源氏的数学课相关推荐

  1. [EZOI 2016]源氏的数学课

    题目链接:传送门 求 带单点修改 把式子拆开 求 ∑ i = l r a i ∗ r − ∑ i = l r a i ∗ i + ∑ i = l r a i \sum_{i=l}^{r} a_{i}* ...

  2. 2018.10.22 cogs2471. [EZOI 2016]源氏的数学课(线段树)

    传送门 线段树入门操作. 直接把题目给的 ( r − i + 1 ) ∗ a [ i ] (r-i+1)*a[i] (r−i+1)∗a[i]拆开变成 ( r + 1 ) ∗ 1 ∗ a [ i ] − ...

  3. 2016源创会深圳站—网易蜂巢架构

    一.蜂巢平台架构 1.如何快速构建一个CaaS平台? -容器技术 -镜像仓库 -编排服务 -IaaS服务(计算,网络,存储) -应用服务(数据库,缓存,日志) 2.研发+Docker+Kubernet ...

  4. 个人所得税计算器2016 by Jacksile

    个人所得税计算器2016 个人所得税计算器2016 税前薪资: 元 各项社会保险费: 元 起征点: 35004800元 应缴税款: 元 实发薪资: 元 个人所得税计算公式 应纳税额 = 应纳税所得额 ...

  5. 2016 只剩最后一个月 你的 技术债务 还清了吗?

    一夜醒来,猛然发现,2016 已经只剩最后一个月了! 回忆过去的 330 多个日与夜,哪些互联网圈的大事让你瞠目结舌? 也许是 AlphaGo 在堪称人脑游戏巅峰的围棋领域屡战告捷: 也许是 Poké ...

  6. MasteringOpenCV实战源码学习笔记 章节一

    所有代码都可以直接复制到VS里运行,所以就不放运行结果图了 基于OpenCV 4.1.1 课本 https://github.com/MasteringOpenCV/code 没有写完!因为其他原因我 ...

  7. 第三章 基本库的使用

    学习爬虫,最初的操作便是来模拟浏览器向服务器发出一个请求,那么我们需要从哪个地方做起呢?请求需要我们自己来构造吗?我们需要关心请求这个数据结构的实现吗?我们需要了解 HTTP.TCP.IP 层的网络传 ...

  8. 为什么喜欢打LOL(优质游戏特性分析)

    喜欢打撸啊撸的都有一个同感,我不喜欢打游戏,但我喜欢打撸啊撸 1.我们喜欢的是合作 开黑- 游戏成为了类似足球等运动的具有灵魂的项目,一堆人为了同一个目的而奋斗. 现在的青年聚会后不喜欢去KTV,往往 ...

  9. 95后小鲜肉勇夺360SRC“漏洞之王” 自称晚上挖洞最有感觉

    2月23日,360 SRC(安全应急响应中心)举行三周年颁奖典礼,年仅21岁的大学生白帽子y1ng凭借着高产高质的漏洞挖掘表现,一举夺得2016年的漏洞之王.据悉,2016年,y1ng通过向360SR ...

最新文章

  1. dbeaver数据库工具
  2. iOS 13 适配TextField 崩溃问题
  3. GAN 为什么需要如此多的噪声?
  4. [Java 并发编程实战] 设计线程安全的类的三个方式(含代码)
  5. 如何解决使用JSON.stringify时遇到的循环引用问题
  6. 转载:CEO如何“养好CIO同时管好CIO”?
  7. 有哪些适合新手练手的C/C++项目?
  8. socket编程(三)
  9. 面试题--------7、Files的常用方法
  10. 拓端tecdat|Python使用矩阵分解法找到类似的音乐
  11. UCOS II怎么查找当前就绪表中,优先级最高的任务
  12. 【求助】想知道Xcode怎么像devc一样调试程序
  13. 如何利用RPLIDAR A2进行多点触摸应用
  14. 远程桌面控制软件Teamviewer免费版安装
  15. codeforces 760B B. Frodo and pillows(二分)
  16. Git的诞生_繁星漫天_新浪博客
  17. 一款不错的Android环形进度条
  18. 为什么机会总是留给有准备的人?这是我听过最好的答案
  19. SLAM学习资源免费分享-转载
  20. 《CCNP安全Secure 642-637认证考试指南》——2.3节入侵者动机

热门文章

  1. 小程序开发必备功能的吐血整理【个人中心界面样式大全】
  2. 仿小米和iphone日历效果,基于Android week view
  3. python整除的最大数_在Python中被K整除的最小整数
  4. C和Java没那么香了,Serverless时代Rust即将称王?
  5. 代码随想录打卡day1(补卡)
  6. 【bzoj1116】 [POI2008]CLO
  7. 外资企业增资的注意事项有什么
  8. 利用qwebchannel实现Python和JS之间进行通信
  9. Docker学习目录
  10. 解决wireshark中npcap安装失败问题