徐州网络赛H-Ryuji doesn't want to study【线段树】
Ryuji is not a good student, and he doesn't want to study. But there are n books he should learn, each book has its knowledge a[i]a[i].
Unfortunately, the longer he learns, the fewer he gets.
That means, if he reads books from ll to rr, he will get a[l] \times L + a[l+1] \times (L-1) + \cdots + a[r-1] \times 2 + a[r]a[l]×L+a[l+1]×(L−1)+⋯+a[r−1]×2+a[r](LL is the length of [ ll, rr ] that equals to r - l + 1r−l+1).
Now Ryuji has qq questions, you should answer him:
11. If the question type is 11, you should answer how much knowledge he will get after he reads books [ ll, rr ].
22. If the question type is 22, Ryuji will change the ith book's knowledge to a new value.
Input
First line contains two integers nn and qq (nn, q \le 100000q≤100000).
The next line contains n integers represent a[i]( a[i] \le 1e9)a[i](a[i]≤1e9) .
Then in next qq line each line contains three integers aa, bb, cc, if a = 1a=1, it means question type is 11, and bb, cc represents [ ll , rr ]. if a = 2a=2 , it means question type is 22 , and bb, cc means Ryuji changes the bth book' knowledge to cc
Output
For each question, output one line with one integer represent the answer.
样例输入复制
5 3
1 2 3 4 5
1 1 3
2 5 0
1 4 5样例输出复制
10
8题目来源
题意:两种操作 一种是更新某节点
一种是查询l-r的一个值 这个值的计算公式是:
思路:
看上去就应该是一个线段树 区间查询单点更新
但是对于查询的处理没有那么简单
可以采用前缀和的思想 因为这个公式中的系数是递减的
那么我们在线段树中维护两个值 一个是本身的值 一个是(n-i+1)倍的值
那么我们查询的时候只需要查到倍数之和 减去 本身之和的(n-r)倍就可以了
WA了一会 因为没用long long
还是要注意啊这些细节 虽然单个没有超int 但是相加就会超的
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<vector>
#include<set>
//#include<bits/stdc++.h>
#define inf 0x7f7f7f7f7f7f7f7f
using namespace std;
typedef long long LL;
const int maxn = 1e5 + 10;
LL tree[maxn << 2], treetime[maxn << 2], a[maxn];
int n, q;
void pushup(int rt)
{
	tree[rt] = tree[rt << 1] + tree[rt << 1 | 1];
	treetime[rt] = treetime[rt << 1] + treetime[rt << 1 | 1];
}
void build(int rt, int l, int r)
{
	if (l == r) {
		tree[rt] = a[l];
		treetime[rt] = a[l] * (n - l + 1);
		return;
	}
	int m = (l + r) / 2;
	build(rt << 1, l, m);
	build(rt << 1 | 1, m + 1, r);
	pushup(rt);
}
void update(int x, LL val, int l, int r, int rt)
{
	if (l == r) {
		tree[rt] = val;
		treetime[rt] = val * (n - l + 1);
		return;
	}
	int m = (l + r) / 2;
	if (x <= m) {
		update(x, val, l, m, rt << 1);
	}
	else {
		update(x, val, m + 1, r, rt << 1 | 1);
	}
	pushup(rt);
}
LL query(int L, int R, int l, int r, int rt)
{
	if (L <= l && R >= r) {
		return tree[rt];
	}
	int m = (l + r) / 2;
	LL ans = 0;
	if (L <= m) {
		ans += query(L, R, l, m, rt << 1);
	}
	if (R > m) {
		ans += query(L, R, m + 1, r, rt << 1 | 1);
	}
	pushup(rt);
	return ans;
}
LL querytime(int L, int R, int l, int r, int rt)
{
	if (L <= l && R >= r) {
		return treetime[rt];
	}
	int m = (l + r) / 2;
	LL ans = 0;
	if (L <= m) {
		ans += querytime(L, R, l, m, rt << 1);
	}
	if (R > m) {
		ans += querytime(L, R, m + 1, r, rt << 1 | 1);
	}
	return ans;
}
void init()
{
    memset(tree, 0, sizeof(tree));
    memset(treetime, 0, sizeof(treetime));
}
int main()
{
	while (scanf("%d%d", &n, &q) != EOF) {
	    if(n == 0){
            while(q--){
                int op, l, r;
                scanf("%d%d%d", &op, &l, &r);
                printf("0\n");
            }
            continue;
	    }
        init();
		for (int i = 1; i <= n; i++) {
			scanf("%lld", &a[i]);
		}
		build(1, 1, n);
		for (int i = 0; i < q; i++) {
			int op, l, r;
			scanf("%d%d%d", &op, &l, &r);
			if (op == 1) {
				LL ans = querytime(l, r, 1, n, 1) - (n - r) * query(l, r, 1, n, 1);
				printf("%lld\n", ans);
			}
			else {
				update(l, r, 1, n, 1);
			}
		}
	}
	return 0;
}
徐州网络赛H-Ryuji doesn't want to study【线段树】的更多相关文章
- 2018icpc徐州网络赛-H Ryuji doesn't want to study(线段树)
		题意: 有n个数的一个数组a,有两个操作: 1 l r:查询区间[l,r]内$a[l]*(r-l+1)+a[l+1]*(r-l)+a[l+2]*(r-l-1)+\cdots+a[r-1]*2+a[r] ... 
