题解 P6393 【隔离的日子】

· · 题解

代码:

#include <cstdio>
#include <set>
using namespace std;
#define ll long long
int n;
ll a[50005],b[50005];

struct node{
    ll val;//存的是编号
    friend bool operator<(node x,node y){
        if(a[x.val] == a[y.val]) return x.val < y.val;//当值相同的时候,编号在前面的更优
        return a[x.val] < a[y.val]; //从小到大排序
    }
};

set <node> fnd[105];

int main(){
    scanf("%d",&n);
    for(int i = 1;i <= n;i++){
        scanf("%lld%lld",&a[i],&b[i]);
        fnd[b[i]].insert({i});
    }
    for(int i = 1;i <= n;i++){
        fnd[b[i]].erase({i});
        int ans = 0x3f3f3f3f;
        for(int j = 1;j <= 100;j++){
            ll val = a[i] * j + b[i] * j + b[i] * b[i];
            if(val % j != 0) continue;//方程无整数解,舍去
            a[0] = val / j;
            set<node>::iterator res = fnd[j].lower_bound({0});
            if(res != fnd[j].end() && a[res->val] == val / j){//lower_bound 找不到会返回end,要判一下
                if(ans > res->val) ans = res->val;
            }
        }
        if(ans == 0x3f3f3f3f) printf("-1\n");
        else printf("%d\n",ans);
    }
    return 0;
}