P10217 [省选联考 2024] 季风 题解
sunkuangzheng · · 题解
- 给定
n,k,x,y 和2n 个整数x_0,y_0,x_1,y_1,\dots,x_{n-1},y_{n-1} 。- 找到最小的非负整数
m ,使得存在2m 个实数x_0',y_0',x_1',y_1',\dots,x_{m-1}',y_{m-1}' 满足以下条件,或报告不存在这样的m :
- 特别地,
m=0 时,认为\sum \limits_{i=0}^{m-1} (x_i'+x_{i \bmod n}) 和\sum \limits_{i=0}^{m-1} (y_i'+y_{i \bmod n}) 均为0 。
以下令
注意到把所有
- 特殊性质 A:
|x_i|+|y_i| \le k 。
这时答案有单调性,即
注意到一个长度为
考虑
我们枚举
注意下面代码里下标都从
- 怎么求解不等式
|m \cdot sx - p|+|m \cdot sy - q| \le (m \cdot n+f+1) \cdot k ?- 这是基础初一数学知识喵。分讨
m \cdot sx - p,m \cdot sy - q 的正负即可。
/**
* author: sunkuangzheng
* created: 02.03.2024 16:20:32
**/
#include<bits/stdc++.h>
#ifdef DEBUG_LOCAL
#include <mydebug/debug.h>
#endif
using ll = long long;
using db = long double;
#define int long long
const int N = 1e5+5;
using namespace std;
ll T,n,d,k,x,y,ax[N],ay[N],ans = 9e18;
void los(){
cin >> n >> k >> x >> y; ans = 9e18;
for(int i = 1;i <= n;i ++) cin >> ax[i] >> ay[i],ax[i] += ax[i-1],ay[i] += ay[i-1];
for(int i = 0;i < n;i ++){
ll p = x - ax[i],q = y - ay[i];
ll l = 0,r = 1e18;
auto fk1 = [&](ll x,ll p){
if(x < 0) l = max(l,(ll)ceil(1.0 * p / (db)x));
else if(x > 0) r = min(r,(ll)floor(1.0 * p / (db)x));
else if(0 > p) l = 1e18,r = 0;
};
auto fk2 = [&](ll x,ll p){
if(x > 0) l = max(l,(ll)ceil(1.0 * p / (db)x));
else if(x < 0) r = min(r,(ll)floor(1.0 * p / (db)x));
else if(0 < p) l = 1e18,r = 0;
};
auto upd = [&](){
if(l <= r) ans = min(ans,l * n + i);
l = 0,r = 1e18;
};
fk2(ax[n],p),fk2(ay[n],q),fk1(ax[n] + ay[n] - n * k,k * i + p + q),upd();
fk1(ax[n],p),fk2(ay[n],q),fk1(-ax[n] + ay[n] - n * k,k * i - p + q),upd();
fk2(ax[n],p),fk1(ay[n],q),fk1(ax[n] - ay[n] - n * k,k * i + p - q),upd();
fk1(ax[n],p),fk1(ay[n],q),fk1(-ax[n] - ay[n] - n * k,k * i - p - q),upd();
}cout << (ans == 9e18 ? -1 : ans) << "\n";
}signed main(){
ios::sync_with_stdio(0),cin.tie(0);
for(cin >> T;T --;) los();
}