E - Kuriyama Mirai's Stones

2017-01-16  本文已影响0人  陌路晨曦

这道题的题意大概是,输入一串数字,没排序之前编号为1,从小到大排完序编号为2.
然后再输入编号,计算从第l个数字到第r个数字相加的和;
因为v1, v2, ..., vn (1 ≤ vi ≤ 10^9);
所以数组用long long声明;
开三个数组,数组a用来记录输入的数字;
数组b是排序前的累加值,数组c是排序后的累加值;
b[r]-b[l-1]即为排序前从第l个数字到第r个数字相加的和;

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    long long  a[100010];
    long long  b[100010];//用于记录排序前的累加值的大小b[i]=a[0]+……a[i]
    long long  c[100010];//用于记录排序后的累加值的大小c[i]=a[0]+……a[i]
    int t;
    cin>>t;
    for(int i=0;i<t;i++)
    {
        cin>>a[i];
        b[i+1]=a[i]+b[i];
    }
    sort(a,a+t);
    for(int i=0;i<t;i++)
    {
        c[i+1]=a[i]+c[i];
    }
    int n;
    cin>>n;
    while(n--)
    {
        int e,l,r;
        cin>>e>>l>>r;
        if(e==1)
        {
            cout<<b[r]-b[l-1]<<endl;
        }
        if(e==2)
        {
            cout<<c[r]-c[l-1]<<endl;
        }
    }
} 
上一篇 下一篇

猜你喜欢

热点阅读