[ABC371D] 1D Country 題解

adsd45666發表於2024-09-15

這題,怎麼說呢, \(STL\) 大法好。

前置芝士: lower_pound 函式在結構體上的使用。

那其實這題便是一個二分字首和的水題了。結構體儲存每個村莊的距離 \(x\) ,人口 \(d\) 。對於每個輸入的 \([l,r]\) 二分查詢其對應的村莊,進行一次答案的統計,輸出即可。

程式碼 :

#include <bits/stdc++.h>
#define seq(q, w, e) for (int q = w; q <= e; q++)
#define ll long long
using namespace std;
const int maxn = 2e5+10;
ll n,m,ans;
struct node{
    ll x,d;
    node(){}
    node(int a,int b):x(a),d(b){}           //初始化
    bool operator < (const node b)const{    //自定義比較函式
        return x<b.x;
    }
}a[maxn];                                   //村莊陣列

bool cmp(node a,node b){
    return a.x<b.x;                         //排序函式,以距離為關鍵詞
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;
    a[0].d=0;
    seq(i,1,n){
        cin>>a[i].x;
    }
    seq(i,1,n){
        cin>>a[i].d;
    } 
    sort(a+1,a+n+1,cmp);                  //輸入結構體後按距離排序
    seq(i,1,n){
        a[i].d+=a[i-1].d;                 //維護字首和
    }
    cin>>m;
    seq(i,1,m){
        ans=0;
        int l,r;
        cin>>l>>r;
        int sum1=lower_bound(a+1,a+1+n,node(l,0))-a,sum2=lower_bound(a+1,a+1+n,node(r,0))-a;  //二分查詢求區間
        if(a[sum2].x!=r) sum2--;      //由於low_pound返回的是第一個大於等於的數,所以如果不相等,需要減一
        ans=a[sum2].d-a[sum1-1].d;    //字首和查詢操作。
        cout<<ans<<endl;
    }
    return 0;
}