【题解】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)\) 。

【输出】

【样例】

  1. 样例输入:
  2. 3 3
  3. 0 0
  4. 4 -3
  5. 6 7
  6. x
  7. m -1 2
  8. y
  9. 样例输出:
  10. 1 2
  11. -3 5
  12. -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】

  1. #include<cstdio>
  2. #define Re register int
  3. #define pl (p<<1)//左儿子
  4. #define pr (p<<1|1)//右儿子
  5. #define mid (L+R>>1)
  6. #define pa tr[p].add//加法标记
  7. #define pm tr[p].mul//乘法标记
  8. const int N=5e5+5;
  9. int n,x,y,T,a[N],b[N];
  10. inline void in(Re &x){
  11. Re f=0;x=0;char c=getchar();
  12. while(c<'0'||c>'9')f|=c=='-',c=getchar();
  13. while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
  14. x=f?-x:x;
  15. }
  16. struct Segment_Tree{
  17. struct QAQ{int l,r,ans,add,mul;}tr[N<<2];
  18. inline void updata_add(Re p,Re v){
  19. if(tr[p].l==tr[p].r)tr[p].ans+=v;//只需要更新叶子节点
  20. pa+=v;//但标记必须下传
  21. }
  22. inline void updata_mul(Re p,Re v){
  23. if(tr[p].l==tr[p].r)tr[p].ans*=v;//同上
  24. pm*=v,pa*=v;
  25. }
  26. inline void pushdown(Re p){//先下传乘法标记,再下传加法标记
  27. if(pm!=1)updata_mul(pl,pm),updata_mul(pr,pm),pm=1;//这里乘法标记也要初始化为1
  28. if(pa)updata_add(pl,pa),updata_add(pr,pa),pa=0;
  29. }
  30. inline void build(Re p,Re L,Re R){//初始化建树
  31. tr[p].l=L,tr[p].r=R,pm=1;//乘标记要初始化为1
  32. if(L==R){tr[p].ans=a[L];return;}
  33. build(pl,L,mid),build(pr,mid+1,R);
  34. }
  35. inline void change_add(Re p,Re l,Re r,Re v){//区间加
  36. Re L=tr[p].l,R=tr[p].r;
  37. if(l<=L&&R<=r){updata_add(p,v);return;}
  38. pushdown(p);
  39. if(l<=mid)change_add(pl,l,r,v);
  40. if(r>mid)change_add(pr,l,r,v);
  41. }
  42. inline void change_mul(Re p,Re l,Re r,Re v){//区间乘
  43. Re L=tr[p].l,R=tr[p].r;
  44. if(l<=L&&R<=r){updata_mul(p,v);return;}
  45. pushdown(p);
  46. if(l<=mid)change_mul(pl,l,r,v);
  47. if(r>mid)change_mul(pr,l,r,v);
  48. }
  49. inline int ask(Re p,Re w){//单点查询
  50. Re L=tr[p].l,R=tr[p].r;
  51. if(L==R)return tr[p].ans;
  52. pushdown(p);
  53. if(w<=mid)return ask(pl,w);
  54. else return ask(pr,w);
  55. }
  56. }T1,T2;//T1:x坐标。T2:y坐标。
  57. inline void sakura(Re T){
  58. Re x,y;char op;
  59. if(!T)return;
  60. scanf(" %c",&op);
  61. if(op=='m')in(x),in(y);
  62. sakura(T-1);
  63. if(op=='x')T1.change_mul(1,1,n,-1);//(x,y) -> (-x,y)
  64. else if(op=='y')T2.change_mul(1,1,n,-1);//(x,y) ->(x,-y)
  65. else T1.change_add(1,1,n,x),T2.change_add(1,1,n,y);//(x,y) -> (x+p,y+q)
  66. }
  67. int main(){
  68. // freopen("123.txt","r",stdin);
  69. in(n),in(T);
  70. for(Re i=1;i<=n;++i)in(a[i]),in(b[i]);
  71. T1.build(1,1,n);//第一棵树
  72. for(Re i=1;i<=n;++i)a[i]=b[i];
  73. T2.build(1,1,n);//第二课树
  74. sakura(T);
  75. for(Re i=1;i<=n;++i)printf("%d %d\n",T1.ask(1,i),T2.ask(1,i));
  76. }

【题解】L 国的战斗续之多路出击 [P2129]的更多相关文章

  1. 洛谷 P2129 L国的战斗续之多路出击(模拟)

    P2129 L国的战斗续之多路出击 题目背景 广而告之:背景见其他L国的战斗!!大家一起刷 题目描述 这一次,L国决定军队分成n组,分布在各地,若以L国为原点,可以看作在一个直角坐标系内.但是他们都受 ...

  2. P2129 L国的战斗续之多路出击

    题目描述 这一次,L国决定军队分成n组,分布在各地,若以L国为原点,可以看作在一个直角坐标系内.但是他们都受统一的指挥,指令部共发出m个命令.命令有移动.上下转移和左右转移(瞬移??),但是由于某些奇 ...

  3. [luoguP2129] L国的战斗续之多路出击(模拟 || 矩阵)

    传送门 1.模拟 easy #include <cstdio> #define N 500001 int n, m; int X[N], Y[N], x[N], y[N], a = 1, ...

  4. P1910 L国的战斗之间谍

    P1910 L国的战斗之间谍 题目背景 L国即将与I国发动战争!! 题目描述 俗话说的好:“知己知彼,百战不殆”.L国的指挥官想派出间谍前往I国,于是,选人工作就落到了你身上. 你现在有N个人选,每个 ...

  5. AC日记——L国的战斗之间谍 洛谷 P1916

    题目背景 L国即将与I国发动战争!! 题目描述 俗话说的好:“知己知彼,百战不殆”.L国的指挥官想派出间谍前往I国,于是,选人工作就落到了你身上. 你现在有N个人选,每个人都有这样一些数据:A(能得到 ...

  6. 洛谷 P1910 L国的战斗之间谍(水题日常)

    题目背景 L国即将与I国发动战争!! 题目描述 俗话说的好:“知己知彼,百战不殆”.L国的指挥官想派出间谍前往I国,于是,选人工作就落到了你身上. 你现在有N个人选,每个人都有这样一些数据:A(能得到 ...

  7. 洛谷——P1910 L国的战斗之间谍

    https://www.luogu.org/problem/show?pid=1910#sub 题目背景 L国即将与I国发动战争!! 题目描述 俗话说的好:“知己知彼,百战不殆”.L国的指挥官想派出间 ...

  8. 洛谷 P1913 L国的战斗之伞兵

    P1913 L国的战斗之伞兵 题目背景 L国即将与I国发动战争!! 题目描述 为了在敌国渗透作战,指挥官决定:派出伞兵前往敌国!然而敌国的风十分强烈,能让伞兵在同一高度不停转悠,直到被刮到一个无风区… ...

  9. 洛谷 P1911 L国的战斗之排兵布阵

    P1911 L国的战斗之排兵布阵 题目背景 L国即将与I国发动战争!! 题目描述 L国的指挥官想让他的每一个军营都呈现出国徽形——“L”形(方向无所谓).当然,他的指挥营除外(这叫做个性),他想不出该 ...

随机推荐

  1. webpack4 babel 篇

    demo 代码点此,如果对 babel 不熟,可以看一下babel 7 简单指北. webpack 使用 babel 来打包使用 es6 及以上语法的 js 文件是非常方便的,可以通过配置,将 es6 ...

  2. xcodeinstruments 内存检测

    http://blog.csdn.net/totogo2010/article/details/8233565

  3. 带你理解Xcode Derived Data

    什么是Xcode Derived Data?为什么它很重要呢? “Clean derived data”,当你遇到一些极其奇怪的构建问题时,你也许经常听到这句话. Derived Data是一个文件夹 ...

  4. 获得用户的真实ip HTTP_X_FORWARDED_FOR

    工作中经常会有有获得用户真实ip的情况,HTTP_X_FORWARDED_FOR总是忘记,所以我这里记录下来吧. 在PHP 中使用 [“REMOTE_ADDR”] 来取得客户端的 IP 地址,但如果客 ...

  5. 白话SCRUM 之二:product backlog

    在SCRUM方法中明确要求了3个文档: 1 product backlog 2sprint backlog 3 burn-down chart Product backlog 中列举了本项目应该实现的 ...

  6. 多任务学习Multi-task-learning MTL

    https://blog.csdn.net/chanbo8205/article/details/84170813 多任务学习(Multitask learning)是迁移学习算法的一种,迁移学习可理 ...

  7. 7. [mmc subsystem] host(第一章)——概述

    一.host简单说明 host,也可以理解为host controller,是指mmc总线上的主机端,mmc总线的控制器,每个host controller对应一条mmc总线. host contro ...

  8. Win2003下配置iis+php+mysql+zend

    所需软件: ActivePerl.PHP.MYSQL.Zend (一.安装IIS6.0;二.配置PHP环境;三.安装mysql;四.安装 Zend Optimizer;五.配置PHPMYADMIN) ...

  9. postgreSQL 自动递增序号

    创建表格 CREATE TABLE test ( id serial, name ) not null ); 查询当前创建好的表格 插入数据 BEGIN TRANSACTION; INSERT INT ...

  10. (十)OpenStack---M版---双节点搭建---Heat安装和配置

    ↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 本章节仅在Controller节点执行 1.Controller节点执行安装和配置 2.验证操作 ...