传送门:

解题思路:

题目描述是一大坑点,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(可持久化线段树)的更多相关文章

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

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

  2. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  3. 【BZOJ-2653】middle 可持久化线段树 + 二分

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1298  Solved: 734[Submit][Status][Discu ...

  4. HDU 4866 Shooting(持久化线段树)

    view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...

  5. 【BZOJ-3653】谈笑风生 DFS序 + 可持久化线段树

    3653: 谈笑风生 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 628  Solved: 245[Submit][Status][Discuss] ...

  6. 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树

    没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ...

  7. 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队

    看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...

  8. 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之

    最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破 ...

  9. 【BZOJ 3524】【Poi2014】Couriers 可持久化线段树

    为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http ...

随机推荐

  1. Oracle 切割字符查询

    Oracle 切割字符查询 select * from view_psbaseinfo where DECODE('410782001125,411100000043', '', NULL, '410 ...

  2. Perfect Rectangle(完美矩形)

    我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域. 每个矩形用左下角的点和右上角的点的坐标来表示.例如, 一个单位正方形可以表示为 [1,1,2,2] ...

  3. 部署zookeeper实践

    1.解压zookeeper 2.环境变量设置 hadoop@namenode:~/zookeeper-3.4.6/conf$ sudo vim /etc/profile export JAVA_HOM ...

  4. 【金阳光測试】大话Android自己主动化測试--Android自己主动化系列(1)--金阳光于2013年4月份

    Android自己主动化測试框架和工具在四年多的发展日趋成熟. 从五年前的第一代自己主动化架构演进到眼下第四代(本系列讲座第7篇后将具体剖析第三代和第四代自己主动化框架)从曾经最早谷歌推崇的monke ...

  5. 学习bootstrap

    菜鸟教程 bootstrap开发框架 伍华聪 Bootstrap——一款超好用的前端框架

  6. 基于机器学习的web异常检测——基于HMM的状态序列建模,将原始数据转化为状态机表示,然后求解概率判断异常与否

    基于机器学习的web异常检测 from: https://jaq.alibaba.com/community/art/show?articleid=746 Web防火墙是信息安全的第一道防线.随着网络 ...

  7. [转]Python UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 的解决办法

    UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 的解决办法 python在安装时,默认的编码是ascii,当 ...

  8. nyoj--767--因子和(模拟)

    因子和 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 题目很简单明了,给你一个数n,判断它是不是素数,如果是素数就输出"Yes",如果不是素数则输出 ...

  9. Dictionaries and lists

    Lists can appear as values in a dictionary. For example, if you were given a dictionary that maps fr ...

  10. [学习笔记]BS架构与CS架构

    整理自:http://www.iteye.com/problems/102411 前两天面试的时候被问到这个问题,没有回答上来因此在这里学习整理一下. B/S架构 B/S架构的全称为Browser/S ...