链接:
https://codeforces.com/problemset/problem/433/B
题意:
给定数列n,给出两种查询
- 查询1,给定L,R,查询原数列L到R的数字和
- 查询2,给定L,R,查询从大到小排序的数列的L到R的数字和
解:
排序+前缀和
vans!
实际代码:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long int ll;
const int Size=1E5+5;
int sz[Size];
int px[Size];
ll sum1[Size];
ll sum2[Size];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>sz[i];
px[i]=sz[i];
sum1[i]=sz[i]+sum1[i-1];
}
sort(px+1,px+n+1);
for(int i=1;i<=n;i++)
{
sum2[i]=px[i]+sum2[i-1];
}
int m;
cin>>m;
for(int i=1;i<=m;i++)
{
int mods;
cin>>mods;
int l,r;
switch(mods)
{
case 1:
cin>>l>>r;
cout<<sum1[r]-sum1[l]+sz[l]<<endl;
break;
case 2:
cin>>l>>r;
cout<<sum2[r]-sum2[l]+px[l]<<endl;
break;
default:break;
}
}
}
限制:
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output