题解:
这题太水辣
注意开 long long
但我不是没开long long 的锅
我是
输出 long long 要用 lld 啊
大梦身先醒,80可海星
PS:百度了一下 long (ld) 和 int(d) 的区别,以前有大区别,现在没了
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<string> #include<cstring> #include<queue> #include<cstdlib> using namespace std; #define ll long long inline ll read() { ll ans=0; char last=' ',ch=getchar(); while(ch<'0'||ch>'9') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } ll a,b; ll x,y,z; ll gcd(ll aa,ll bb) { if(bb==0) return aa; return gcd(bb,aa%bb); } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); a=read();b=read(); x=gcd(a,b); y=a*b/x; z=x^y; printf("%lld\n",z); //long long是lld return 0; }
题解
提供一种暴力解法,就是60%的数据N<=1000,所以想到可以Floyd暴力处理
Floyd如果两点之间有路径,那么就可以记录一下这条路径上的最大点和最小点啊
然后for循环,如果两点之间有路径,那就求出最大差值辣
//正着倒着跑BFS #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<string> #include<cstring> #include<queue> #include<cstdlib> using namespace std; inline int read() { int ans=0; char last=' ',ch=getchar(); while(ch<'0'||ch>'9') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } const int maxn=1e5+10,maxm=500005; int n,m,ans=0; int w[maxn]; int zuida=0,zuixiao=1e6; struct node { int val; int maxx=0; int minn=1e6; }dis[4001][4001]; int main() { freopen("b.in","r",stdin); freopen("b.out","w",stdout); n=read();m=read(); for(int i=1;i<=n;i++) { w[i]=read(); zuida=max(zuida,w[i]); zuixiao=min(zuixiao,w[i]); } if(n<=4000) { for(int i=1;i<=m;i++) { int u,v; u=read();v=read(); dis[u][v].val =1; dis[u][v].maxx =max(w[u],w[v]); dis[u][v].minn =min(w[u],w[v]); ans=max(ans,dis[u][v].maxx -dis[u][v].minn ); } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(dis[i][k].val &&dis[k][j].val ) { if(dis[i][k].val +dis[k][j].val>dis[i][j].val ) { dis[i][j].val =max(dis[i][j].val ,dis[i][k].val +dis[k][j].val ); dis[i][j].maxx =max(dis[i][j].maxx,max(w[i],max(w[j],w[k]))); dis[i][j].minn =min(dis[i][j].minn,min(w[i],min(w[j],w[k]))); } ans=max(ans,dis[i][j].maxx -dis[i][j].minn ); } printf("%d\n",ans); } else printf("%d\n",zuida-zuixiao); return 0; }