NBUT 1120 线段树
input
q n
q行 F a b或者Q a b
output
face left face top face right
可以用map或者线段树做
- //map
- #include<cstdio>
- #include<map>
- using namespace std;
- map<int, char>a;
- int main()
- {
- int n, t, i, d2, d1, r, l, s;
- char com;
- map<int, char>::iterator p, q;
- while (~scanf("%d%d", &n, &t))
- {
- a.insert(make_pair(, 't'));
- a.insert(make_pair(, 't'));
- a.insert(make_pair(t + , 't'));
- for (i = ; i < n; i++)
- {
- scanf("\n%c%d%d", &com, &d1, &d2);
- if (com == 'F')
- {
- if (d1 > d2)
- {
- com = 'l';
- for (p = a.begin(); p->first < d2; p++);
- for (q = p; q->first <= d1; q++);
- q--;
- char tmp;
- tmp = q->second;
- q++;
- if (p != q) a.erase(p, q);
- a.insert(make_pair(d2, com));
- a.insert(make_pair(d1 + , tmp));
- }
- else
- {
- com = 'r';
- for (p = a.begin(); p->first < d1; p++);
- for (q = p; q->first <= d2; q++);
- q--;
- char tmp;
- tmp = q->second;
- q++;
- if (p != q) a.erase(p, q);
- a.insert(make_pair(d1, com));
- a.insert(make_pair(d2 + , tmp));
- }
- }
- else
- {
- r = ; l = ; s = ;
- for (p = a.begin(); p->first <= d1; p++);
- for (q = p; q->first <= d2; q++);
- q--;
- p--;
- for (; p != q;)
- {
- if (p->second == 'r')
- r += (++p)->first - d1;
- else if (p->second == 'l')
- l += (++p)->first - d1;
- else s += (++p)->first - d1;
- d1 = p->first;
- }
- if (q->second == 'r') r += d2 - d1 + ;
- else if (q->second == 'l') l += d2 - d1 + ;
- else s += d2 - d1 + ;
- printf("%d %d %d\n", l, s, r);
- }
- }
- a.clear();
- }
- return ;
- }
- #include <cstdio>
- #include <queue>
- #include <cstring>
- #include <iostream>
- #include <cstdlib>
- #include <algorithm>
- #include <vector>
- #include <map>
- #include <set>
- #include <ctime>
- #include <cmath>
- #define MAX 100000
- using namespace std;
- int q,n,setv[MAX*],v,a,b,sum[],sumv[MAX*][];
- void pushdown(int &l,int &r,int &k)
- {
- if(setv[k]<) return;
- int m=l+((r-l)>>),lc=k<<,rc=(k<<)+;
- setv[rc]=setv[lc]=setv[k];
- memset(sumv[lc],,sizeof(sumv[]));
- memset(sumv[rc],,sizeof(sumv[]));
- sumv[lc][setv[k]]=m-l+;
- sumv[rc][setv[k]]=r-m;
- setv[k]=-;
- }
- void reset(int l,int r,int k)
- {
- int lc=k<<,rc=(k<<)+;
- sumv[k][]=sumv[lc][]+sumv[rc][];
- sumv[k][]=sumv[lc][]+sumv[rc][];
- sumv[k][]=sumv[lc][]+sumv[rc][];
- }
- void update(int l,int r,int k)
- {
- int lc=k<<,rc=(k<<)+;
- if(a<=l&&b>=r)
- {
- setv[k]=v;
- memset(sumv[k],,sizeof(sumv[]));
- sumv[k][setv[k]]=r-l+;
- return;
- }
- pushdown(l,r,k);
- int m=l+((r-l)>>);
- if(a<=m) update(l,m,lc);
- if(b>m) update(m+,r,rc);
- reset(l,r,k);
- }
- void query(int l,int r,int k)
- {
- // printf("%d:%d %d %d %d\n",k,setv[k],sumv[k][0],sumv[k][1],sumv[k][2]);
- if(setv[k]>=)
- {
- sum[setv[k]]+=min(r,b)-max(l,a)+;
- return;
- }
- if(a<=l&&b>=r)
- {
- sum[]+=sumv[k][];
- sum[]+=sumv[k][];
- sum[]+=sumv[k][];
- return;
- }
- int m=l+((r-l)>>);
- if(a<=m) query(l,m,k<<);
- if(b>m) query(m+,r,(k<<)+);
- }
- int main()
- {
- //freopen("/home/user/桌面/in","r",stdin);
- while(scanf("%d%d",&q,&n)==)
- {
- memset(setv,-,sizeof(setv[])**n);
- memset(sumv,,sizeof(sumv[])**n);
- a=;b=n;v=;
- update(,n,);
- char op[];
- while(q--)
- {
- scanf("%s%d%d",op,&a,&b);
- if(op[]=='F')
- {
- v=;
- if(a>b)
- {
- v=;
- swap(a,b);
- }
- update(,n,);
- // for(int i=1;i<3*n;i++) printf("%d:%d %d %d %d\n",i,setv[i],sumv[i][0],sumv[i][1],sumv[i][2]);
- }
- else
- {
- sum[]=sum[]=sum[]=;
- query(,n,);
- printf("%d %d %d\n",sum[],sum[],sum[]);
- }
- }
- }
- //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
- return ;
- }
NBUT 1120 线段树的更多相关文章
- NBUT 1120 Reimu's Teleport (线段树)
题意: 有n个格子,一开始全部面向top.接下来的每次修改F a b ,如果 a>b则将a~b之间的格子全面置为向右,否则置为向左.对于每个询问Q输出向左.top.右的数量. 思路: 普通线段树 ...
- 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 ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
随机推荐
- javascript 限制字符串字数换行 带BUG
function chang(str ,len) { function lenStat(str) { function isChinese(str) { //判断是不是中文 var reCh = /[ ...
- Docker私有仓库3
http://www.cnblogs.com/womars/p/5906435.html(上篇地址) 三.测试上两篇 #测试一下 [root@lh- data]# pwd /opt/data [roo ...
- delphi edit 中undo 和clearundo 复制粘贴等总结
edit 和memo都有undo功能, Undo:恢复到改动前. ClearUndo:撤销掉Undo缓冲区的内容,则将无法恢复到改动前的 从该文本框的撤销缓冲区中清除关于最近操作的信息,根据应用 程序 ...
- ZOJ 3702 Gibonacci number
本来已经关上电脑了 但还是想打开电脑纪念一下这充实的一天…… 第一节高数课讲新课级数 讲完一个知识点 想问问女票今天咋又没来上课…… 突然发现院长问我自费去不去省赛…… !!! 当然是去啊! ……虽然 ...
- wuzhi 五指 伪静态
rewrite ^(.*)list\/([0-9]+)-([0-9]+)\.html$ $1index.php?v=listing&cid=$2&page=$3 last; rewri ...
- 华中农业大学新生赛C题
http://acm.hzau.edu.cn/problem.php?id=1099 题意: 输入两个整数 l 和 n,代表半径和output的保留小数点位数. 输出圆的面积,保留n位小数. 一开始觉 ...
- Git单独checkout子目录
http://schacon.github.io/git/git-read-tree.html#_sparse_checkout Existing Repository If you already ...
- 《JavaScript高级程序设计》读书笔记 ---基本概念小结
ECMAScript 中的基本数据类型包括Undefined.Null.Boolean.Number 和String. 与其他语言不同,ECMScript 没有为整数和浮点数值分别定义不同的数据 ...
- iOSstoryboard xib下label怎么自适应宽度高度
先看需求:两个Label,要求蓝色的label紧跟在红色的label文字后面 ok首选正常添加约束 红色的Label添加宽度,高度,左边,上边约束 蓝色的Label添加宽度,高度,左边,和红色的水平对 ...
- inflate的使用注意事项
public View inflate (int resource, ViewGroup root, boolean attachToRoot) 我们在使用这个方法时,要清楚原理,下面是这个方法的文档 ...