线段树【p2706】贪婪大陆
Background
面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败……人类被蚂蚁们逼到了Greed Island上的一个海湾。现在,小FF的后方是一望无际的大海, 前方是变异了的超级蚂蚁。 小FF还有大好前程,他可不想命丧于此, 于是他派遣手下最后一批改造SCV布置地雷以阻挡蚂蚁们的进攻。
Description
小FF最后一道防线是一条长度为N的战壕, 小FF拥有无数多种地雷,而SCV每次可以在[ L , R ]区间埋放同一种不同于之前已经埋放的地雷。 由于情况已经十万火急,小FF在某些时候可能会询问你在[ L' , R'] 区间内有多少种不同的地雷, 他希望你能尽快的给予答复。
Input
第一行为两个整数n和m; n表示防线长度, m表示SCV布雷次数及小FF询问的次数总和。
接下来有m行, 每行三个整数Q,L , R; 若Q=1 则表示SCV在[ L , R ]这段区间布上一种地雷, 若Q=2则表示小FF询问当前[ L , R ]区间总共有多少种地雷。
Output
对于小FF的每次询问,输出一个答案(单独一行),表示当前区间地雷总数。
思路巧妙的一个好题!
刚开始读错题就很伤
对于修改操作.
我们维护区间左端点与右端点对答案的贡献.(看完下面你会知道有什么用的)
而询问操作中,
我们已知区间\([l,r]\),此时只需要查询\([1,l-1]\)中的右端点的数量,\([r+1,n]\)的左端点数量.
显然,这个时候这两部分区间的地雷不会对\([l,r]\)构成影响.
我们再用一个变量\(tot\)维护已经埋下的地雷的种数.
此时用\(tot\)减去我们查询的左右两侧的地雷的数量即为当前的答案.
思路很巧妙,好题+
代码
#include<cstdio>
#include<algorithm>
#include<iostream>
#define ls o<<1
#define rs o<<1|1
#define R register
#define N 100008
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,m,tot;
struct cod{int pre,lst;}tr[N<<3];
void change_pre(int o,int l,int r,int pos)
{
if(l==r){tr[o].pre++;return;}
int mid=(l+r)>>1;
if(pos<=mid)change_pre(ls,l,mid,pos);
else change_pre(rs,mid+1,r,pos);
tr[o].pre=tr[ls].pre+tr[rs].pre;
}
void change_lst(int o,int l,int r,int pos)
{
if(l==r){tr[o].lst++;return;}
int mid=(l+r)>>1;
if(pos<=mid)change_lst(ls,l,mid,pos);
else change_lst(rs,mid+1,r,pos);
tr[o].lst=tr[ls].lst+tr[rs].lst;
}
int query_pre(int o,int l,int r,int x,int y)
{
if(x<=l and y>=r) return tr[o].pre;
int mid=(l+r)>>1,res=0;
if(x<=mid)res+=query_pre(ls,l,mid,x,y);
if(y>mid)res+=query_pre(rs,mid+1,r,x,y);
return res;
}
int query_lst(int o,int l,int r,int x,int y)
{
if(x<=l and y>=r)return tr[o].lst;
int mid=(l+r)>>1,res=0;
if(x<=mid)res+=query_lst(ls,l,mid,x,y);
if(y>mid) res+=query_lst(rs,mid+1,r,x,y);
return res;
}
int main()
{
in(n),in(m);
for(R int i=1,opt,l,r;i<=m;i++)
{
in(opt),in(l),in(r);
if(opt==1)
{
change_pre(1,1,n,l);
change_lst(1,1,n,r);
tot++;
}
else
printf("%d\n",tot-query_lst(1,1,n,1,l-1)-query_pre(1,1,n,r+1,n));
}
}
线段树【p2706】贪婪大陆的更多相关文章
- COGS1008. 贪婪大陆[树状数组 模型转换]
1008. 贪婪大陆 ★★ 输入文件:greedisland.in 输出文件:greedisland.out 简单对比时间限制:1 s 内存限制:128 MB 试题四:贪婪大陆 [题 ...
- luoguP2184 贪婪大陆 题解(树状数组)
P2184 贪婪大陆 题目 其实很容易理解就是询问一段区间内有多少段不同的区间 然后再仔细思索一下会发现: 1.只要一个区间的开头在一个节点i的左边,那么这个区间包含在区间1~i中. 2.只要一个区 ...
- Cogs 1008. 贪婪大陆(树状数组)
贪婪大陆 难度等级 ★★ 时间限制 1000 ms (1 s) 内存限制 128 MB 测试数据 10 简单对比 输入文件:greedisland.in 输出文件:greedisland.out 简单 ...
- P3932 浮游大陆的68号岛 【线段树】
P3932 浮游大陆的68号岛 有一天小妖精们又在做游戏.这个游戏是这样的. 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下 ...
- 线段树 洛谷P3932 浮游大陆的68号岛
P3932 浮游大陆的68号岛 题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无 ...
- cogs——1008. 贪婪大陆(清华巨佬代码)——树状数组
1008. 贪婪大陆 ★★ 输入文件:greedisland.in 输出文件:greedisland.out 简单对比时间限制:1 s 内存限制:128 MB 试题四:贪婪大陆 [题 ...
- P1243~P1247 线段树模板题总结
前言 这几天刚刚刷了5道线段树(水)题,现在来总结一下. 首先是犯的不少错误: 1.建树.更新函数没有return.这是最气的,每次最后程序错误查了半天也没查出来,最后发现是没有return.递归边界 ...
- P2184 贪婪大陆
P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败……人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前 ...
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...
- 洛谷 P2184 贪婪大陆 解题报告
P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小\(FF\)的\(Tower\) \(defence\)宣告失败--人类被蚂蚁们逼到了\(Greed\) \(Island\)上的一个海湾.现在 ...
随机推荐
- 浅谈javascript的原型及原型链
浅谈javascript的原型及原型链 这里,我们列出原型的几个概念,如下: prototype属性 [[prototype]] __proto__ prototype属性 只要创建了一个函数,就会为 ...
- [Leetcode] text justification 文本对齐
Given an array of words and a length L, format the text such that each line has exactly L characters ...
- 如何优化JQuery each()函数的性能
如果对jQuery这东西只停留在用的层面,而不知其具体实现的话,真的很容易用出问题来.这也是为什么近期我一直不怎么推崇用jQuery,这框架的API设定就有误导人们走上歧途之嫌. 01 $.fn.be ...
- git使用笔记(三)文件忽略
By francis_hao Nov 19,2016 注:此条所有内容均来自$ git help gitignore,细节请参考之 有时候在仓库里有一些文件我们并不想提交,git提供了指定屏 ...
- vue与node模版引擎的渲染标记{{}}(双花括号)冲突
由于之前练习koa2,直接渲染的jquery写的传统页面. 这次想偷懒,直接script引入vue,发现渲染不出data值. 渲染引擎用得是xtpl, 找了半天没有发现可以修改xtpl渲染分隔符的配置 ...
- cxf+spring发布webservice和调用
maven项目配置http://cxf.apache.org/docs/using-cxf-with-maven.html <properties> <cxf.version> ...
- hdu 3003 Pupu
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3003 题目大意:一种动物身上有n种不同的皮肤,每种皮肤有透明很不透明两种状态,经过一天的日晒,透明的可 ...
- linux基础-临时和永久修改ip地址以及通配符相关
一.临时配置网络(ip,网关,dns) 修改临时ip地址: 1.ifconfig查看当前的网卡和ip地址 2.临时修改IP地址:ifconfig ens32 192.168.16.200/24,ifc ...
- java中 快捷键输入System.out.println();
syso 然后:alt+ /(就是问号键)
- Golang使用amqp发送消息
1.为什么使用信道(channel)而不使用TCP连接发送AMQP命令? 对操作系统来说频繁的建立和销毁TCP连接开销非常昂贵,而操作系统每秒建立的连接是有上限的,性能瓶颈不可避免,而只建立一条TCP ...