牛客網NOIP賽前集訓營-提高組(第七場) 小結
阿新 • • 發佈:2018-11-06
終於 牛客的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迴圈形式上與矩陣相同,可以寫快速冪。(可惜我弱)
最後。
馬煒樑《植物學》看完祭√
(滑稽)