【二分】[Nescafé II] 防线

来源:互联网 发布:淘宝双12承接页装修 编辑:程序博客网 时间:2024/04/30 13:32

题目链接:http://cojs.tk/cogs/problem/problem.php?pid=1022    

分析:
二分答案。

对于每一个二分出的数进行验证。

考虑a[i]表示位置p <= i的总人数,由于奇数点最多1个,设它为ans,则a[i](i < ans)均为偶数,a[i](i >= ans)均为奇数,因此通过二分答案加验证的方法就可以找到其位置。

代码:

#include<iostream>#include<cstdio>#include <climits>#define mn 200100 using namespace std;typedef long long ll;long long T,n,s[mn],e[mn],d[mn];inline long long scan(){    char c=getchar();    while (!isdigit(c)) c=getchar();    long long  x=0;    while (isdigit(c))    {        x=x*10+c-'0';        c=getchar();    }    return x;}int main(){freopen("defender.in","r",stdin);freopen("defender.out","w",stdout);    T=scan();while (T--){n=scan();for (int i=1;i<=n;i++){s[i]=scan();e[i]=scan();d[i]=scan();}ll l=-1,r=100000000000ll,m;while (l+1<r){ll an=0;m=l+r>>1;for (int j=1;j<=n;j++) {int t=min(m,(ll)e[j]);if (t>=s[j]) an+=((t-s[j])/d[j] +1);}if (an%2==0) l=m;else r=m;}if (r==100000000000ll)printf("There's no weakness.\n");else{ll an=0;for (int j=1;j<=n;j++)if (s[j]<=r && e[j]>=r && ((r-s[j])%d[j]==0) ) an++;cout<<r<<" "<<an<<endl;}}return 0;}

原创粉丝点击