牛客小白月赛6 【题解完成】

68 阅读5分钟
题目难度知识点
A 鲲签到
B 鹏签到
C 桃花树的直径
D 字符串丝带模拟
E 对弈模拟
F 发电★★树状数组
G 指纹锁★★重载set
H 挖沟最小生成树
I 公交线路spfa
J 洋灰三角★★数学,推式子

image.png 只有一个可以作弊,且这是一个环,故返回的时候他们之间的距离还是要大于等于k

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    double l,k,a,b; cin>>l>>k>>a>>b;
    double t1=l/a;
    double t2=l/b;
    if(a>b)//可以作弊
    {
        double t=k/(a-b);
        if(l-t*2*a>=k) t2=min(t2,t*2);//且返回的时候距离仍大于k
    }
    printf("%.2lf",t2-t1);
}

image.png 将平缓的剔除掉,只留一个就很好判断了。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
vector<int>ve;
int a[N],n,ans;
int main(void)
{
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    ve.push_back(a[0]);
    for(int i=1;i<n;i++)
        if(a[i]!=a[i-1]) ve.push_back(a[i]);
    for(int i=1;i<ve.size()-1;i++)
    {
        if(ve[i]>ve[i-1]&&ve[i]>ve[i+1]) ans++;
    }
    cout<<ans;
    return 0;
}

桃花

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e6*2+10;
int h[N],e[N],ne[N],idx,d[N];
int n,m;
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u,int fa,int w)
{
    d[u]=w;
    for(int i=h[u];i!=-1;i=ne[i])
    {
        int j=e[i];
        if(j==fa) continue;
        dfs(j,u,w+1);
    }
}
int main(void)
{
    cin>>n>>m;
    memset(h,-1,sizeof h);
    for(int i=1;i<=n-1;i++)
    {
        int a,b; cin>>a>>b;
        add(a,b),add(b,a);
    }
    dfs(1,-1,0);
    int r=1;
    for(int i=1;i<=n;i++) if(d[r]<d[i]) r=i;
    memset(d,0,sizeof d);
    dfs(r,-1,0);
    int ans=0;
    for(int i=1;i<=n;i++) ans=max(ans,d[i]);
    cout<<ans+1;
    return 0;
}

字符串丝带

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e6*2+10;
int st[30],n,m,ans[N];
string s;
int main(void)
{
    cin>>n>>m>>s;
    s="0"+s;
    for(int i=1;i<=n;i++)
    {
        st[s[i]-'a']++;
        ans[s[i]-'a']=st[s[i]-'a'];
    }
    while(m--)
    {
        int op; cin>>op;
        cout<<ans[op]<<'\n';
    }
    return 0;
}

对弈

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int st[N][N],n,m,x,y,o;
int f(int x,int y,int o)
{
    st[x][y]=o;
    int stx=x,edx=x;
    while(st[stx-1][y]==o) stx--;
    while(st[edx+1][y]==0) edx++;
    if((edx-stx+1)>=5) return 1;
    int sty=y,edy=y;
    while(st[x][sty-1]==o) sty--;
    while(st[x][edy+1]==o) edy++;
    if((edy-sty+1)>=5) return true;
    
    stx=x,sty=y,edx=x,edy=y;
    while(st[stx-1][sty-1]==o) stx--,edy--;
    while(st[edx+1][edy+1]==o) edx++,edy++;
    if((edx-stx+1)>=5)  return true;
    
    stx=x,sty=y,edx=x,edy=y;
    while(st[stx+1][sty-1]==o) stx++,edy--;
    while(st[edx-1][edy+1]==o) edx--,edy++;
    if((edx-stx+1)>=5)  return true;
    return false;
};
int mani(void)
{
    cin>>n>>m;
    memset(st,-1,sizeof st);
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y;
        if(f(x,y,o))
        {
            if(i&1)
            {
                puts("HtBest");
                printf("%d",i);
            }else{
                puts("WHZ");
                printf("%d",i);
            }
        }else o^=1;
    }
    cout<<"UNK"<<'\n'<<m;
    return 0;
}

