版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35531039/article/details/84404450
T1 转圈游戏
初看以为是啥神仙数学题。
直到我发现他是day1t1才确定这真的是快速幂。
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
inline ll _() {
ll x=0,f=1; char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())
if(ch=='-')f=-f;
for(;ch>='0'&&ch<='9';ch=getchar())
x=x*10+ch-'0';
return x*f;
}
#define _ _()
ll n,m,k,x;
inline ll power(ll a,ll b) {
ll res=1;
while(b) {
if(b&1) res=res*a%n;
b>>=1; a=a*a%n;
}
return res;
}
int main() {
n=_; m=_; k=_; x=_;
printf("%lld\n",(x+m*power(10,k)%n)%n);
}
T2
T3 货车运输
跑出最大生成树,然后上Kruskal重构树|倍增。
当时写的是倍增
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
inline ll _() {
ll x=0,f=1; char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())
if(ch=='-')f=-f;
for(;ch>='0'&&ch<='9';ch=getchar())
x=x*10+ch-'0';
return x*f;
}
#define _ _()
const int N=5e4+5;
int n,m;
struct edge {
int u,v,w;
bool operator < (const edge b) const {
return w>b.w;
}
}b[N];
struct Edge { int to,nxt,w; }e[N<<1];
int cnt,head[N];
inline void insert(int u,int v,int w) {
e[cnt]=(Edge) {v,head[u],w};
head[u]=cnt++;
}
inline void ins(int u,int v,int w) {
insert(u,v,w); insert(v,u,w);
}
int pre[N],siz[N],dep[N],f[N][20],mn[N][20],ans;
inline int find(int x) { return pre[x]==x?x:pre[x]=find(pre[x]); }
inline void dfs(int x,int fa) {
dep[x]=dep[fa]+1;
for(int i=1;i<20;i++)
f[x][i]=f[f[x][i-1]][i-1],mn[x][i]=min(mn[x][i-1],mn[f[x][i-1]][i-1]);
for(int i=head[x];~i;i=e[i].nxt)
if(e[i].to!=fa) {
mn[e[i].to][0]=e[i].w; f[e[i].to][0]=x;
dfs(e[i].to,x);
}
}
inline int lca(int x,int y) {
ans=2e9;
if(dep[x]<dep[y]) swap(x,y);
for(int i=19;~i;i--) {
if(dep[f[x][i]]>=dep[y]) {
ans=min(ans,mn[x][i]);
x=f[x][i];
}
if(x==y) return x;
}
for(int i=19;~i;i--)
if(f[x][i]!=f[y][i])
ans=min(ans,min(mn[x][i],mn[y][i])),x=f[x][i],y=f[y][i];
ans=min(ans,min(mn[x][0],mn[y][0]));
return f[x][0];
}
int main() {
n=_; m=_;
memset(head,-1,sizeof(head));
for(int i=1;i<=n;i++)
for(int j=0;j<20;j++)
mn[i][j]=2e9;
for(int i=1;i<=n;i++)
pre[i]=i,siz[i]=1;
for(int i=1;i<=m;i++)
b[i].u=_,b[i].v=_,b[i].w=_;
sort(b+1,b+m+1);
for(int i=1;i<=m;i++) {
int x=find(b[i].u),y=find(b[i].v);
if(x!=y) {
ins(b[i].u,b[i].v,b[i].w);
if(siz[x]<siz[y]) swap(x,y);
siz[x]+=siz[y];
pre[y]=x;
}
}
for(int i=1;i<=n;i++)
if(pre[i]==i) dfs(i,0);
int q=_;
while(q--) {
int x=_,y=_;
if(find(x)!=find(y)) { puts("-1"); continue; }//lca(x,y);
lca(x,y);
printf("%d\n",ans);
}
}