NBUT 1120 Reimu's Teleport (线段树)
题意:
有n个格子,一开始全部面向top。接下来的每次修改F a b ,如果 a>b则将a~b之间的格子全面置为向右,否则置为向左。对于每个询问Q输出向左、top、右的数量。
思路:
普通线段树。每个结点中保存三个值,分别对应3个方向的数量。要设置一下lazy_tag以减少时间消耗,因为有可能Q远少于F,那么一直在更改,大多可能不需要改到,暂时不更新,询问时要用到再更新。每次一改就整个区间都是一个方向,所以当有tag时可以往下推各占多少。
#include<bits/stdc++.h>
using namespace std;
int ans[];//答案
struct node
{
bool tag;
int num[];
node *ll,*rr;
node()
{
tag=false;
num[]=num[]=num[]=;
ll=rr=;
}
}; node * built(int LL, int RR)
{
node *tmp=new(node);
if(LL==RR)
{
tmp->num[]=;
return tmp;
}
int mid=(LL+RR)>>;
tmp->ll=built(LL,mid);
tmp->rr=built(mid+,RR);
tmp->num[]+=tmp->ll->num[]+tmp->rr->num[]; //开始只需要更新向上的
return tmp;
} void modify( node *t,int LL,int RR,int mid)//专门修改统计数量
{
if(t->num[])
{
t->ll->num[]=mid+-LL;
t->ll->num[]=t->ll->num[]=;
t->rr->num[]=RR-mid;
t->rr->num[]=t->rr->num[]=;
}
if(t->num[])
{
t->ll->num[]=mid+-LL;
t->ll->num[]=t->ll->num[]=;
t->rr->num[]=RR-mid;
t->rr->num[]=t->rr->num[]=;
}
if(t->num[])
{
t->ll->num[]=mid+-LL;
t->ll->num[]=t->ll->num[]=;
t->rr->num[]=RR-mid;
t->rr->num[]=t->rr->num[]=;
}
} void update(int ll,int rr,int LL,int RR,int c,node *t)
{
if(ll==LL&&rr==RR)
{
t->tag=true;
if(c==)
{
t->num[]=RR-LL+;
t->num[]=t->num[]=;
}
else
{
t->num[]=RR-LL+;
t->num[]=t->num[]=;
}
return;
}
int mid=(LL+RR)>>; if(t->tag)
{
t->tag=false;
t->ll->tag=t->rr->tag=true;
modify(t,LL,RR,mid);
}
if(ll>mid) //右边
update(ll,rr,mid+,RR,c,t->rr);
else if(rr<=mid) //左边
update(ll,rr,LL,mid,c,t->ll);
else
{
update(ll, mid, LL, mid, c,t->ll);
update(mid+,rr,mid+,RR,c,t->rr);
}
t->num[]=t->ll->num[]+t->rr->num[];
t->num[]=t->ll->num[]+t->rr->num[];
t->num[]=t->ll->num[]+t->rr->num[];
} void query(int ll,int rr,int LL,int RR,node* t)
{
if(ll==LL && rr==RR)
{
ans[]+=t->num[];
ans[]+=t->num[];
ans[]+=t->num[];
return;
}
int mid=((LL+RR)>>);
if(t->tag)
{
t->tag=false;
t->ll->tag= t->rr->tag= true;
modify(t, LL, RR, mid);
} if(ll>mid) query(ll,rr,mid+,RR,t->rr);
else if(rr<=mid) query(ll,rr,LL,mid,t->ll);
else
{
query(ll, mid, LL, mid, t->ll);
query(mid+,rr,mid+,RR,t->rr);
} } int main()
{
//freopen("e://input.txt","r",stdin);
int a, t, e, r;
char ch; while(cin>>a>>t)
{
node *tree=built(,t); //建树 for(int i=; i<a; i++)
{
cin>>ch;
scanf("%d %d", &e, &r);
if(ch=='F') //修改
{
if(e>r) update(r, e, , t, , tree);
else update(e, r, , t, , tree);
}
else //Q 查询
{
memset(ans,,sizeof(ans));
query(e,r,,t,tree);
printf("%d %d %d\n",ans[],ans[],ans[]);
}
}
}
return ;
}
AC代码
NBUT 1120 Reimu's Teleport (线段树)的更多相关文章
- NBUT 1602 Mod Three(线段树单点更新区间查询)
[1602] Mod Three 时间限制: 5000 ms 内存限制: 65535 K 问题描述 Please help me to solve this problem, if so, Liang ...
- NBUT 1120 线段树
input q n q行 F a b或者Q a b output face left face top face right 可以用map或者线段树做 //map #include<cstdio ...
- RMQ with Shifts(线段树)
RMQ with Shifts Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64u Pra ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
随机推荐
- DevExpress Form那些事儿
1:设置子窗体依附父窗体 首先将父窗体的属性中 IsMdiContainer 设置为 True , 就是将窗体设置为 MDI窗体.子窗体和父窗体都是继承自RibbonForm的. 代码如下 : ...
- C# 获取windows特殊路径
虽然是古老的问题,最近用到这个,查一下还不少东东呐 一.使用Environment.SpecialFolder 该方法最简单,直接使用即可,只是提供的特殊路径比较少. (1)使用方法:string p ...
- 快速排序 Quick Sort
自己写的代码,记录一下.分别记录了两种partition的方法. public class QuickSort { public static void quickSort(int[] nums, i ...
- 百度面试题——top K算法
需求 从一亿个数据中,找出其中最小的10个数. 分析 最笨的方法就是将这一亿个数据,按从小到大进行排序,然后取前10个.这样的话,即使使用时间复杂度为nlogn的快排或堆排,由于元素会频繁的移动,效率 ...
- 关于yum仓库的中的软件包下载
在Linux系统下,很多软件的安装我们都会选择使用yum的方式安装,因为简单方便,易于管理. 有时我们可能会有这样的一个需求:即喜欢上yum仓库中的一个软件了,想要下载到本地.该怎么办呢? 实现方法不 ...
- C连接oracle(PROC*C)
1. 安装oralce 10g 2.建立数据库和用户 配置VS2005环境 proc需要嵌入式环境 在C/C++常规里面加入 D:\oracle\product\10.2.0\db_1\precom ...
- 李洪强iOS开发之OC语言基础知识
OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...
- mysql集群
http://blog.chinaunix.net/uid-20586655-id-291471.html
- 获取CentOS系统详情的九个uname命令实例
当你在控制台模式下,无法通过“鼠标右键 > 关于”获取操作系统的信息.这时,在Linux下,你可以使用uname命令,帮助你完成这些工作. Uname是unix name的缩写.在控制台中实际使 ...
- 纯js实现瀑布流布局及ajax动态新增数据
本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...