西南民族大学第十届校赛【题解完成】

55 阅读5分钟
题目难度知识点
A dreamstart的催促快速幂
B TRDD got lost again★★bfs
C Companydfs
D >A->B->C-模拟
E PPY的字符串模拟
F 集训队脱单大法:这是一道只能由学姐我自己出数据的水题贪心
G 不想再WA了dfs
H Ricky’s RealDan’s Ricky模拟
I 小A的期末作业模拟
J 怪盗基德 & 月之瞳宝石★★二分
k 正方体模拟
k 简单的分数gcd
k HJ浇花差分

dreamstart的催促

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int mod=10000019;
typedef long long int LL;
LL a[N],n,ans;
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;
}
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        ans=(ans+qsm(a[i],i,mod))%mod;
    }
    cout<<ans;
    return 0;
}

TRDD got lost again

image.png 用一个数组存该位置四个方向是不是可以走。

#include<bits/stdc++.h>
using namespace std;
const int N=3010;
const int M=3010*2;
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
string s[M];
int d[N][N],a[N][N],n,m;
bool st[N][N][4];
void check(int x,int y)
{
    for(int i=0;i<4;i++)
    {
        int tempx=x+dx[i];
        int tempy=y+dy[i];
        if(s[tempx][tempy]==' '|| s[tempx][tempy]=='S' || s[tempx][tempy]=='T' ) st[x/2][y/2][i]=1;
    }
}
void bfs()
{
    int stx,sty,edx,edy;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if(a[i][j]==1) stx=i,sty=j;
            if(a[i][j]==2) edx=i,edy=j;
        }
    memset(d,-1,sizeof d);
    d[stx][sty]=1;
    queue<pair<int,int>>q; q.push({stx,sty});
    while(q.size())
    {
        auto temp=q.front(); q.pop();
        int x=temp.first,y=temp.second;
        if(x==edx&&y==edy)
        {
            cout<<d[x][y];
            return;
        }
        for(int i=0;i<4;i++)
        {
            if(st[x][y][i]&&d[x+dx[i]][y+dy[i]]==-1)
            {
                d[x+dx[i]][y+dy[i]]=d[x][y]+1;
                q.push({x+dx[i],y+dy[i]});
            }
        }
    }
    cout<<"TRDD Got lost...TAT";
}
int main(void)
{
    cin>>n>>m;
    getline(cin,s[0]);
    for(int i=0;i<2*n+1;i++) getline(cin,s[i]);
    memset(a,-1,sizeof a);
    for(int i=1;i<2*n+1;i+=2)
    {
        for(int j=1;j<2*m+1;j+=2)
        {
            if(s[i][j]=='S') a[i/2][j/2]=1;
            if(s[i][j]=='T') a[i/2][j/2]=2;
            if(s[i][j]==' ') a[i/2][j/2]=0;
            check(i,j);
        }
    }
    bfs();
    return 0;
}

Company

image.png

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

>A->B->C-

image.png 这三个数一定要不一样

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n,flag;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        int p1=i;
        int p2=a[i];
        int p3=a[p2];
        if( a[p3]==p1 && p1!=p2 && p2!=p3 && p1!=p3 ) flag=1;
    }
    if(flag) puts("YES");
    else puts("NO");
    return 0;
}

PPY的字符串

image.png

#include<bits/stdc++.h>
using namespace std;
string a;
int n;
string f(string a)
{
    string ans;
    for(int i=0;i<a.size();i++)
    {
        int j=i;
        while(j+1<a.size()&&a[j+1]==a[i]) j++;
        ans+=to_string(j-i+1);
        ans+=a[i];
        i=j;
    }
    return ans;
}
int main(void)
{
    cin>>a>>n;
    for(int i=1;i<n;i++) a=f(a);
    cout<<a.size()<<" "<<a;
    return 0;
}

集训队脱单大法:这是一道只能由学姐我自己出数据的水题

image.png

#include<bits/stdc++.h>
using namespace std;
const int M=1e6+10;
const int N=1e5+10;
int a[N],n,maxl,ans;
int st[M];
priority_queue<int>maxr;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=2;i<=n;i++)
    {
        maxr.push(a[i]);
        st[a[i]]++;
    }
    for(int i=1;i<=n-1;i++)
    {
        maxl=max(maxl,a[i]);
        if(i>=2)
        {
             st[a[i]]--;
             while(st[maxr.top()]==0) maxr.pop();
        }
        ans=max(ans,abs(maxl-maxr.top()));
    }
    cout<<ans;
    return 0;
}

