美文网首页
CodeForces - 433B - Kuriyama Mir

CodeForces - 433B - Kuriyama Mir

作者: Cyril1317 | 来源:发表于2017-01-16 11:47 被阅读0次

*嗯,这题其实就是她给你两个类型,让你输出相应的答案;
类型1:输入数组直接进行累加
类型2:将输入数组排序然后进行累加

拿样例分析

6 //输入数组有几个数字
6 4 2 7 2 7 //输入数组
3 //有几个问题需要解答
t l r // t只有1和2代表她问的问题类型 l,r代表输出第l个到第r个的累加值
2 3 6
1 3 4
1 1 6

不多说了,上代码*

#include<stdio.h>
#include <algorithm>
using namespace std;

long long a[111111], v[111111], u[111111];  //a数组存输入的数值,v存第一类型累加值,u存第二类型累加值,在外部定义数组每一位初始值为0;
long long i, n, m, l, r, type;

void ini1()  //第一类型累加预处理
{
    scanf("%lld", &n);
    for (i = 0; i < n; i++)//累加
    {
        scanf("%lld", &a[i]);
        v[i+1] = a[i] + v[i];   // v[1] = a[0]+v[0];  v[2] = a[1]+v[1]...可知v[1] = a[1], v[2]=a[2]+a[1]...以此类推  
    }
}

void ini2() //第二类型累加预处理
{
    sort(a, a+n); // 将输入数组排序
    for (i = 0; i < n; i++)
        u[i+1] = a[i] + u[i];
}

int main()
{
    ini1(); //问题1初始化
    ini2(); //问题2初始化
    scanf("%lld", &m);
    while(m--)
    {
        scanf("%lld%lld%lld", &type, &l, &r);
        if (type == 1)//判断方案
            printf("%lld\n", v[r]-v[l-1]); 因为数组下标未位移量,所以从3累加到6是4个数字,所以减去l-1而不是l
        else
            printf("%lld\n", u[r]-u[l-1]);
    }
    return 0;
}

时间复杂度是线性的

第一篇题解,有不足之处,请见谅。

相关文章

网友评论

      本文标题:CodeForces - 433B - Kuriyama Mir

      本文链接:https://www.haomeiwen.com/subject/lhsubttx.html