bzoj1407(扩欧)

来源:互联网 发布:lol淘宝权在哪里直播 编辑:程序博客网 时间:2024/05/15 11:45

时间复杂度有点玄学。。。


实际上,上面说最少的山洞数小于10^6,实际上就是在提醒枚举山洞的数量,就是枚举模数,判断是否在存活的时间之内会相遇

太暴力了。。。


对于每个m,枚举两个野人,用exgcd求出最早相遇时间,判断是否都在两个野人是存活时间之内,如果都在,return false

注意,如果求出的exgcd无解,也就是方程无解,就代表在这个m下,两个野人根本不可能相遇,continue就可以


好题

#include<cstdio>#include<cmath>#include<cstdlib>#include<algorithm>using namespace std;int n,c[20],p[20],l[20];void exgcd(int a,int b,int &d,int &x,int &y){if (b==0){d=a;x=1;y=0;return ;}exgcd(b,a%b,d,y,x);y-=x*(a/b);}bool judge(int m){for (int i=1;i<=n;i++)for (int j=i+1;j<=n;j++){int x,y,d;int ii=i,jj=j;if (p[ii]<p[jj]) swap(ii,jj);exgcd(p[ii]-p[jj],m,d,x,y);if ((c[jj]-c[ii])%d) continue;//判断是否相遇x=x*(c[jj]-c[ii])/d;int k=m/d;x=((x%k)+k)%k;if (x<=l[i]&&x<=l[j]) return false;//判断是否在活着的时间相遇}return true;}int main(){scanf("%d",&n);int mx=0;for (int i=1;i<=n;i++) scanf("%d%d%d",&c[i],&p[i],&l[i]),mx=max(mx,c[i]);int ans;for (int i=mx;;i++)if (judge(i)){ans=i;break;}printf("%d",ans);return 0;}


0 0
原创粉丝点击