[ABC371D] 1D Country 线段树解法
1.[ABC347C] Ideal Holidays题解2.《扶苏的问题》题解3.[ABC366C] Balls and Bag Query 题解4.[ABC366D] Cuboid Sum Query 题解5.P7706 文文的摄影布置 题解6.[ABC370C] Word Ladder 题解7.P11020 「LAOI-6」Radiation 题解8.P11019 「LAOI-6」[太阳]] 请使用最新版手机 QQ 体验新功能 题解9.[ABC371D] 1D Country 题解
10.[ABC371D] 1D Country 线段树解法
11.P1955 程序自动分析 题解12.[ABC376E] Max × Sum 题解13.[ABC379D] Home Garden 题解14.P11276 第一首歌 题解15.[ABC380C] Move Segment 题解其实这题还可以用值域线段树来做的。。。
考虑到
即对于每个村庄,看做一个点,所以我们的线段树无需模拟满二叉树。
由于
代码:
#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 = 6e6+10,maxx=2e5+10;
const int limt=1e9+10;
#define lson tree[p].ls
#define rson tree[p].rs
ll n,m;
ll tot,rt; //tot为点数,rt为根节点
ll posx[maxx]; //村庄位置
struct node{
ll ls,rs,sum; //sum为人口数
}tree[maxn];
void push_up(ll p){
tree[p].sum=tree[lson].sum+tree[rson].sum; //本质为求和线段树
}
void insert(ll pos,ll &p,ll l,ll r,ll d){ //插入点
if(!p){ //开新的点
p=++tot;
lson=rson=tree[p].sum=0; //初始化
}
if(l==r){
tree[p].sum+=d; //维护人口
return;
}
ll mid=(l+r)>>1;
if(pos<=mid) insert(pos,lson,l,mid,d); //递归寻找
else insert(pos,rson,mid+1,r,d);
push_up(p);
}
ll query(ll l,ll r,ll p,ll pl,ll pr){
if(!p) return 0; //若不存在
if(l<=pl&&r>=pr) return tree[p].sum; //下为正常线段树的求和函数
ll res=0,mid=(pl+pr)>>1;
if(l<=mid) res+=query(l,r,lson,pl,mid);
if(r>mid) res+=query(l,r,rson,mid+1,pr);
return res;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
seq(i,1,n){
cin>>posx[i];
}
seq(i,1,n){
ll op;
cin>>op;
insert(posx[i],rt,-limt,limt,op); //在值域中插入点
}
cin>>m;
seq(i,1,m){
int l,r;
cin>>l>>r;
cout<<query(l,r,rt,-limt,limt)<<"\n"; //区间查询
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】