题目链接:https://vjudge.net/problem/Gym-101955E
解题思路:
距离转化:https://www.cnblogs.com/zwfymqz/p/8253530.html
将一个点(x,y)的坐标变为(x+y,x−y)后,原坐标系中的曼哈顿距离 = 新坐标系中的切比雪夫距离
将一个点(x,y)的坐标变为((x+y)/2,(x−y)/2) 后,原坐标系中的切比雪夫距离 = 新坐标系中的曼哈顿距离
将曼哈顿距离转化为切比雪夫距离之后就可以用线段树维护最大值和最小值,但是题目限制了不同种类,所以再添加一个维护次大值和次小值,维护次大值不能和最大值是同一个种类,次小值同理。
#include <bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define fi first
#define se second
using namespace std;
typedef long long ll;
const ll inf = 1e16;
const int mx = 1e5 + 10;
typedef pair <ll,int> pa;
struct node
{
pa x[4],y[4];
}s[mx<<2];
int X,Y,ty,n,m,L,R;
pa Max(pa p1,pa p2){ return p1.fi>p2.fi?p1:p2; }
pa Min(pa p1