C41 线段树+差分 P2184 贪婪大陆

视频链接:227 线段树+差分 P2184 贪婪大陆_哔哩哔哩_bilibili

 

Luogu P2184 贪婪大陆

复制代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

#define ls u<<1
#define rs u<<1|1
const int N=100005;
int n,m;
struct tree{
  int l,r,sum[2];
}tr[N*4];
//sum[0]:区间起点数, sum[1]:区间终点数

void pushup(int u,int k){ //上传
  tr[u].sum[k]=tr[ls].sum[k]+tr[rs].sum[k];
}
void build(int u,int l,int r){ //建树
  tr[u]={l,r,0,0};
  if(l==r)return;
  int mid=(l+r)>>1;
  build(ls,l,mid);
  build(rs,mid+1,r);
}
void change(int u,int x,int k){ //点修
  if(tr[u].l==tr[u].r){
    tr[u].sum[k]++; return;
  }
  if(x<=tr[ls].r) change(ls,x,k);
  else change(rs,x,k);
  pushup(u,k);
}
int query(int u,int x,int y,int k){ //区查
  if(x>tr[u].r || y<tr[u].l)return 0;
  if(x<=tr[u].l&&tr[u].r<=y)return tr[u].sum[k];
  return query(ls,x,y,k)+query(rs,x,y,k);
}
int main(){
  scanf("%d%d",&n,&m);
  build(1,1,n);
  for(int i=1;i<=m;i++){
    int q,l,r; scanf("%d%d%d",&q,&l,&r);
    if(q==1) change(1,l,0), change(1,r,1);
    else printf("%d\n",query(1,1,r,0)-query(1,1,l-1,1));
  }
}
复制代码

 

posted @   董晓  阅读(250)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2022-10-08 G28 求组合数 高精度 线性筛
2022-10-08 G27 求组合数 卢卡斯定理
2022-10-08 G26 求组合数 快速幂
点击右上角即可分享
微信分享提示