竞赛讨论区 > 区间和怎么做? 测试样例可以过,但是提交过不了
头像
酱梨第二深情
发布于 03-16 17:05
+ 关注

区间和怎么做? 测试样例可以过,但是提交过不了

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int, int> PII;

#define N 300010

vector<int> alls;
vector<PII> add, query; 

long long a[N], s[N];
int n, m;

//求出x离散化后的值(第一个>=x的位置)
int find(int x){
    int l = 0, r = alls.size()-1;
    int mid = (l+r) / 2;
    while (l < r){
        if (alls[mid] >= x)
            r = mid;
        else l = mid + 1;
        mid = (l + r) / 2;
    }
    return mid + 1;    //映射到1...n
} 

void insert(){
    int x, c;
    cin >> x >> c;
    alls.push_back(x);
    //将输入转化为插入操作
    add.push_back({x, c});
}

void search(){
    int l, r;
    cin >> l >> r;
    alls.push_back(l);
    alls.push_back(r);
    query.push_back({l, r});
}

int main(){
    cin >> n >> m;
    
    for (int i = 1; i <= n; i ++){
        int x, c;
        x = i;
        cin >> c;
        alls.push_back(x);
        add.push_back({x, c});
    }
    
    int flag;
    while (m --){
        cin >> flag;
        if (flag == 1){
            insert();
        }
        else if (flag == 2){
            search();
        }
    }

    sort(alls.begin(), alls.end());
    alls.erase(unique(alls.begin(), alls.end()), alls.end());
    
    //映射
    for (auto item : add){
        int x = find(item.first);
        a[x] += item.second;
        //cout << item.first << " " << x << " " << a[x] << endl;
    }
    
    
    /**/
    for (int i = 1; i <= alls.size(); i ++){
        s[i] += s[i-1] + a[i];
    }
    
    for (auto item : query){
        int l = find(item.first);
        int r = find(item.second);
        //cout << l << " " << r << endl;
        cout << s[r] - s[l-1] << endl;
    }
}

全部评论

(0) 回帖
加载中...
话题 回帖

本文相关内容

等你来战

查看全部

热门推荐