题目
一道模拟题。比赛的时候不明白题意。赛后看了很久才明白题意。
本来是对
p
1
p_{1}
p1,
q
1
q_{1}
q1,
p
2
p_{2}
p2,
q
2
q_{2}
q2进行处理,得到
∣
p
1
−
x
∣
|p_{1}-x|
∣p1−x∣,
∣
q
1
−
x
∣
|q_{1}-x|
∣q1−x∣,
∣
p
2
−
x
∣
|p_{2}-x|
∣p2−x∣,
∣
q
2
−
x
∣
|q_{2}-x|
∣q2−x∣这四个数字,再分类讨论。但是脑子糊,实在讨论不出来,尤其当
∣
p
1
−
x
∣
=
∣
q
1
−
x
∣
|p_{1}-x|=|q_{1}-x|
∣p1−x∣=∣q1−x∣时;
之后再对x进行分类讨论,就是在
[
0
,
p
1
]
[0, p_{1}]
[0,p1],
[
p
1
,
q
1
]
[p_{1}, q_{1}]
[p1,q1],
[
q
1
,
p
2
]
[q_{1}, p_{2}]
[q1,p2],
[
p
2
,
q
2
]
[p_{2}, q_{2}]
[p2,q2]和
[
q
2
,
1
e
9
]
[q_{2},1e9]
[q2,1e9]进行分类讨论。但是依旧没讨论出来。其实就只有两种情况:x在还是不在
[
p
1
,
q
1
]
[p_{1}, q_{1}]
[p1,q1]和
[
p
2
,
q
2
]
[p_{2}, q_{2}]
[p2,q2]中,以及折叠后两个区间是否会相交。
觉得最近训练,情况不是想不到,就是代码实现能力很差以及很难梳理出明确的清晰的思路。还是练的太少了,需要多多补题。
#include <bits/stdc++.h>
using namespace std;
#define T int T; scanf("%d", &T); while(T--)
typedef long long ll;
int main()
{
int p1, q1, p2, q2, q;
scanf("%d%d%d%d", &p1, &q1, &p2, &q2);
scanf("%d", &q);
while(q--){
int x, p3, q3, p4, q4;
scanf("%d", &x);
if(p1<x && x<q1){
p3=0;
q3=max(abs(p1-x), abs(q1-x));
} else {
p3=abs(x-p1);
q3=abs(x-q1);
if(p3>q3)
swap(p3, q3);
}
if(p2<x && x<q2){
p4=0;
q4=max(abs(p2-x), abs(q2-x));
} else {
p4=abs(x-p2);
q4=abs(x-q2);
if(p4>q4)
swap(p4, q4);
}
if(q3<p4 || q4<p3){
printf("%d\n", q3-p3+q4-p4);
continue;
}
printf("%d\n", max(q3, q4)-min(p3, p4));
}
return 0;
}