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 ...
随机推荐
- 接口、抽象类、方法复写、类Equals方法重写
接口: /* * Java接口中的數據成員必須初始化,該成員有隱藏的final.satic.常量, * 一次賦值后不可在賦值 * 成員方法訪問修飾符必須是公共修飾符,可以顯示聲明也可以不聲明 * 成員 ...
- hdu5017 Ellipsoid(旋转)
比赛的时候跳进这个大坑里,最后代码是写出来了.看到好像很多都是模拟退火做的,下面提供一个奇怪的思路吧. ax^2+by^2+cz^2+dyz+exz+fxy=1(*) 通过一些奇特的YY我们可以知道这 ...
- POJ 2027
#include<iostream> using namespace std; int main() { int time; cin>>time; int a; int b; ...
- 2014多校第五场1010 || HDU 4920 Matrix multiplication(矩阵乘法优化)
题目链接 题意 : 给你两个n*n的矩阵,然后两个相乘得出结果是多少. 思路 :一开始因为知道会超时所以没敢用最普通的方法做,所以一直在想要怎么处理,没想到鹏哥告诉我们后台数据是随机跑的,所以极端数据 ...
- (2)jni编程学习笔记
先说说NDK和jni的关系吧,这两个看起来挺容易搞混的 我到网上也查了一些资料: java的jni提供了一个调用c语言函数的接口,其实就是一个java函数,这个函数没有任何内容,这个函数调用时直接进入 ...
- Android Drawable体系
- [转载] ACE 组播校验和出错问题解决
源地址:http://yuanmuqiuyu2000.blog.sohu.com/140904942.html 使用ACE框架写了个组播简单的测试工具,但是测试过程中,总是发现udp校验和出错的信息. ...
- HDU4003 Find Metal Mineral 树形DP
Find Metal Mineral Problem Description Humans have discovered a kind of new metal mineral on Mars wh ...
- excel设置下拉菜单,并且不同值会显示不同颜色
工作中常常要用的excel,每次都会有新的需求,然后不会,然后百度,然后过段时间可能就又忘了,于是就想说,自己记录下来~~~因为自己用的都是2010,其实哪个版本都差不多,都是应该可以找到相应的按钮滴 ...
- QTP 参数化
PS:方法内容是转的别人的,我们项目中只用到了方法三,主要用于将测试数据与业务分离,增强测试数据的可维护性. 方法一.DataTable方法 这是QTP提供的一种方法,也是最容易实现参数化的一种方式. ...