首页 > 其他分享 >[ABC371D] 1D Country 线段树解法

[ABC371D] 1D Country 线段树解法

时间:2024-09-15 14:23:46浏览次数:1  
标签:pr seq Country 线段 cin ABC371D 1D res op

其实这题还可以用值域线段树来做的。。。

考虑到 \([-1e9,1e9]\) 的数据范围,则一般的线段树绝对会MLE,但同时我们注意到点的个数只有 \(2e5\) 个,考虑使用动态开点线段树。

即对于每个村庄,看做一个点,所以我们的线段树无需模拟满二叉树。

由于 \(log_2(2e9)\approx30\) ,所以我们的线段树数组需要至少开到 \(30 \times 2e5 = 6e6\) 。

代码:

#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;
}

标签:pr,seq,Country,线段,cin,ABC371D,1D,res,op
From: https://www.cnblogs.com/adsd45666/p/18415221

相关文章

  • [ABC371D] 1D Country 题解
    这题,怎么说呢,\(STL\)大法好。前置芝士:lower_pound函数在结构体上的使用。那其实这题便是一个二分前缀和的水题了。结构体存储每个村庄的距离\(x\),人口\(d\)。对于每个输入的\([l,r]\)二分查找其对应的村庄,进行一次答案的统计,输出即可。代码:#include<bits/stdc++.......
  • torch中 nn.BatchNorm1d
    nn.BatchNorm1d是PyTorch中的一个用于一维数据(例如序列或时间序列)的批标准化(BatchNormalization)层。批标准化是一种常用的神经网络正则化技术,旨在加速训练过程并提高模型的收敛性和稳定性。它通过对每个输入小批次的特征进行归一化处理来规范化输入数据的分布。在一维数据上使......
  • AtCoder Beginner Contest 161D 题解
    原题链接:洛谷链接;AtCoder链接思路每次根据上一位,计算下一位为TA-1/TA/TA+1,放入queue中,最后输出第\(K\)次弹出的整数。注意事项不用longlong会WA!上一位为\(0\)时下一位不能为\(-1\)!(要特判)上一位为\(9\)时下一位不能为\(10\)!(也要特判)代码#include<cstdio>#include<que......
  • 生成树协议(STP:802.1D、RSTP:802.1w、MSTP:802.1s)
    在二层网络中,如果没有生成树协议,会带来哪些问题:1、广播风暴2、MAC地址表飘移3、重复数据帧接收回顾生成树有哪些术语:1、根桥为了破除环路,生成树网络首先要选举出一个首脑,头脑,首领。叫做根桥,也叫作根交换机2、桥IDbridge-id:由桥优先级(默认取值为32768,必须为4096......
  • mini-lsm通关笔记Week1Day7
    Summary在上一章中,您已经构建了一个具有get/scan/put支持的存储引擎。在本周末,我们将实现SST存储格式的一些简单但重要的优化。欢迎来到Mini-LSM的第1周零食时间!在本章中,您将:在SST上实现布隆过滤器,并集成到LSM读路径get中。以SST块格式实现对key存储的压缩。要将测试用例......
  • mini-lsm通关笔记Week1Day6
    项目地址:https://github.com/skyzh/mini-lsm个人实现地址:https://gitee.com/cnyuyang/mini-lsmSummary在本章中,您将:使用L0flush实现LSM写路径。实现逻辑以正确更新LSM状态。要将测试用例复制到启动器代码中并运行它们,cargoxcopy-test--week1--day6cargoxsch......
  • 软设每日一练2——某计算机系统页面大小为4K,若进程的页面变换表如下所示,逻辑地址为十
    题目:某计算机系统页面大小为4K,若进程的页面变换表如下所示,逻辑地址为十六进制1D16H。该地址经过变换后,其物理地址应为十六进制(        )​        A.1024H    B.3D16H     C.4Dl6H    D.6D16H            ......
  • AGC041D Problem Scores 题解
    在分值不降的条件下,要使任意一个大小为\(k\)的子集\(S\)内题目的分值之和少于任意一个大小为\(k+1\)的子集\(T\)内题目的分值之和,容易发现只需要取\(S\)为后\(k\)道题目,\(T\)为前\(k+1\)道题目时满足限制即可。换而言之,只需要对满足\(a\)的每一段长为\(k+......
  • E+H CPF81-LH11D4电极应用于哪些领域
    污水处理:在污水处理过程中,PH值是控制化学反应和确保生物处理效率的关键因素。E+HCPF81-LH11D4电极能够准确、稳定地监测污水中的PH值,帮助操作人员及时调整处理工艺,确保出水质量达标。冶金工业:冶金过程中,如矿石的浸出、冶炼和电解等,都需要精确控制溶液的PH值。E+HCPF81-LH1......
  • 介绍一个瘦身脚本:Win11Debloat
    见仁见智,不喜勿喷。https://github.com/Raphire/Win11Debloat以下是google机器翻译的:Win11DebloatWin11Debloat是一个简单、易用且轻量级的PowerShell脚本,可以删除预装的Windows臃肿软件应用程序、禁用遥测并通过禁用或删除侵入性界面元素、广告等来简化体验。无需亲自......