题目描述
小 FF 最后一道防线是一条长度为 nn 的战壕,小 FF 拥有无数多种地雷,而 SCV 每次可以在 [L, R]区间埋放同一种不同于之前已经埋放的地雷。由于情况已经十万火急,小 FF 在某些时候可能会询问你在 [L,R]区间内有多少种不同的地雷,他希望你能尽快的给予答复。

输入格式
第一行为两个整数n和m,n表示防线长度,m 表示 SCV 布雷次数及小 FF 询问的次数总和。

接下来有m 行,每行三个整数 q,l,r:

若 q=1,则表示 SCV 在 [l, r]这段区间布上一种地雷;
若 q=2,则表示小 FF 询问当前 [l, r] 区间总共有多少种地雷。

第一眼看到就可以发现是线段树,但如何对它进行维护呢?很显然,直接维护是做不到的,因为区间统计时可能会有重复。其实不难看出两个端点是重中之重,我们应该从两个端点下手,怎么操作呢,可以维护两个东西,一个suml(起点),sumr(终点),每次操作就在起点(suml)和终点(sumr)++,让其次查询的时候求出1~r的suml - 1~l的sumr就可以了。
至于为什么这么操作,嘿嘿,我们可以将1~l分解成 l~r , 1~l 区间的suml与sumr可以互相抵消,那么剩下的就是l~r的suml。

#include<bits/stdc++.h>
using namespace std;
int n,m;
int len=0;
int root;
struct node
{int l,r,lc,rc,suml,sumr;
};
node e[500000];
int bt(int x,int y)
{len++;int now=len,lc=-1,rc=-1;if(x==y) ;else{int mid=(x+y)/2;lc=bt(x,mid);rc=bt(mid+1,y);}e[now]={x,y,lc,rc,0,0};return now;
}
void cg1(int now,int x)
{int l=e[now].l,r=e[now].r;if(l==r){e[now].suml++;return ;}else {int mid=(l+r)/2;int lc=e[now].lc,rc=e[now].rc;if(x>=mid+1) cg1(rc,x);else cg1(lc,x);e[now].suml=e[lc].suml+e[rc].suml;return ;}
}
void cg2(int now,int x)
{int l=e[now].l,r=e[now].r;if(l==r){e[now].sumr++;return ;}else {int mid=(l+r)/2;int lc=e[now].lc,rc=e[now].rc;if(x>=mid+1) cg2(rc,x);else cg2(lc,x);e[now].sumr=e[lc].sumr+e[rc].sumr;return ;}
}
int find1(int now,int x,int y)
{int l=e[now].l,r=e[now].r;if(l==x&&y==r) {return e[now].suml;}else{int lc=e[now].lc,rc=e[now].rc;int mid=(l+r)/2;if(x>=mid+1) return find1(rc,x,y);else if(y<=mid) return find1(lc,x,y);else return find1(lc,x,mid)+find1(rc,mid+1,y);}
}
int find2(int now,int x,int y)
{int l=e[now].l,r=e[now].r;if(l==x&&y==r) {return e[now].sumr;}else{int lc=e[now].lc,rc=e[now].rc;int mid=(l+r)/2;if(x>=mid+1) return find2(rc,x,y);else if(y<=mid) return find2(lc,x,y);else return find2(lc,x,mid)+find2(rc,mid+1,y);}
}
int find(int x,int y)
{return find1(root,1,y)-find2(root,1,x-1);
}
int main()
{scanf("%d%d",&n,&m);root=bt(1,n);for(int i=1;i<=m;i++){int p,x,y;scanf("%d",&p);if(p==1){scanf("%d%d",&x,&y);
//          printf("-");cg1(root,x);cg2(root,y);}else {scanf("%d%d",&x,&y);if(x>y) swap(x,y);printf("%d\n",find(x,y)); }}return 0;}

lugou P2184 贪婪大陆(线段树)相关推荐

  1. 洛谷 P2184 贪婪大陆 解题报告

    P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小\(FF\)的\(Tower\) \(defence\)宣告失败--人类被蚂蚁们逼到了\(Greed\) \(Island\)上的一个海湾.现在 ...

  2. 【洛谷】P2184 贪婪大陆

    题目地址: https://www.luogu.com.cn/problem/P2184 题目背景: 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败--人类被蚂蚁们逼到了Greed ...

  3. P2184 贪婪大陆

    题目背景 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败--人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前方是变异了的超级蚂蚁. 小 ...

  4. P2184 【贪婪大陆】

    看到全是线段树或者树状数组写法,就来提供一发全网唯一cdq分治三维偏序解法吧 容易发现,这个题的查询就是对于每个区间l,r,查询有多少个修改区间li,ri与l,r有交集 转化为数学语言,就是查询满足l ...

  5. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  6. 线段树——HDU - 1698

    题目含义 就是初始化一堆数为1 可以经过操作把一个区间的数都改变 并求这堆数的总大小 题目分析 有一个 #include<iostream> #include<stdio.h> ...

  7. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  8. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  9. [bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树

    Holiday Painting 节日画画 bzoj-1582 Usaco-2009 Hol 题目大意:给定两个n*m的01网格图.q次操作,每次将第二个网格图的子矩阵全部变成0或1,问每一次操作后两 ...

最新文章

  1. 本科生去面试算法工程师心酸的故事
  2. windows2008下VS2008发布失败
  3. Linux下更好用的帮助命令—cheat
  4. Techo 大会:AI 会替代 DBA 么?
  5. Binary String Matching
  6. eclipse调试的时候查看变量出现com.sun.jdi.InvocationException occurred invoking method.
  7. ​8次迭代5大升级,旷视天元1.0预览版正式发布
  8. Reapter 中客户端控件和服务器端控件的选择
  9. 6.2(求一个整数各位数字之和)
  10. ES6学习笔记---二进制数组(应用)
  11. 洛谷1008 三连击
  12. 批量word转pdf——VBS脚本,在office宏中运行即可
  13. 如何正确的获得一个view的宽和高
  14. 我被老板炒鱿鱼了!因为我在IDE里看漂亮小姐姐跳舞!(IntelliJ IDEA插件开发之打造炫酷动态背景墙)
  15. 企业如何管理终端软件安装
  16. 苏强SN系列服务器说明书,SN2000交流伺服驱动器使用手册.pdf
  17. 13 个优秀的 Vue 开源项目及合集推荐
  18. 什么是SSL双向认证,与单向认证证书有什么区别?
  19. 计算机毕设之餐厅选座订餐系统的设计与实践
  20. 生命中不仅仅只有代码

热门文章

  1. GIS类发明专利的总结
  2. Ultimaker 2:整体性能出众的家用3D打印机
  3. css美化下拉框select
  4. 2022年1月17号~19号
  5. notepad++格式化XML
  6. pip最新升级不成功的方法讲解
  7. 双目立体匹配入门【一】(理论)
  8. 百度PaddleOCR Docker GPU版安装全指南
  9. mount 命令查看挂载系统
  10. Unity调用摄像头并截图