洛谷 P2184 贪婪大陆 解题报告
P2184 贪婪大陆
题目背景
面对蚂蚁们的疯狂进攻,小\(FF\)的\(Tower\) \(defence\)宣告失败……人类被蚂蚁们逼到了\(Greed\) \(Island\)上的一个海湾。现在,小\(FF\)的后方是一望无际的大海, 前方是变异了的超级蚂蚁。 小\(FF\)还有大好前程,他可不想命丧于此, 于是他派遣手下最后一批改造\(SCV\)布置地雷以阻挡蚂蚁们的进攻。
题目描述
小\(FF\)最后一道防线是一条长度为\(N\)的战壕, 小\(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]\)区间总共有多少种地雷。
输出格式:
对于小FF的每次询问,输出一个答案(单独一行),表示当前区间地雷总数。
说明:
对于30%的数据: \(0<=n, m<=1000\);
对于100%的数据:\(0<=n, m<=10^5\).
说两个方法吧
方法一:维护区间和和合并区间时多加上的一部分,基于容斥原理,是这位大佬想到的
具体的:
我们维护\(sum\)代表这个区间的种类数,每次区间修改操作即为对二进制所划分的每个区间+1(不是对每个值,是对区间),防止退化我们用一个\(lazy1\)维护
这时候在区间合并的时候就会产生问题,会重复统计。
我们再维护一个值\(mer\)代表这个二进制区间被多少次划分时分开了,则统计答案时即为\(sum[ls]+sum[rs]-mer[ls]\)
这个也是区间操作,同样用一个\(lazy2\)来维护
Code:
#include <cstdio>
#define ls id<<1
#define rs id<<1|1
const int N=100010;
int sum[N<<2],mer[N<<2],lazy1[N<<2],lazy2[N<<2],n,m;
void push_down(int id,int l,int r)
{
if(l!=r)
{
sum[ls]+=lazy1[id];
sum[rs]+=lazy1[id];
mer[ls]+=lazy2[id];
lazy1[ls]+=lazy1[id];
lazy1[rs]+=lazy1[id];
lazy2[ls]+=lazy2[id];
lazy2[rs]+=lazy2[id];
}
lazy1[id]=lazy2[id]=0;
}
void change(int id,int l,int r,int L,int R)
{
if(l==L&&r==R)
{
sum[id]++;
lazy1[id]++;
lazy2[id]++;
return;
}
int Mid=L+R>>1;
if(r<=Mid)
change(ls,l,r,L,Mid);
else if(l>Mid)
change(rs,l,r,Mid+1,r);
else
{
mer[ls]++;
change(ls,l,Mid,L,Mid);
change(rs,Mid+1,r,Mid+1,R);
}
push_down(id,L,R);
sum[id]=sum[ls]+sum[rs]-mer[ls];
}
int query(int id,int l,int r,int L,int R)
{
push_down(id,L,R);
if(l==L&&r==R)
return sum[id];
int Mid=L+R>>1;
if(r<=Mid)
return query(ls,l,r,L,Mid);
else if(l>Mid)
return query(rs,l,r,Mid+1,r);
else
return query(ls,l,Mid,L,Mid)+query(rs,Mid+1,r,Mid+1,R)-mer[ls];
}
int main()
{
scanf("%d%d",&n,&m);
int q,l,r;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&q,&l,&r);
if(q==1) change(1,l,r,1,n);
else printf("%d\n",query(1,l,r,1,n));
}
return 0;
}
方法二:维护区间两端进行统计
我们发现,对于一个区间\(1\)~\(i\),\(i\)及其左边的区间的左端点的数量即为答案
对于一个区间\(i\)~\(n\),\(i\)左边的右端点不是它的答案
综合一下,对于一个区间\(l\)$r$,$r$及左边的左端点数量-$l$左边的右端点数量,不就是$l$\(r\)所覆盖的区间数量了吗?
单点修改,我们只需要用两个树状数组维护就行了
Code:
#include <cstdio>
const int N=100010;
int s[2][N],n,m;
int query(int typ,int x)
{
int sum=0;
while(x)
{
sum+=s[typ][x];
x-=x&-x;
}
return sum;
}
void add(int typ,int x)
{
while(x<=n)
{
s[typ][x]+=1;
x+=x&-x;
}
}
int main()
{
scanf("%d%d",&n,&m);
int q,l,r;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&q,&l,&r);
if(q==1)
add(0,l),add(1,r);
else
printf("%d\n",query(0,r)-query(1,l-1));
}
return 0;
}
2018.7.12
洛谷 P2184 贪婪大陆 解题报告的更多相关文章
- 洛谷P2184 贪婪大陆
题目背景 面对蚂蚁们的疯狂进攻,小FF的\(Tower\) \(defence\)宣告失败--人类被蚂蚁们逼到了\(Greed\) \(Island\)上的一个海湾.现在,小FF的后方是一望无际的大海 ...
- 洛谷 P2184 贪婪大陆
题面 又是一类比较套路的题呢? 假如我们的地雷都表示成 [l[i],r[i]] ,要求[L,R],那么就相当于要求满足 (l[i]<=R && r[i]>=L)的i的个数. ...
- 洛谷P2184——贪婪大陆
传送门:QAQQAQ 题意:给一个长度为$n$的区间,每次可以进行两种操作: 1.在$[l,r]$这个区间里放置一个和之前种类不同的炸弹 2.查询在$[l,r]$区间内有多少种不同种类的炸弹 思路:第 ...
- 洛谷 P1783 海滩防御 解题报告
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
- 洛谷 P3177 树上染色 解题报告
P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...
- 洛谷 P4705 玩游戏 解题报告
P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...
随机推荐
- HTML6的10个高级新特性
网络技术正趋向于发展为一个巨大的移动APP市场,在Web开发的革命浪潮中起着指示性作用,自HTML引入以来,应用程序变得So easy,web开发中运用先进技术也很容易处理各种复杂Bug. 作为专业的 ...
- DQL、DML、DDL、DCL全名是啥?
SQL(Structure Query Language)结构化查询语言 DQL(data query language)数据查询语言 select操作 DML(data manipulation l ...
- Android工程导入Unity3D(避坑版)
最近与各种牛逼的项目管理软件打交道,比如SourceTree,要看英文版的才看得懂,中文反而不会用!... 这篇博客适合没怎么接触过安卓的小伙伴们,网上也有很多相关的教程,但是大多都没有具体的操作或则 ...
- Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法
#1背景 Spring Data REST是Spring Data项目的一部分,可以轻松地在Spring Data存储库之上构建超媒体驱动的REST Web服务. 恶意的PATCH请求使用精心构造 ...
- Xcode中的文件类型
文件类型 Xcode中的文件类型,总共4种类型: 1 普通文件(File) 2 Group(在Xcode中就是黄色的文件夹) 3 Folder(在Xcode中就是蓝色的文件夹) 4 Framework ...
- 第35次Scrum会议(11/23)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文小组照片 二.开会信息 时间:2017/11/23 17:03~17:24,总计21min.地点:东北师 ...
- Notes of Daily Scrum Meeting(11.11)
Notes of Daily Scrum Meeting(11.11) 今天是11月11号光棍节,不知道大家的购物热情被点燃没有,有没有买到自己心仪的东西.额,今天我们的团队任务进度和昨天差不多, 每 ...
- 20162327WJH第二次实验——树
20162327WJH第一次实验--线性结构 实 验 报 告 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 王旌含 学号:20162327 成绩: 指导教师:娄嘉鹏 王志强 实验 ...
- fullPage全屏高度自适应
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- java微信开发之接口连接
个人学习注册订阅号就行,把资料尽可能完善,不然开发时权限不够,然后登陆,点击订阅号然后扫码就可以微信关注.