列表

详情


NC19429. 红球进黑洞

描述

在心理疏导室中有一种奇特的疏导工具,叫做红球。红球被提前分为了许多正方形小方格。
每当有人来找ATB做心理疏导时,ATB就会让他去先玩红球,然后通过红球小格方的高度来判断一个人的压力程度的高低
具体地讲,ATB会让该人对于一个序列执行以下操作
1. 区间求和,即输入l,r,输出
2. 区间异或,即输入l,r,k,对于l ≤ i ≤ r,将xi变为
可是ATB天天算计那么多答案,已经对这份工作产生了厌烦,所以请你帮帮他,对于一组给定的数据,输出对应的答案
ATB会将你感谢到爆

输入描述

第一行两个整数n和m,表示数列长度和询问次数
第二行有n个整数,表示这个数列的初始数值
接下来有m行,形如 1 l r 或者 2 l r k
分别表示查询
或者对于l ≤ i ≤ r,将xi变为

输出描述

对于每一个查询操作,输出查询的结果并换行

示例1

输入:

10 10
8 5 8 9 3 9 8 3 3 6 
2 1 4 1
1 2 6 
2 9 10 8
1 1 7 
2 4 7 8
2 8 8 6
2 2 3 0
1 1 2 
2 9 10 4
1 2 3 

输出:

33
50
13
13

原站题解

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

C++11(clang++ 3.9) 解法, 执行用时: 843ms, 内存消耗: 3860K, 提交时间: 2020-09-13 09:05:30

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+50;
ll n,m;
ll a[maxn]; 
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	while(m--)
	{
		int q;cin>>q;
		ll l,r,k;
		if(q==1)
		{
			cin>>l>>r;
			ll s = 0;
			while(l<=r) s+=a[l],l++;
			cout<<s<<endl;
		}
		else
		{
			cin>>l>>r>>k;
			while(l<=r) a[l]^=k,l++;
		}
	}
}

C++14(g++5.4) 解法, 执行用时: 2007ms, 内存消耗: 1256K, 提交时间: 2020-06-16 20:52:24

#include<cstdio>
int n,m,l,r,k,i,x,a[100010]={0};
long long ans=0;
int main()
{
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++) scanf("%d",&a[i]);
	while(m--)
	{
		ans=0;
		scanf("%d%d%d",&x,&l,&r);
		if(x==1)
		{
			for(i=l;i<=r;i++) ans+=a[i];
			printf("%llu\n",ans);
		}
		else
		{
			scanf("%d",&k);
			for(i=l;i<=r;i++)
			a[i]^=k;
		}
	}
}

上一题