O(\(n^3\))做法
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(3)
#define go(i,a,b) for(int i=a;i<=b;++i)
#define com(i,a,b) for(int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define fin freopen("input.txt","r",stdin)
#define fout freopen("output.txt","w",stdout)
#define re register
#define int long long
typedef long long ll;
const int inf=0x3f3f3f3f;
inline void read(int &x){
int f=1;char c=getchar();x=0;
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
x*=f;
}//读入优化
bool is_p(ll x){
for(int i=2;(ll)i*i<=x;++i)
if(x%i==0) return 0;
return 1;
}
signed main(){
//fin;
ll n,k;
cin>>n>>k;
++n,++k;
int mx=k;
int ans;
if(k==n) ans=0;
else if(2*k>n){
for(re int i=2;i*i<=mx;++i){
while(mx%i==0){
mx/=i;
if(n/i*i>k){
puts("2");
return 0;
}
}
}
ans=1;
}
else ans=2;
if(is_p(k)) ans=max(ans,(ll)1);
else ans=max(ans,(ll)2);
cout<<ans;
return 0;
}
O(\(n^2\))做法
#include<bits/stdc++.h>
using namespace std;
#define go(i,a,b) for(int i=a;i<=b;++i)
#define com(i,a,b) for(int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const int N=300+10,inf=0x3f3f3f3f;
int n,s,head[N],d[N],dis[N],f[N],ans=0,far[N],ans2=inf,cnt=0;
bool vis[N];
vector<int>lng,cp;
struct edge{
int nxt,v,w;
}e[N*2];
void add(int u,int v,int w){
e[cnt]=(edge){head[u],v,w};
head[u]=cnt++;
}
void dfs(int u,int fa){
for(int i=head[u];i+1;i=e[i].nxt){
int v=e[i].v,w=e[i].w;
if(v==fa) continue;
d[v]=d[u]+w;
dfs(v,u);
}
}
void dfs2(int u,int fa){
f[u]=fa;
for(int i=head[u];i+1;i=e[i].nxt){
int v=e[i].v,w=e[i].w;
if(v==fa) continue;
dis[v]=dis[u]+w;
dfs2(v,u);
}
}
void dfs3(int u,int fake){
vis[u]=1;
ans=max(ans,fake);
for(int i=head[u];i+1;i=e[i].nxt){
int v=e[i].v,w=e[i].w;
if(vis[v]) continue;
dfs3(v,fake+w);
}
}
int main(){
//freopen("input.txt","r",stdin);
mem(head,-1);
cin>>n>>s;
int x,y,w;
go(i,1,n-1){
cin>>x>>y>>w;
add(x,y,w);
add(y,x,w);
}
dfs(1,0);
int Max=-1,id,id2;
go(i,1,n) if(d[i]>Max){
Max=d[i],id=i;
}
dfs2(id,0);
Max=-1;
go(i,1,n) if(dis[i]>Max){
Max=dis[i],id2=i;
}
x=id2;
while(x!=id){
lng.push_back(x);
x=f[x];
}
lng.push_back(id);
int l=lng.size()-1;
go(i,0,l){
x=lng[i];
go(j,i,l){
y=lng[j];
if(dis[x]-dis[y]<=s) far[x]=y;
else break;
}
}
go(i,0,l){
mem(vis,0);
x=lng[i],y=far[x];
if(dis[x]-dis[y]>s) continue;
cp.clear();
while(x!=y) cp.push_back(x),x=f[x],vis[x]=1;
cp.push_back(y),vis[y]=1;
ans=0;
for(int k=0;k<cp.size();++k)
dfs3(cp[k],0);
ans2=min(ans,ans2);
}
cout<<ans2;
return 0;
}
\(O(n*log(sum))\)做法
#include<bits/stdc++.h>
using namespace std;
#define go(i,a,b) for(int i=a;i<=b;++i)
#define com(i,a,b) for(int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const int N=300+10,inf=0x3f3f3f3f;
int n,s,head[N],d[N],dis[N],f[N],ans=0,far[N],ans2=inf,cnt=0;
bool vis[N];
vector<int>lng,cp;
struct edge{
int nxt,v,w;
}e[N*2];
void add(int u,int v,int w){
e[cnt]=(edge){head[u],v,w};
head[u]=cnt++;
}
void dfs(int u,int fa){
for(int i=head[u];i+1;i=e[i].nxt){
int v=e[i].v,w=e[i].w;
if(v==fa) continue;
d[v]=d[u]+w;
dfs(v,u);
}
}
void dfs2(int u,int fa){
f[u]=fa;
for(int i=head[u];i+1;i=e[i].nxt){
int v=e[i].v,w=e[i].w;
if(v==fa) continue;
dis[v]=dis[u]+w;
dfs2(v,u);
}
}
void dfs3(int u,int fake){
vis[u]=1;
ans=max(ans,fake);
for(int i=head[u];i+1;i=e[i].nxt){
int v=e[i].v,w=e[i].w;
if(vis[v]) continue;
dfs3(v,fake+w);
}
}
bool pd(int x,int y,int Max){
if(dis[x]<dis[y]) return 1;
if(dis[x]-dis[y]>s) return 0;
mem(vis,0);
int a=x;
while(x!=y) vis[x]=1,x=f[x];
vis[y]=1;
ans=0;
x=a;
while(x!=y){
x=f[x];
if(x!=y) dfs3(x,0);
}
return ans<=Max;
}
int main(){
//freopen("input.txt","r",stdin);
mem(head,-1);
cin>>n>>s;
int x,y,w;
ll L=0,R=0;
go(i,1,n-1){
cin>>x>>y>>w;
R+=w;
add(x,y,w);
add(y,x,w);
}
dfs(1,0);
int Max=-1,id,id2;
go(i,1,n) if(d[i]>Max){
Max=d[i],id=i;
}
dfs2(id,0);
Max=-1;
go(i,1,n) if(dis[i]>Max){
Max=dis[i],id2=i;
}
x=id2;
while(x!=id){
lng.push_back(x);
x=f[x];
}
lng.push_back(id);
int l=lng.size()-1;
while(L<=R){
ll mid=L+R>>1;
int a,b;
y=lng[0];
go(i,0,l){
x=lng[i];
if(dis[y]-dis[x]<=mid) a=x;
else break;
}
y=lng[l];
com(i,l,0){
x=lng[i];
if(dis[x]-dis[y]<=mid) b=x;
}
if(pd(a,b,mid)) R=mid-1;
else L=mid+1;
}
cout<<R+1;
return 0;
}