【题解】L 国的战斗续之多路出击 [P2129]
【题解】L 国的战斗续之多路出击 [P2129]
传送门: \(L\) 国的战斗续之多路出击 \([P2129]\)
【题目描述】
给出 \(n\) 个坐标,\(m\) 个指令,指令处理顺序应是从后往前。
求最终的 \(n\) 个坐标。
【输入】
第一行两个整数 \(n,m\) 。
接下来 \(n\) 行,每行两个整数 \(x_i,y_i\) 表示第 \(i\) 个坐标。
然后 \(m\) 行,每行首先一个字符 \(C\),
\((1).\) 若\(C\)为 \(\text{'m'}\),则紧跟两个整数 \(p,q\),要求把所有坐标 \((x_i,y_i)\) 变为 \((x_i+p,y_i+q)\) 。
\((2).\) 若 \(C\) 为 \(\text{'x'}\),则把所有坐标从 \((xi,yi)\) 变为 \((-xi,yi)\)
\((3).\) 若 \(C\) 为 \(\text{'y'}\),则把所有坐标从 \((xi,yi)\) 变为 \((xi,-yi)\) 。
【输出】
【样例】
样例输入:
3 3
0 0
4 -3
6 7
x
m -1 2
y
样例输出:
1 2
-3 5
-5 -5
【数据范围】
\(30 \%:\) \(1 \leqslant n,m \leqslant 1000\)
\(100 \%:\) \(1 \leqslant n,m \leqslant 5*10^5\)
【分析】
大佬们都写的是矩阵乘法或者模拟,向我这种不会矩阵和膜您的蒟蒻就只能写线段树了 \(\text{QAQ}\) (好像是第一个用这种奇葩方法的?)。
区间加,区间乘的模板,但因为是单调查询,而且没有取模这种鬼畜操作,比【模板】线段树 \(2\) 和 维护序列 要简单得多。
维护一个乘法标记 \(mul\) 和加法标记 \(add\),区间加时就直接更新 \(add\),区间乘 \(v\) 就先让 \(mul\) 和 \(add\) 都乘以 \(v\) 。
下传标记时先传 \(mul\) 再传 \(add\)
其他的就直接照着题目模拟就可以了。
坑点:\(m\) 个指令要倒着处理。
【Code】
#include<cstdio>
#define Re register int
#define pl (p<<1)//左儿子
#define pr (p<<1|1)//右儿子
#define mid (L+R>>1)
#define pa tr[p].add//加法标记
#define pm tr[p].mul//乘法标记
const int N=5e5+5;
int n,x,y,T,a[N],b[N];
inline void in(Re &x){
Re f=0;x=0;char c=getchar();
while(c<'0'||c>'9')f|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=f?-x:x;
}
struct Segment_Tree{
struct QAQ{int l,r,ans,add,mul;}tr[N<<2];
inline void updata_add(Re p,Re v){
if(tr[p].l==tr[p].r)tr[p].ans+=v;//只需要更新叶子节点
pa+=v;//但标记必须下传
}
inline void updata_mul(Re p,Re v){
if(tr[p].l==tr[p].r)tr[p].ans*=v;//同上
pm*=v,pa*=v;
}
inline void pushdown(Re p){//先下传乘法标记,再下传加法标记
if(pm!=1)updata_mul(pl,pm),updata_mul(pr,pm),pm=1;//这里乘法标记也要初始化为1
if(pa)updata_add(pl,pa),updata_add(pr,pa),pa=0;
}
inline void build(Re p,Re L,Re R){//初始化建树
tr[p].l=L,tr[p].r=R,pm=1;//乘标记要初始化为1
if(L==R){tr[p].ans=a[L];return;}
build(pl,L,mid),build(pr,mid+1,R);
}
inline void change_add(Re p,Re l,Re r,Re v){//区间加
Re L=tr[p].l,R=tr[p].r;
if(l<=L&&R<=r){updata_add(p,v);return;}
pushdown(p);
if(l<=mid)change_add(pl,l,r,v);
if(r>mid)change_add(pr,l,r,v);
}
inline void change_mul(Re p,Re l,Re r,Re v){//区间乘
Re L=tr[p].l,R=tr[p].r;
if(l<=L&&R<=r){updata_mul(p,v);return;}
pushdown(p);
if(l<=mid)change_mul(pl,l,r,v);
if(r>mid)change_mul(pr,l,r,v);
}
inline int ask(Re p,Re w){//单点查询
Re L=tr[p].l,R=tr[p].r;
if(L==R)return tr[p].ans;
pushdown(p);
if(w<=mid)return ask(pl,w);
else return ask(pr,w);
}
}T1,T2;//T1:x坐标。T2:y坐标。
inline void sakura(Re T){
Re x,y;char op;
if(!T)return;
scanf(" %c",&op);
if(op=='m')in(x),in(y);
sakura(T-1);
if(op=='x')T1.change_mul(1,1,n,-1);//(x,y) -> (-x,y)
else if(op=='y')T2.change_mul(1,1,n,-1);//(x,y) ->(x,-y)
else T1.change_add(1,1,n,x),T2.change_add(1,1,n,y);//(x,y) -> (x+p,y+q)
}
int main(){
// freopen("123.txt","r",stdin);
in(n),in(T);
for(Re i=1;i<=n;++i)in(a[i]),in(b[i]);
T1.build(1,1,n);//第一棵树
for(Re i=1;i<=n;++i)a[i]=b[i];
T2.build(1,1,n);//第二课树
sakura(T);
for(Re i=1;i<=n;++i)printf("%d %d\n",T1.ask(1,i),T2.ask(1,i));
}
【题解】L 国的战斗续之多路出击 [P2129]的更多相关文章
- 洛谷 P2129 L国的战斗续之多路出击(模拟)
P2129 L国的战斗续之多路出击 题目背景 广而告之:背景见其他L国的战斗!!大家一起刷 题目描述 这一次,L国决定军队分成n组,分布在各地,若以L国为原点,可以看作在一个直角坐标系内.但是他们都受 ...
- P2129 L国的战斗续之多路出击
题目描述 这一次,L国决定军队分成n组,分布在各地,若以L国为原点,可以看作在一个直角坐标系内.但是他们都受统一的指挥,指令部共发出m个命令.命令有移动.上下转移和左右转移(瞬移??),但是由于某些奇 ...
- [luoguP2129] L国的战斗续之多路出击(模拟 || 矩阵)
传送门 1.模拟 easy #include <cstdio> #define N 500001 int n, m; int X[N], Y[N], x[N], y[N], a = 1, ...
- P1910 L国的战斗之间谍
P1910 L国的战斗之间谍 题目背景 L国即将与I国发动战争!! 题目描述 俗话说的好:“知己知彼,百战不殆”.L国的指挥官想派出间谍前往I国,于是,选人工作就落到了你身上. 你现在有N个人选,每个 ...
- AC日记——L国的战斗之间谍 洛谷 P1916
题目背景 L国即将与I国发动战争!! 题目描述 俗话说的好:“知己知彼,百战不殆”.L国的指挥官想派出间谍前往I国,于是,选人工作就落到了你身上. 你现在有N个人选,每个人都有这样一些数据:A(能得到 ...
- 洛谷 P1910 L国的战斗之间谍(水题日常)
题目背景 L国即将与I国发动战争!! 题目描述 俗话说的好:“知己知彼,百战不殆”.L国的指挥官想派出间谍前往I国,于是,选人工作就落到了你身上. 你现在有N个人选,每个人都有这样一些数据:A(能得到 ...
- 洛谷——P1910 L国的战斗之间谍
https://www.luogu.org/problem/show?pid=1910#sub 题目背景 L国即将与I国发动战争!! 题目描述 俗话说的好:“知己知彼,百战不殆”.L国的指挥官想派出间 ...
- 洛谷 P1913 L国的战斗之伞兵
P1913 L国的战斗之伞兵 题目背景 L国即将与I国发动战争!! 题目描述 为了在敌国渗透作战,指挥官决定:派出伞兵前往敌国!然而敌国的风十分强烈,能让伞兵在同一高度不停转悠,直到被刮到一个无风区… ...
- 洛谷 P1911 L国的战斗之排兵布阵
P1911 L国的战斗之排兵布阵 题目背景 L国即将与I国发动战争!! 题目描述 L国的指挥官想让他的每一个军营都呈现出国徽形——“L”形(方向无所谓).当然,他的指挥营除外(这叫做个性),他想不出该 ...
随机推荐
- ios浏览器调试踩坑(1)----mescroll.js和vue-scroller
主要记录在ios浏览器出现触摸无限加载的情况 使用vue-scroller和mescroll.js/mescroll.vue先踩ios浏览器默认滑动会影响mescroll的方法调用. 首先给公共js加 ...
- win10上安装ubunt18双系统过程中出现mmx64.efi not found问题
安装Ubuntu18过程中,从u盘启动ubunt安装,出现mmx64.efi not found问题 如下图: 制作好ubunt启动盘之后在EFI/BOOT下会看到两个文件,将其中grubx64.ef ...
- Unity检视面板的继承方法研究 (一)
对于检视面板 Inspector 的面板继承方式对项目来说是很有必要的, 比如一个基类, 写了一个很好看的检视面板[CustomEditor(typeof(XXX))], 可是所有子类的面板无法直接继 ...
- P3731 [HAOI2017]新型城市化(tarjan+网络流)
洛谷 题意: 给出两个最大团的补图,现在要求增加一条边,使得最大最大团个数增加至少\(1\). 思路: 我们求出团的补图,问题可以转换为:对于一个二分图,选择删掉一条边,能够增大其最大独立集的点集数. ...
- HBuilder创建app
一.app登录注册实现 1.首先进行布局,mhead,mbody 在app index.html内创建一个 a链接通过mui.openWindow跳到登录页面 <a class="mu ...
- cisco
配置ntp conf t ntp server 172.28.10.10 clock timezone Beijing 8 show clock 配置端口组 interface Port-channe ...
- Linux下JDK中文字体乱码
java生成图片的时候用到字体,但是liunx系统没有这些字体需要把C:\Windows\Fonts 上传到/usr/local/jdk1.8.0_171/jre/lib/fonts 重启tomcat ...
- 论文阅读笔记六十:Squeeze-and-Excitation Networks(SENet CVPR2017)
论文原址:https://arxiv.org/abs/1709.01507 github:https://github.com/hujie-frank/SENet 摘要 卷积网络的关键构件是卷积操作, ...
- web服务器获取请求客户端真实地址的方法
服务器获取客户端或者网页的请求,获取IP时需要注意,因为一个请求到达服务器之前,一般都会经过一层或者多层代理服务器,比如反向代理服务器将http://192.168.1.10:port/ 的URL反向 ...
- 【转】Java代码编译过程简述
转载:https://blog.csdn.net/fuzhongmin05/article/details/54880257. 代码编译是由Javac编译器来完成,流程如下图1所示: 图1 Javac ...