1. 程式人生 > >牛客網NOIP賽前集訓營-提高組(第七場) 小結

牛客網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迴圈形式上與矩陣相同,可以寫快速冪。(可惜我弱)

最後。

馬煒樑《植物學》看完祭√

(滑稽)