【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\n",ans[i]);
    return 0;
}
/*
4
1 4 2 3
3
SUM 1 3
ADD 2 50
SUM 2 3
*/
View Code

猜你喜欢

转载自www.cnblogs.com/ve-2021/p/10848956.html
今日推荐