這題,怎麼說呢, \(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;
}