BZOJ2636: crisis(可持久化线段树)
解题思路:
题目描述是一大坑点,cancel后面是直接加ask或者redo的。
那么就可以愉快地可持久化了。
注意需要支持区间修改,那么就只需要在再次更新这个点的时候将标记储存在新的儿子中。
最后由下至上询问就好了。
代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef double dnt;
const double eps=1e-;
struct trnt{
int ls;
int rs;
double dltx,dlty;
double alpha;
bool lunked;
}tr[];
struct pnt{
double x,y;
void insert(void)
{
scanf("%lf%lf",&x,&y);
return ;
}
}p[];
int siz;
int cnt;
int n,m;
char cmd[];
int root[];
void move(int spc,double dx,double dy)
{
tr[spc].dltx+=dx;
tr[spc].dlty+=dy;
return ;
}
void patrol(int spc,double beta)
{
tr[spc].alpha+=beta;
double nx,ny,x,y;
x=tr[spc].dltx,y=tr[spc].dlty;
nx=x*cos(beta)-y*sin(beta);
ny=y*cos(beta)+x*sin(beta);
tr[spc].dltx=nx;
tr[spc].dlty=ny;
return ;
}
void lunk(int spc)
{
tr[spc].alpha=tr[spc].dltx=tr[spc].dlty=;
tr[spc].lunked=true;
return ;
}
void pushdown(int spc,int lst)
{
tr[++siz]=tr[tr[lst].ls];
tr[spc].ls=siz;
tr[++siz]=tr[tr[lst].rs];
tr[spc].rs=siz;
if(tr[spc].lunked)
{
lunk(tr[spc].ls);
lunk(tr[spc].rs);
}
patrol(tr[spc].ls,tr[spc].alpha);
patrol(tr[spc].rs,tr[spc].alpha);
move(tr[spc].ls,tr[spc].dltx,tr[spc].dlty);
move(tr[spc].rs,tr[spc].dltx,tr[spc].dlty);
tr[spc].lunked=false;
tr[spc].alpha=tr[spc].dltx=tr[spc].dlty=;
return ;
}
void build(int l,int r,int &spc)
{
spc=++siz;
if(l==r)return ;
int mid=(l+r)>>;
build(l,mid,tr[spc].ls);
build(mid+,r,tr[spc].rs);
return ;
}
void Move(int l,int r,int ll,int rr,int spc,int lst,double dx,double dy)
{
if(!spc)return ;
if(ll>r||l>rr)return ;
if(ll<=l&&r<=rr)
{
move(spc,dx,dy);
return ;
}
int mid=(l+r)>>;
pushdown(spc,lst);
Move(l,mid,ll,rr,tr[spc].ls,tr[lst].ls,dx,dy);
Move(mid+,r,ll,rr,tr[spc].rs,tr[lst].rs,dx,dy);
return ;
}
void Patrol(int l,int r,int ll,int rr,int spc,int lst,double beta)
{
if(!spc)return ;
if(ll>r||l>rr)return ;
if(ll<=l&&r<=rr)
{
patrol(spc,beta);
return ;
}
int mid=(l+r)>>;
pushdown(spc,lst);
Patrol(l,mid,ll,rr,tr[spc].ls,tr[lst].ls,beta);
Patrol(mid+,r,ll,rr,tr[spc].rs,tr[lst].rs,beta);
return ;
}
void Lunk(int l,int r,int ll,int rr,int spc,int lst)
{
if(!spc)return ;
if(ll>r||l>rr)return ;
if(ll<=l&&r<=rr)
{
lunk(spc);
return ;
}
int mid=(l+r)>>;
pushdown(spc,lst);
Lunk(l,mid,ll,rr,tr[spc].ls,tr[lst].ls);
Lunk(mid+,r,ll,rr,tr[spc].rs,tr[lst].rs);
return ;
}
void query(int l,int r,int spc,int pos,double &x,double &y)
{
if(!spc)return ;
if(l>r)return ;
int mid=(l+r)>>;
if(pos<=mid)query(l,mid,tr[spc].ls,pos,x,y);
else query(mid+,r,tr[spc].rs,pos,x,y);
if(tr[spc].lunked)x=y=;
if(fabs(tr[spc].alpha)>eps)
{
double nx,ny;
nx=x*cos(tr[spc].alpha)-y*sin(tr[spc].alpha);
ny=y*cos(tr[spc].alpha)+x*sin(tr[spc].alpha);
x=nx,y=ny;
}
x+=tr[spc].dltx;
y+=tr[spc].dlty;
return ;
}
int main()
{
// freopen("zoo.in","r",stdin);
// freopen("zoo.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)p[i].insert();
scanf("%d",&m);
cnt=;
build(,n,root[cnt]);
while(m--)
{
scanf("%s",cmd+);
if(cmd[]=='M')
{
int l,r;
scanf("%d%d",&l,&r);
if(l>r)std::swap(l,r);
double dx,dy;
scanf("%lf%lf",&dx,&dy);
tr[++siz]=tr[root[cnt]];
root[++cnt]=siz;
Move(,n,l,r,root[cnt],root[cnt-],dx,dy);
}
if(cmd[]=='P')
{
int l,r;
scanf("%d%d",&l,&r);
double beta;
scanf("%lf",&beta);
if(l>r)std::swap(l,r);
tr[++siz]=tr[root[cnt]];
root[++cnt]=siz;
Patrol(,n,l,r,root[cnt],root[cnt-],beta);
}
if(cmd[]=='L')
{
int l,r;
scanf("%d%d",&l,&r);
if(l>r)std::swap(l,r);
tr[++siz]=tr[root[cnt]];
root[++cnt]=siz;
Lunk(,n,l,r,root[cnt],root[cnt-]);
}
if(cmd[]=='C')
{
int a;
scanf("%d",&a);
cnt-=a;
}
if(cmd[]=='R')
{
int a;
scanf("%d",&a);
cnt+=a;
}
if(cmd[]=='A')
{
int pos;
scanf("%d",&pos);
double x=p[pos].x,y=p[pos].y;
query(,n,root[cnt],pos,x,y);
printf("%.6lf %.6lf\n",x,y);
}
}
return ;
}
BZOJ2636: crisis(可持久化线段树)的更多相关文章
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
- 【BZOJ-2653】middle 可持久化线段树 + 二分
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1298 Solved: 734[Submit][Status][Discu ...
- HDU 4866 Shooting(持久化线段树)
view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...
- 【BZOJ-3653】谈笑风生 DFS序 + 可持久化线段树
3653: 谈笑风生 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 628 Solved: 245[Submit][Status][Discuss] ...
- 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树
没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ...
- 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队
看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...
- 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之
最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破 ...
- 【BZOJ 3524】【Poi2014】Couriers 可持久化线段树
为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http ...
随机推荐
- 开源 java CMS - FreeCMS2.3会员个人资料
原文地址:http://javaz.cn/site/javaz/site_study/info/2015/28577.html 项目地址:http://www.freeteam.cn/ 个人资料 从 ...
- nyoj-673-悟空的难题(数组标记)
悟空的难题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 自从悟空当上了齐天大圣.花果山上的猴子猴孙们便也能够尝到天上的各种仙果神酒,所以猴子猴孙们的体质也得到了非 ...
- 一次误报引发的DNS检测方案的思考:DNS隧道检测平民解决方案
摘自:http://www.freebuf.com/articles/network/149328.html 通过以上分析得出监控需要关注的几个要素:长域名.频率.txt类型.终端是否对解析ip发起访 ...
- es6 --- class 类的继承使用
传统的javascript中只有对象,没有类的概念.它是基于原型的面向对象语言.原型对象特点就是将自身的属性共享给新对象.这样的写法相对于其它传统面向对象语言来讲,很有一种独树一帜的感脚!非常容易让人 ...
- BZOJ 3280 费用流
思路: 同BZOJ 1221 //By SiriusRen #include <queue> #include <cstdio> #include <cstring> ...
- 系统丢失的DLL文件问题根源解决(纯净官网下载放心)(图文详解)(博主推荐)
导言 最近,身边的朋友们,问我,他电脑的win10系统里 mfc110.dll 丢失. 其他的系统文件丢失修复,是一样的步骤. 现象 大家也许,都会有这么一个习惯,动不动则就去百度上搜索. 其实啊,这 ...
- SQL SERVER中求上月、本月和下月的第一天和最后一天
1.上月的第一天 SELECT CONVERT(CHAR(10),DATEADD(month,-1,DATEADD(dd,-DAY(GETDATE())+1,GETDATE())),111) 2.上月 ...
- pyton写购物车
pyton写购物车 基本要求: 用户输入工资,然后打印购物菜单用户可以不断的购买商品,直到余额不够为止退出时打印用户已购买的商品和剩余金额.. 1.这个程序功能不完整,bug很多,练手之作. good ...
- vuejs v-bind
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 《剑指offer》二维数组中的查找
一.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 二.输入描述 ar ...