题意:

  有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 (线段树)的更多相关文章

  1. NBUT 1602 Mod Three(线段树单点更新区间查询)

    [1602] Mod Three 时间限制: 5000 ms 内存限制: 65535 K 问题描述 Please help me to solve this problem, if so, Liang ...

  2. NBUT 1120 线段树

    input q n q行 F a b或者Q a b output face left face top face right 可以用map或者线段树做 //map #include<cstdio ...

  3. RMQ with Shifts(线段树)

    RMQ with Shifts Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Pra ...

  4. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  5. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  6. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  7. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  8. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  9. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

随机推荐

  1. ZOJ3229 Shoot the Bullet(有源汇的上下界最大流)

    #pragma warning(disable:4996) #include <iostream> #include <cstring> #include <string ...

  2. POJ 3336 Count the string (KMP+DP,好题)

    参考连接: KMP+DP: http://www.cnblogs.com/yuelingzhi/archive/2011/08/03/2126346.html 另外给出一个没用dp做的:http:// ...

  3. C#中反射泛型 CreateInstance

    假设1我有个类叫SortClass,类中有个BubbleSort(int[] array)用于给数组进行排序. 假设2我有个类叫SortT<T>,类中有个BubbleSort(T[] ar ...

  4. POJ 1538

    #include <iostream> #include <iomanip> using namespace std; ]; //拉格朗日插值算法 int main() { / ...

  5. 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)

    题目链接 题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i]).输出最后n个数 ...

  6. OAuth 2 的简单理解

    什么是 OAuth 2.0 根据 oauth.net 的描述,我们可以将它简述为以下内容:OAuth 2.0 是 OAuth 1.0 框架协议的升级版本,简化了多种平台上身份及授权认证的流程. 具体的 ...

  7. DAL层与BLL层的设计原则

    通用DAL层: 提供一个通用的DAL层的基础框架,其中包括所有实体类的基类,所有DAL类的基类,以及用来在实体类和数据表以及实体类字段和数据表字段之间Mapping的Attributes.此层作为核心 ...

  8. [转]应聘Java,jsp,j2ee软件工程师笔试中可能出现的问题

    相信大家应聘的时候第一关就是笔试,即使是一位很有经验的工程师也不一定能够顺利通过,笔试不好,可能就无法进行面试,即使能够进行面试,考官对你的印象也不会很好,问的问题也会很多,估计很难吃的消,当然如果你 ...

  9. python xml.etree ElementTree解析 编辑 xml

    python有很多种xml解析方式,不过感觉etree的ElementTree 用起来最方便. #coding=utf-8 from xml.etree import ElementTree impo ...

  10. 很赞的MathJax

    一直想在网页上放进LaTeX布局,但由于是要发布在SAE上,因此有很多的限制. 然后在这儿发现了这个好东东,MathJax,非常方便,JS直接可以外链. 通过它,我编辑了这个页面,看起来很不错哦.