列表

详情


NC51356. A Tiny Problem with intergers

描述

给定长度为N的数列A,然后输入M行操作指令。

第一类指令形如“C l r d”,表示把数列中第l~r个数都加d。

第二类指令形如“Q X”,表示询问数列中第x个数的值。

对于每个询问,输出一个整数表示答案。

输入描述

第一行包含两个整数N和M。
第二行包含N个整数A[i]。
接下来M行表示M条指令,每条指令的格式如题目描述所示。

输出描述

对于每个询问,输出一个整数表示答案。
每个答案占一行。

示例1

输入:

10 5
1 2 3 4 5 6 7 8 9 10
Q 4
Q 1
Q 2
C 1 6 3
Q 2

输出:

4
1
2
5

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 161ms, 内存消耗: 1628K, 提交时间: 2020-09-30 20:17:00

#include <bits/stdc++.h>

using namespace std;
const int N = 1e5+10;
int n,c[N],a[N];
long long query(int x)
{
    long long ans=0;
    for(;x;x-=x&-x) ans+=c[x];
    return ans;
}
void add(int x,int y)
{
    for(;x<=n;x+=x&-x) c[x]+=y;
}
int main()
{
    char c;
    int m,l,r,d,x;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    while(m--)
    {
        cin>>c;
        if(c=='Q'){
            cin>>x;cout<<a[x]+query(x)<<endl;
        }
        else{
            cin>>l>>r>>d;
            add(l,d);
            add(r+1,-d);
        }
    }
    return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 189ms, 内存消耗: 4140K, 提交时间: 2023-07-15 16:10:38

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;

int a[N],b[N];
int n;

void add(int x,int k){
	for(;x<=n;x+=x&-x)b[x]+=k; 
}

int ask(int x){
	int ans=0;
	for(;x;x-=x&-x)ans+=b[x];
	return ans;
}

int main(){
	int k;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	while(k--){
		char c;
		cin>>c;
		if(c=='Q'){
			int z;
			cin>>z; 
			cout<<a[z]+ask(z)<<endl;
		}else {
			int l,r,d;
			cin>>l>>r>>d;
			add(l,d);
			add(r+1,-d);
		}
	}
}

上一题