洛谷P2184——贪婪大陆
传送门:QAQQAQ
题意:给一个长度为$n$的区间,每次可以进行两种操作:
1.在$[l,r]$这个区间里放置一个和之前种类不同的炸弹
2.查询在$[l,r]$区间内有多少种不同种类的炸弹
思路:第一反应是线段树:但一直没想出来线段树来维护什么
和?和可能会因为炸弹覆盖区间长度为改变,而不是因为炸弹种类而改变。
最大值?可能两个完全不相交的区间却有两种不同的炸弹
所以我们要换一个思路想:我们可以把题目转化成这样:给你一个区间,求之前那些区间和该区间相交的有几个
再想:两个区间相交有什么特点呢?两个区间相离又有什么特点呢?——两个区间相离要么是$l1>r2$,要么是$r1<l2$
我们就很容易找到思路了:我们建立两个线段树分别维护区间内$l,r$分别出现的次数
然后对于每一个询问的$l,r$,在$[1,l-1]$区间内查询$r$有几个(cnt1),在$[r+1,n]$查询$l$有几个(cnt2),然后用之前的总区间个数减去($cnt1+cnt2$)即可。
(思路很像CF1190D,维护位置存在点的个数,一般这种题都要用离散化(莫名又想到CDQ分治……))
代码:(线段树当然可以,但树状数组似乎更方便)
- #include<bits/stdc++.h>
- using namespace std;
- const int N=;
- int sum[][N*],n,m;//0:l 1:r
- void build(int x,int l,int r)
- {
- if(l==r)
- {
- sum[][x]=;
- sum[][x]=;
- return;
- }
- int mid=(l+r)>>;
- build(x+x,l,mid);
- build(x+x+,mid+,r);
- }
- void update(int x,int l,int r,int pos,int bl)
- {
- if(l==r)
- {
- sum[bl][x]++;
- return;
- }
- int mid=(l+r)>>;
- if(mid>=pos) update(x+x,l,mid,pos,bl);
- else update(x+x+,mid+,r,pos,bl);
- sum[bl][x]=sum[bl][x+x]+sum[bl][x+x+];
- }
- int query(int x,int l,int r,int L,int R,int bl)
- {
- int ret=;
- if(L>R) return ;
- if(L<=l&&r<=R) return sum[bl][x];
- int mid=(l+r)>>;
- if(mid>=L) ret+=query(x+x,l,mid,L,R,bl);
- if(mid<R) ret+=query(x+x+,mid+,r,L,R,bl);
- return ret;
- }
- int main()
- {
- int sum=;
- scanf("%d%d",&n,&m);
- while(m--)
- {
- int x,y,opt;
- scanf("%d%d%d",&opt,&x,&y);
- if(opt==)
- {
- update(,,n,x,);
- update(,,n,y,);
- sum++;
- }
- else
- {
- int now=;
- now+=query(,,n,y+,n,);
- now+=query(,,n,,x-,);
- printf("%d\n",sum-now);
- }
- }
- return ;
- }
洛谷P2184——贪婪大陆的更多相关文章
- 洛谷 P2184 贪婪大陆 解题报告
P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小\(FF\)的\(Tower\) \(defence\)宣告失败--人类被蚂蚁们逼到了\(Greed\) \(Island\)上的一个海湾.现在 ...
- 洛谷P2184 贪婪大陆
题目背景 面对蚂蚁们的疯狂进攻,小FF的\(Tower\) \(defence\)宣告失败--人类被蚂蚁们逼到了\(Greed\) \(Island\)上的一个海湾.现在,小FF的后方是一望无际的大海 ...
- 洛谷 P2184 贪婪大陆
题面 又是一类比较套路的题呢? 假如我们的地雷都表示成 [l[i],r[i]] ,要求[L,R],那么就相当于要求满足 (l[i]<=R && r[i]>=L)的i的个数. ...
- P2184 贪婪大陆
P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败……人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前 ...
- AC日记——贪婪大陆 洛谷 P2184
贪婪大陆 思路: 树状数组: 跪烂.. 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 int ...
- 【洛谷P2184】贪婪大陆
贪婪大陆 题目链接 对于一个区间[l,r],右端点在l左边即[1,l-1]中的区间与区间[l,r]没有交集, 左端点在r右边即[r,n]中的区间与区间[l,r]没有交集, 其余区间必与[l,r]有交集 ...
- 洛谷 P2446 [SDOI2010]大陆争霸 解题报告
P2446 [SDOI2010]大陆争霸 题目背景 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭的神曾·布拉 ...
- 线段树 洛谷P3932 浮游大陆的68号岛
P3932 浮游大陆的68号岛 题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无 ...
- 洛谷——P1690 贪婪的Copy
P1690 贪婪的Copy 题目描述 Copy从卢牛那里听说在一片叫yz的神的领域埋藏着不少宝藏,于是Copy来到了这个被划分为个区域的神地.卢牛告诉了Copy这里共有个宝藏,分别放在第Pi个(1&l ...
随机推荐
- FFT快速傅里叶模板
FFT快速傅里叶模板…… /* use way: assign : h(x) = f(x) * g(x) f(x):len1 g(x):len2 1. len = 1; while(len < ...
- C++ STL(一)介绍及string
STL: C++标准模板库的简称,它是C++的一部份.标准C++库的所有的标识符都是在一个名为std的命名空间中定义的 在使用STL中相关模板时,需要包含相关头文件,然后using namespace ...
- delphi 给程序加托盘图标
一些程序运行时,会在桌面的右下角显示一个图标(任务栏的右边),这类图标称为 托盘.托盘是一个PNotifyIconDataA类型的结构,要增加托盘图标其实就是对结构PNotifyIconDataA的操 ...
- 用 Windows Live Writer 和 SyntaxHighlighter 插件写高亮代码
博客园内置支持SyntaxHighlighter代码着色,代码着色语法:<pre class='brush:编程语言'>代码</pre>. 需要注意的是:如何你使用Syntax ...
- layui多图上传
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CSS:CSS 图像透明/不透明
ylbtech-CSS:CSS 图像透明/不透明 1.返回顶部 1. CSS 图像透明/不透明 使用CSS很容易创建透明的图像. 注意:CSS Opacity属性是W3C的CSS3建议的一部分. 更多 ...
- CSS:CSS Display(显示) 与 Visibility(可见性)
ylbtech-CSS:CSS Display(显示) 与 Visibility(可见性) 1.返回顶部 1. CSS Display(显示) 与 Visibility(可见性) display属性设 ...
- 『Golang』—— 标准库之 time
... package main import ( "fmt" "time" ) func main() { time.AfterFunc(time.Milli ...
- JAR API
JAR API包括使用 manifest 文件的类.Manifest类的一个对象表示一个manifest文件. 在代码中创建一个Manifest对象,如下所示: 1 Manifest manifest ...
- Rsync 恢复 libselinux.SO.1
libselinux.SO.1 这个文件对 CentOS 7很重要, 误删掉后,会导致很多命令无法使用(比如yum ,rpm 命令),利用rsync这个工具来修复. 服务端执行如下配置:(选取正常 ...