CUIT-ACM 2017-01-14 新生训练赛E题菜鸟微见解

题意给你一串数字,有两种算法,具体回答哪一种算法需要看输入的数字,第一种算法就是将给定的数字顺序从第r个累加到第l个,第二种算法是将给定的顺序再从小到大排序一遍,再从第r个累加到第l个.

方法就是分别将第一种算法与第二种算法都预先打表存放好,输入那个我就直接输出那个就是了,记住一定要先打好表,如果输一个算一个会TLE的,具体方法参照代码.

#include
#include
using namespace std;
long long arr[100005],v[100005],u[100005];
int t;
void vchuli()
{   int i;
    for(i=1;i<=t;i++){
        v[i]=arr[i]+v[i-1];
    }
}

void uchuli()
{   int i;
    sort(arr+1,arr+t+1);
    for(i=1;i<=t;i++){
        u[i]=arr[i]+u[i-1];
    }
}
int main()
{   int i,a,l,r,k;
    scanf("%d",&t);
    for(i=1;i<=t;i++){
        scanf("%lld",&arr[i]);
    }
    vchuli();
    uchuli();
    scanf("%d",&k);
    while(k--){
        scanf("%d %d %d",&a,&l,&r);
        if(a==1)
            printf("%lld\n",v[r]-v[l-1]);
        else
            printf("%lld\n",u[r]-u[l-1]);
    }
}


你可能感兴趣的:(CUIT-ACM 2017-01-14 新生训练赛E题菜鸟微见解)