- 2018徐州网络赛H. Ryuji doesn't want to study
		题目链接: https://nanti.jisuanke.com/t/31458 题解: 建立两个树状数组,第一个是,a[1]*n+a[2]*(n-1)....+a[n]*1;第二个是正常的a[1], ... 
- ACM-ICPC 2018 徐州赛区网络预赛H Ryuji doesn't want to study(树状数组)题解
		题意:给你数组a,有两个操作 1 l r,计算l到r的答案:a[l]×L+a[l+1]×(L−1)+⋯+a[r−1]×2+a[r] (L is the length of [ l, r ] that ... 
- ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study(树状数组)
		Output For each question, output one line with one integer represent the answer. 样例输入 5 3 1 2 3 4 5 ... 
- 计蒜客 31460 - Ryuji doesn't want to study - [线段树][2018ICPC徐州网络预赛H题]
		题目链接:https://nanti.jisuanke.com/t/31460 Ryuji is not a good student, and he doesn't want to study. B ... 
- ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study (线段树)
		Ryuji is not a good student, and he doesn't want to study. But there are n books he should learn, ea ... 
- 南昌网络赛 I. Max answer (单调栈 + 线段树)
		https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ... 
- ACM-ICPC 2018徐州网络赛-H题 Ryuji doesn't want to study
		死于update的一个long long写成int了 真的不想写过程了 ******** 树状数组,一个平的一个斜着的,怎么斜都行 题库链接:https://nanti.jisuanke.com/t/ ... 
- ACM-ICPC 2018 徐州赛区网络预赛     H. Ryuji doesn't want to study
		262144K Ryuji is not a good student, and he doesn't want to study. But there are n books he should ... 
- ACM-ICPC 2018 徐州赛区网络预赛 H  Ryuji doesn't want to study (树状数组差分)
		https://nanti.jisuanke.com/t/31460 题意 两个操作.1:查询区间[l,r]的和,设长度为L=r-l+1, sum=a[l]*L+a[l+1]*(L-1)+...+a[ ... 
随机推荐
- 第三百二十一节,Django框架,发送邮件
			第三百二十一节,Django框架,发送邮件 全局配置settings.py EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' ... 
- linux -- Apache执行权限
			最近在用php调用exec方法去执行一个linux终端下的命令,结果每次都不能执行成功,网上多番搜寻,最终找到一篇有用的文章,主要原因是因为Apache的执行权限的问题.以下是原文(稍加修改): 利用 ... 
- vnc远程控制软件怎么用
			CC是一款不错的局域网控制软件,它的轻便让人无法相信,下载过该软件的人都知道,该软件只有大小 工具/原料 我这里使用的是vnc-E4_2_9X32中文版 被控制端的安装 1 我们先来被控制电脑 ... 
- oracle的loop等循环语句的几个用法小例子[转]
			--loop循环用法 (输出1到10) declare v_num number(2) := 0; begin loop v_num := v_num + 1; exit when v_num > ... 
- JavaSE(八)集合之List
			前面一篇的corejava讲的是集合的概述,这一篇我将详细的和大家讲解一下Collection下面的List.set.queue这三个子接口.希望大家能得到提升. 一.List接口 1.1.List接 ... 
- Windows下基于eclipse的Storm应用开发与调试
			原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3971113.html 本文以一个简单的example来讲解如何开发storm应用程序 1.创建maven ... 
- Linux 查找具体的文件名称
			在大概知道文了件地址的情况下, 比如root@masterback:/# cd /usr/lib/jvm/ root@masterback:/usr/lib/jvm# ls 出来具体的文件名称 
- [转] Windows局域网通过NTP设置时间同步
			NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议. 如果局域网计算机(Windows系统)可以连接Internet,可以通过“控制面板”— ... 
- linux,shell脚本中获取脚本的名字,使用脚本的名字。
			需求描述: 写shell脚本的过程中,有时会需要获取脚本的名字,比如,有的时候,脚本 中会有usage()这种函数,可能就会用到脚本的名字. 实现方法: shell脚本中,通过使用$0就可以获取到脚本 ... 
- [java ] java.util.zip.ZipException: error in opening zip file
			严重: Failed to processes JAR found at URL [jar:file:/D:/tools/apache-tomcat-7.0.64_2/webapps/bbs/WEB- ... 
