牛客网NOIP赛前集训营-提高组(第七场) 小结

终于 牛客的NOIP赛前集训营有我会做的题目啦!
之前考的变态题天天爆零……
真的不是省选集训营???

A 中国式家长2

真·纯模拟,毫无坑点(以至于我一开始以为题目看错了,,看了好几遍……)

#include<bits/stdc++.h>
using namespace std;
int n,m,k,km,a[205][205],x,y,t,egy=0;
bool mapp[205][205],sign=0,vis[205][205];
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main(){
    n=read();m=read();km=k=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            a[i][j]=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            mapp[i][j]=read();
    t=read();memset(vis,0,sizeof(vis));
    for(int i=1;i<=t;i++){
        x=read();y=read();
        if(vis[x][y]||(!mapp[x][y])){
            sign=1;
            break;
        }
        if(a[x][y]==0){
            k-=10;egy+=10;
            if(k<0){
                sign=1;
                break;
            }
        }
        else k=min(km,k+a[x][y]);
        for(int u=x-1;u<=x+1;u++)
            for(int v=y-1;v<=y+1;v++)
                if(u>0&&v>0&&u<=n&&v<=m)
                    mapp[u][v]=1;
        vis[x][y]=1;
    }
    if(sign) printf("-1 -1");
    else printf("%d %d",k,egy);
    return 0;
}

B 随机生成树

很简单,枚举每个数的因数nsqrt(n)就能过。然鹅我以为过不了就写了别的……然后挂了。

#include<bits/stdc++.h>
using namespace std;
int n,c[500010],ans=1;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main(){
    n=read();
    for(int i=1;i<=n;i++) c[i]=read();
    for(int i=2;i<=n;i++){
        for(int j=1;j<i&&j*j<=i;j++){
            if(i%j==0){
                if(c[i]!=c[j]||c[i]!=c[i/j]){
                    ans++;
                    break;
                }
            }
        }
    }
    printf("%d",ans);
    return 0;
}

:这的确不是正解,正解是枚举每个数的倍数,复杂度nlogn,但我不想写了啊啊啊啊

C 洞穴

为了学习 (抄)大佬们的代码,又去看了bitset……(我是什么都不会吗……大概是的吧)
以后打算整理一下STL(如果有时间的话……)
f[i][j]表示从f点出发,经过长度为2^j的路径后所能到达的点的集合。

#include<bits/stdc++.h>
using namespace std;
int n,m,q,x,y,l,lg;
bitset <110> ans,s,f[110][31];
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-') f=-1; ch=getchar();}
    while(ch<='9'&&ch>='0') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
int main(){
    n=read();m=read();
    for(int i=1;i<=m;i++) x=read(),y=read(),f[x][0][y]=1;
    for(int j=0;j<=29;j++)
        for(int i=1;i<=n;i++)
            for(int k=1;k<=n;k++)
                if(f[i][j][k]) f[i][j+1]|=f[k][j];
    q=read();
    while(q--){
        l=read(),x=read(),y=read();
        lg=0;
        while(1<<(lg+1)<=l) lg++;//预处理lg
        ans.reset();//清零
        ans[x]=1;
        for(int i=0;i<=lg;i++){
            if((l>>i)&1){
                s=ans;ans.reset();
                for(int j=1;j<=n;j++)
                    if(s[j]) ans=ans|f[j][i];
            }
        }
        ans[y]?printf("YES\n"):printf("NO\n");
    }
    return 0;
}

:算法还可以更优,最后两个for循环形式上与矩阵相同,可以写快速幂。(可惜我弱)

最后。

马炜梁《植物学》看完祭√

(滑稽)

猜你喜欢

转载自blog.csdn.net/qq_42324633/article/details/83515338