您的位置:首页 > 大数据 > 人工智能

Codeforces 443B Kuriyama Mirai's Stones

2015-08-05 09:48 344 查看
题目链接:http://codeforces.com/problemset/problem/433/B

题意:给大小为N的序列,M次查询,有2种查询方式,一种是给出区间L和R,问序列中L与R之间所有成员的和,一种是给出L和R,求序列第L大的数到第R大的数之间的成员的和。

思路:刚开始用树状数组解决,然后发现数据太大无法保存,然后发现该题是不用更新维护的,只要做一遍预处理就可以了,然后很蠢的针对第一种询问做了预处理,发现超时,然后才发现要再对第2种查询进行预处理

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define LL long long
using namespace std;
LL s[100030],a[100030];

int main()
{
int n,m;
while (scanf("%d",&n)!=EOF)
{
s[0]=0;
for (int i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
s[i]=s[i-1]+a[i];
}
a[0]=0;
sort(a+1,a+n+1);
for (int i=1;i<=n;i++)
{
a[i]=a[i-1]+a[i];
}
scanf("%d",&m);

for (int i=0;i<m;i++)
{
int k,l,r;
scanf("%d%d%d",&k,&l,&r);
if (k==1)
{
printf("%I64d\n",s[r]-s[l-1]);
}
else
{
LL tem=0;
printf("%I64d\n",a[r]-a[l-1]);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: