【题解】P9430 [NAPC-#1] Stage2 - Darkness
wangbinfeng · · 题解
容易想到暴力思路,就不详细说明。
观察数据范围(
继续分析易得,时间复杂度过大主要由操作1造成。因此考虑提高操作1(修改所有军队)的速度。
考虑引入两个新变量 操作1时,操作3时输出
操作2要求交换单个军队的横纵坐标,修改时应先将原坐标
最终时间复杂度:
代码:
#include<bits/stdc++.h>
using namespace std;
long long mx,my,n,m;
inline int read(){
char c;
int ret=0,f=1;
for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-f;
for(;c>='0'&&c<='9';c=getchar())ret=ret*10+c-'0';
return ret*f;
} //快读模板(本题读入数据有点多,快读可以加速)
class NODE{ //军队类
public: //类中元素默认私有,需改变为公有(结构体不需要这句)
int x,y; //坐标
void swap(){
int t=x+mx-my;
x=y+my-mx;
y=t;
} //交换横纵坐标
void print(){printf("%d %d\n",x+mx,y+my);} //输出
}node[100009];
int main() {
n=read(),m=read();
for(int i=1;i<=n;i++)node[i].x=read(),node[i].y=read();
while(m--)
switch(read()){
case 1: //操作一
mx+=read(),my+=read(); //修改偏移量
break; //勿忘
case 2: //操作二
node[read()].swap(); //交换横纵坐标(调用类中的函数)
break; //勿忘
case 3: //操作三
node[read()].print(); //输出横纵坐标
}
}