发电

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int mod=1e9+7;
typedef long long int LL;
LL tr[N],x,n,m;
LL lowbit(int x)
{
    return x&(-x);
}
LL qsm(LL a,LL b,LL p)
{
    LL sum=1;
    while(b)
    {
        if(b&1)sum=sum*a%p;
        b>>=1;
        a=a*a%p;
    }
    return sum%p;
}
void add(LL x,LL v)
{
    for(int i=x;i<=n;i+=lowbit(i))
        tr[i]=tr[i]*v%mod;
}
void add1(LL x,LL v)
{
    for(int i=x;i<=n;i+=lowbit(i))
        tr[i]=tr[i]*qsm(v,mod-2,mod)%mod;
}
LL query(LL x)
{
    LL res=1;
    for(int i=x;i;i-=lowbit(i))
        res=res*tr[i]%mod;
    return res;
}
int main(void)
{
    cin>>n>>m;
    for(int i=0;i<=n;i++) tr[i]=1;
    while(m--)
    {
        int op; scanf("%d",&op);
        if(op==1)
        {
            int y,z; 
            scanf("%d%d",&y,&z);
            add(y,z);
        }else if(op==2)
        {
            int y,z;  scanf("%d%d",&y,&z);
            add1(y,z);
        }else if(op==3)
        {
            int l,r; scanf("%d%d",&l,&r);
            printf("%lld\n",query(r)*qsm(query(l-1),mod-2,mod)%mod);
        }
    }
    return 0;
}

指纹锁

image.png

#include<bits/stdc++.h>
using namespace std;
int m,k;
struct cmp{
  bool operator()(const int& a,const int& b)const{
      if(abs(a-b)<=k) return false;
      return a<b;
  }
};
set<int,cmp>st;
int main(void)
{
    cin>>m>>k;
    while(m--)
    {
        string op; cin>>op;
        if(op=="add")
        {
            int x; scanf("%d",&x);
            st.insert(x);
        }else if(op=="del")
        {
            int x; scanf("%d",&x);
            st.erase(x);
        }else{
            int x; scanf("%d",&x);
            if(st.find(x)!=st.end()) puts("Yes");
            else puts("No");
        }
    }
    return 0;
}

挖沟

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int p[N],n,m;
struct node
{int a,b,c;}Node[N];
bool cmp(node a,node b)
{
    return a.c<b.c;
}
int find(int x)
{
    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];
}
void solve()
{
    int sum=0;
    for(int i=1;i<=n;i++) p[i]=i;
    for(int i=0;i<m;i++)
    {
        int a=Node[i].a,b=Node[i].b,c=Node[i].c;
        if(find(a)==find(b)) continue;
        p[find(a)]=find(b);
        sum+=c;
    }
    cout<<sum;
}
int main(void)
{
    cin>>n>>m;
    for(int i=0;i<m;i++) cin>>Node[i].a>>Node[i].b>>Node[i].c;
    sort(Node,Node+m,cmp);
    solve();
    return 0;
}

公交线路

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e4*2+10;
int h[N],e[N],w[N],ne[N],idx;
int n,m,s,t,st[N],d[N];
void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void spfa()
{
    memset(d,0x3f,sizeof d);
    d[s]=0,st[s]=1;
    queue<int>q; q.push(s);
    while(q.size())
    {
        int u=q.front(); q.pop();
        st[u]=0;
        for(int i=h[u];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(d[j]>d[u]+w[i])
            {
                d[j]=d[u]+w[i];
                if(!st[j]) q.push(j),st[j]=1;
            }
        }
    }
    if(d[t]>0x3f3f3f3f/2) cout<<-1;
    else cout<<d[t];
}
int main(void)
{
    cin>>n>>m>>s>>t;
    memset(h,-1,sizeof h);
    while(m--)
    {
        int a,b,c; cin>>a>>b>>c;
        add(a,b,c),add(b,a,c);
    }
    spfa();
    return 0;
}

洋灰三角

image.png

image.png

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long int LL;
LL qsm(LL a,LL b,LL p)
{
    LL sum=1;
    while(b)
    {
        if(b&1) sum=sum*a%p;
        a=a*a%p;
        b>>=1;
    }
    return sum%p;
}
int main(void)
{
    LL n,k,p; cin>>n>>k>>p;
    if(k==1)
    {
        LL sum1=(p%mod*n%mod)*(n-1+mod)%mod;
        sum1=sum1*qsm(2,mod-2,mod)%mod;
        cout<<sum1+n;
    }else{
        LL temp1=(qsm(k,n,mod)-1+mod)%mod;
        LL temp2=(1+p*qsm(k-1,mod-2,mod))%mod;
        temp1=temp1*temp2%mod;
        temp1=(temp1-p*n%mod+mod)%mod;
        cout<<temp1*qsm(k-1,mod-2,mod)%mod;
    }
}