不想再WA了

image.png

#include<bits/stdc++.h>
using namespace std;
int t,ans,n;
void dfs(int index,int fa)
{
    if(index==n)
    {
        ans++;
        return;
    }
    for(int i=0;i<3;i++)
    {
        if(fa==2&&i==0) continue;
        dfs(index+1,i);
    }
}
int main(void)
{
    cin>>t;
    while(t--)
    {
        cin>>n;
        ans=0;
        dfs(0,-1);
        cout<<ans<<'\n';
    }
    return 0;
}

Ricky’s RealDan’s Ricky

image.png

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],n;
void solve()
{
    cin>>n;
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]%2==0) cnt++;
    }
    if(cnt&&n==1) puts("Ricky is Winner");
    else puts("RealDan is Winner");
}
int main(void)
{
    int t; cin>>t;
    while(t--) solve();
    return 0;
}

小A的期末作业

image.png

#include<bits/stdc++.h>
using namespace std;
int n;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<i-1;j++) cout<<" ";
        for(int j=1;j<=n;j++) cout<<"*";
        puts("");
    }
    for(int i=1;i<=n-1;i++)
    {
        for(int j=n-1-i;j>=1;j--) cout<<" ";
        for(int j=1;j<=n;j++) cout<<"*";
        puts("");
    }
    return 0;
}

怪盗基德 & 月之瞳宝石

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
LL a[N],b[N],n,m;
bool check(LL len)
{
    for(int i=1,j=1;i<=n;i++)
    {
        while(j<=m)
        {
            LL l=b[j]-len;
            LL r=b[j]+len;
            if(a[i]>=l&&a[i]<=r) break;
            else j++;
        }
        if(j>m) return false;
    }
    return true;
}
int main(void)
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=m;i++) cin>>b[i];
    sort(a+1,a+n+1);
    sort(b+1,b+m+1);
    LL l=0,r=1e9*4;
    while(l<r)
    {
        LL mid=(l+r)/2;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l;
    return 0;
}

正方体

image.png

#include<bits/stdc++.h>
using namespace std;
int a[5][5],n;
int main(void)
{
    cin>>n;
    for(int z=1;z<=n;z++)
    {
        for(int i=0;i<3;i++)
            for(int j=0;j<4;j++) cin>>a[i][j];
        int cnt1=0,cnt2=0;
        for(int i=0;i<4;i++)
        {
            if(a[0][i]) cnt1=a[0][i];
            if(a[2][i]) cnt2=a[2][i];
        }
        if(cnt1==cnt2&&(a[1][0]==a[1][2])&&(a[1][1]==a[1][3])) puts("Yes!");
        else puts("No!");
        if(z%50==0) puts("");
    }
    return 0;
}

简单的分数

image.png

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}
int t,op,a,b,c,d;
int main(void)
{
    cin>>t;
    while(t--)
    {
        cin>>op>>a>>b>>c>>d;
        int temp1,temp2;
        if(op==1) temp1=a*d+c*b;
        else temp1=a*d-c*b;
        temp2=b*d;
        if(temp1*temp2>=0)
        {
            temp1=abs(temp1);
            temp2=abs(temp2);
            int temp=gcd(temp1,temp2);
            temp1/=temp;
            temp2/=temp;
            cout<<temp1<<"/"<<temp2<<'\n';
        }else
        {   int temp=gcd(temp1,temp2);
            temp1/=temp;
            temp2/=temp;
            temp1=abs(temp1),temp2=abs(temp2);
            cout<<temp1*-1<<"/"<<temp2<<'\n'; 
        }
    }
    return 0;
}

HJ浇花

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int s[N],cnt[N],n;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int l,r; cin>>l>>r;
        l++,r++;
        s[l]++,s[r+1]--;
    }
    for(int i=1;i<=1e6+5;i++) s[i]+=s[i-1];
    for(int i=1;i<=1e6+5;i++) cnt[s[i]]++;
    for(int i=1;i<=n;i++) cout<<cnt[i]<<" ";
    return 0;
}