传送门:

解题思路:

题目描述是一大坑点,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. ACM POJ 1146 ID Codes

    题目大意:输入一个字符串.输出它的下一个字典序排列. 字典序算法思想: 1.从右向左寻找字符串找出第一个a[i]<a[i+1]的位置i; 2.从右向左找出第一个大于a[i]的元素a[j]; 3. ...

  2. ACdream 1139(Sum-逆元)

    J - Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatu ...

  3. 英语影视台词---五、And Then There Were None

    英语影视台词---五.And Then There Were None 一.总结 一句话总结:求阿加莎·克里斯蒂小说<无人生还>的英文版<And Then There Were No ...

  4. DNS解析污染原理——要么修改包,要么直接丢弃你的网络包

    DNS/域名解析 可以看到dns解析是最初的一步,也是最重要的一步.比如访问亲友,要知道他的正确的住址,才能正确地上门拜访. dns有两种协议,一种是UDP(默认),一种是TCP. udp 方式,先回 ...

  5. Numpy科学计算工具

    Numpy初探 Numpy基础数据结构 Numpy数组是一个多维数组,称为ndarray.其由两部分组成: 实际的数据 描述这些数据的原数据 导入该库: import numpy as np 多维数组 ...

  6. Nginx下部署TP5项目

    标签(空格分隔): linux nginx配置文件: server { listen 81; #listen [::]:80; server_name _; index index.html inde ...

  7. 关于iOS适配问题

    大家都知道在iOS开发当中对于UI适配问题可以从如下两个方面去考虑: 1.比例适配 2.利用autolayout自动布局 通常情况来说,利用auto自动布局是一个比较好的方案,开发者可以利用story ...

  8. Vector源码学习

    安全的可增长数组结构 实现: 1. 内部采用数组的方式. 1.1 添加元素,会每次校验容量是否满足, 扩容规则有两种,1.增加扩容补偿的长度,2.按照现有数组长度翻一倍.容量上限是Integer.MA ...

  9. grep常用命令讲解

    grep大家应该并不陌生,但是这个命令你确定真的会用吗?ok,接下来我通过举例子的方式,带你看清grep的本质. 首先,把/etc/password的内容复制下来命令为1.txt吧,方便操作,哈哈~ ...

  10. PHP安全性防范方式

    SQL注入 SQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行. 防范方式 使用mysql_real_escape_string(),或者addslashes()过 ...