zoukankan      html  css  js  c++  java
  • 【HLOJ 557】 数列求和

    由于近日一个人呆机房较多,没什么人陪我聊天,一些无聊的话全写博客里了,见谅。


    【题目描述】

    假设有一列数 {Ai }(1 ≤ i ≤ n) ,支持如下两种操作:

    (1)将 A k 的值加 D 。( k, D 是输入的数)

    (2) 输出 A s +A s+1 +…+A t 。( s, t 都是输入的数, S ≤ T )

    根据操作要求进行正确操作并输出结果。

    【输入格式】

    输入文件第一行一个整数 n(0<=n<=100000) ;

    第二行为 n 个整数,表示 {A i } 的初始值。

    第三行为一个整数 m(0<=m<=150000) ,表示操作数。 下接 m 行,每行描述一个操作,有如下两种情况:

    ADD k d ( 表示将 A k 加 d , 1<=k<=n , d 为整数 )

    SUM s t (表示输出 A s +…+A t )

    【题解大意】

    其实说白了是道不准用数据结构水的cdq模板。

    【调试中途】

    问题:没有输出!

    可能的原因:

    1.莫不是输入的数据有问题 -> 没有问题

    2.莫不是两个变量的记录有问题 ->没有问题

    输出每次cdq的左右区间,发现它一直递归到小的区间之后就没有然后了不会递归回去。

    3.莫不是cdq的开闭区间有问题 ->将闭区间改成开区间->递归到较小区间后会递归回来了->样例可以输出->依然错误

    4.改变变量的起始值,改变区间开闭之后的隐患->发现有的时候是对的有时候错了?->蜜汁错误

    5.真的不知道哪里错了啊啊啊啊啊->忍不住爆了一句粗口发现机房好像除了我还有一个女老师

    ->摊在椅背上绝望了一会儿->持续打表->发现输入数据的处理果然是有问题的->知道问题啦好嗨森

    6.改了十分钟计数的变量->调出来啦啦啦

    【code】

    #include<bits/stdc++.h>
    using namespace std;
    #define File "shulie"
    #define ll long long
    inline void file(){
        freopen(File".in","r",stdin);
        freopen(File".out","w",stdout);
    }
    const int mxn = 5e5+5;
    int n,M;
    struct T{
        int k,id; ll v;
        friend bool operator <(T x,T y){
            return x.id==y.id ? x.k<y.k : x.id<y.id;
        }
    }t[mxn],p[mxn];
    int ans[mxn];
    int d = 0;
    inline void cdq(int l,int r){
        if(r-l<=1) return;
        int mid = (l+r) >>1;
        cdq(l,mid),cdq(mid,r);
        int ret = 0;
        int i = l,j = mid,k = 0;
        
        while(i<mid && j<r){
            if(t[i] < t[j]){
                if(t[i].k == 1) ret += t[i].v;
                p[k] = t[i],++k,++i;
            }else{
                if(t[j].k == 2) ans[t[j].v] -= ret;
                if(t[j].k == 3) ans[t[j].v] += ret;
                p[k] = t[j],++k,++j;
            }
        }
        while(i<mid) p[k] = t[i],++k,++i;
        while(j<r){
            if(t[j].k == 2) ans[t[j].v] -= ret;
            if(t[j].k == 3) ans[t[j].v] += ret;
            p[k] = t[j],++k,++j;
        }
        for(int i = 0;i < k; ++i) t[i+l] = p[i];
    }
    int tot(0);
    int main(){
        file();
        scanf("%d",&n);
        for(int i = 1;i <= n; ++i){
            t[tot].id = i,t[tot].k = 1;
            scanf("%lld",&t[tot].v);
            ++tot;
        }
        scanf("%d",&M);
        for(int i = 1;i <= M; ++i){
            char s[5];    scanf("%s",s);
            if(s[0]=='A'){
                t[tot].k = 1;
                scanf("%d %lld",&t[tot].id,&t[tot].v);
            }else{
                int l,r;
                scanf("%d %d",&l,&r);
                ++d;
                t[tot].k = 2,t[tot].id = l-1,t[tot].v = d;
                t[++tot].k = 3,t[tot].id = r,t[tot].v = d;
            }
            ++tot;
        }
        cdq(0,tot);
        for(int i = 1;i <= d; ++i) printf("%d
    ",ans[i]);
        return 0;
    }
    /*
    4
    1 4 2 3
    3
    SUM 1 3
    ADD 2 50
    SUM 2 3
    */
    View Code
  • 相关阅读:
    007 Java引用数据类型
    005 Java数组
    002 Java 引用数据类型示例
    001 Java入门和简介
    2.接口测试工具-Postman
    1、接口测试-前言
    测试工程师的进阶之路
    接口测试概述
    期末作品检查
    完成个人中心—导航标签
  • 原文地址:https://www.cnblogs.com/ve-2021/p/10848956.html
Copyright © 2011-2022 走看看