题意:

  有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. iOS16进制设置颜色

    UIColor+Hex.h // // UIColor+Hex.h // 16进制颜色类别 // // Created by apple on 15-4-3. // Copyright (c) 201 ...

  2. POJ 2081

    #include <iostream> #define MAXN 500005 using namespace std; //unsigned _m[MAXN]; ]; int main( ...

  3. C. Tourist's Notes

    题目链接 题意:n天内登山,相邻两次登山的高度差的绝对值小于等于1,也就是说每次高度变化只能是:0,1,-1.我们已经知道n天中部分天数人所在的山的高度,求最大的登山高度. 输入: n m  n 是天 ...

  4. Linux资源监控命令/工具(调试)

    1.直接将指令丢到背景中执行:& [root@linux ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 & ...

  5. WordPress主题制作教程10:添加文章类型插件Custom Post Type UI

    下载 Custom Post Type UI>> 用Custom Post Type UI添加自定义文章类型对于新手来说最简单不过了,下载安装后,在插件栏启用一下,就可以开始添加文章类型了 ...

  6. MS WORD 表格自动调整列宽,自动变漂亮,根据内容自动调整 .

    在MS WORD中,当有大量的表格出现时,调整每个表格的的高和宽和大小将是一件非常累的事情,拖来拖去,非常耗时间,而且当WORD文档达到300页以上时,调整反应非常的慢,每次拖拉线后,需要等待一段时间 ...

  7. 处理11gR2 RAC集群资源状态异常INTERMEDIATE,CHECK TIMED OUT

    注意节点6,7的磁盘CRSDG的状态明显不正常.oracle@ZJHZ-PS-CMREAD-SV-RPTDW06-DB-SD:~> crsctl status resource -t |less ...

  8. Oracle ->> TRUNC, ROUND, CEIL, FLOOR

    ), ), CEIL(10.01), FLOOR(10.9999) FROM dual; 结果: TRUNC是直接截断小数位 ROUND是四舍五入 CEIL和FLOOR则是和SQL SERVER一样返 ...

  9. android sqlite 一次创建多个表

    package com.yangguangfu.database; import android.content.Context; import android.database.sqlite.SQL ...

  10. Java 全角字符转半角字符

    1.java代码里有时候会遇到代码注入的安全问题,为了防止这种问题,增加了一个过滤功能.主要是过滤全角字符,把url不能识别的全角字符转换成半角字符 public class Test { publi ...