悬关, wind 求调,有的会判成无解
  • 板块学术版
  • 楼主水星湖psgqwq
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/3/3 11:59
  • 上次更新2024/3/3 14:43:58
查看原帖
悬关, wind 求调,有的会判成无解
974277
水星湖psgqwq楼主2024/3/3 11:59

应该只有判断成无解的问题,看了数据。

#include <bits/stdc++.h>
#define int long long
using namespace std;
int ans, n, k, x, y, s[100005], t[100005];

int ceildiv(int a ,int b)
{ 
    if(a >= 0 && b >= 0) return (a + b - 1) / b;
	if(a <= 0 && b >= 0) return  a / b;
	if(a <= 0 && b <= 0) return a = -a,b = -b,(a + b - 1) / b;
	if(a >= 0 && b <= 0) return a / b;
}

void case1(int i)
{
    int a = 0;
    // if(s[n] + t[n] - n * k == 0)cout<<1<<endl;
    if(s[n] + t[n] - n * k > 0)
        a = min((i * k + x + y - t[i] - s[i]) / (s[n] + t[n] - n * k),0ll);
    if(s[n] + t[n] - n * k < 0)
        a = ceildiv((i * k + x + y - t[i] - s[i]) , (s[n] + t[n] - n * k));
    
    if(a >= 0 && a * s[n] + s[i] - x >= 0 && a * t[n] + t[i] - y >= 0 && a * s[n] + s[i] - x + a * t[n] + t[i] - y <= a * n * k + i * k)
        ans = min(ans,a * n + i);
}
void case2(int i)
{
    int a = 0;
    // if(s[n] - t[n] - n * k == 0)cout<<2<<endl;
    if(s[n] - t[n] - n * k > 0)
        a = min((i * k + x - y + t[i] - s[i]) / (s[n] - t[n] - n * k),0ll);
    if(s[n] - t[n] - n * k < 0)
        a = ceildiv((i * k + x - y + t[i] - s[i]) , (s[n] - t[n] - n * k));
    if(a >= 0 && a * s[n] + s[i] - x >= 0 && a * t[n] + t[i] - y <= 0 && a * s[n] + s[i] - x - a * t[n] - t[i] + y <= a * n * k + i * k)
        ans = min(ans,a * n + i);
}
void case3(int i)
{
    int a = 0;
    // if(-t[n] - s[n] - n * k == 0)cout<<3<<endl;
    if(-t[n] - s[n] - n * k > 0)
        a = min((i * k - x - y + t[i] + s[i]) / (-t[n] - s[n] - n * k),0ll);
    if(-t[n] - s[n] - n * k < 0)
        a = ceildiv((i * k - x - y + t[i] + s[i]) , (-t[n] - s[n] - n * k));
    if(a >= 0 && a * s[n] + s[i] - x <= 0 && a * t[n] + t[i] - y <= 0 && x + y - s[i] - t[i] - a * s[n] - a * t[n] <= a * n * k + i * k)
        ans = min(ans,a * n + i);
}
void case4(int i)
{
    int a = 0;
    // if(t[n] - s[n] - n * k == 0)cout<<4<<endl;
    if(t[n] - s[n] - n * k > 0)
        a = min((i * k - x + y - t[i] + s[i]) / (t[n] - s[n] - n * k),0ll);
    if(t[n] - s[n] - n * k < 0)
        a = ceildiv((i * k - x + y - t[i] + s[i]) , (t[n] - s[n] - n * k));
    if(a >= 0 && a * s[n] + s[i] - x <= 0 && a * t[n] + t[i] - y >= 0 && x - s[i] - a * s[n] + a * t[n] + t[i] - y <= a * n * k + i * k)
        ans = min(ans,a * n + i);
}
void solve()
{
    scanf("%lld%lld%lld%lld",&n,&k,&x,&y);
    
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld",&s[i],&t[i]);
        s[i] += s[i-1];
        t[i] += t[i-1];
    }
    ans = 9e18;

    for(int i=0;i<=n;i++)
    {
        case1(i);
        case2(i);
        case3(i);
        case4(i);
    }
    if(ans == 9e18)ans = -1;
    printf("%lld\n", ans);
}
signed main()
{
    int t;cin>>t;
    while(t--) solve();
    return 0;
}

2024/3/3 11:59
加载中...