终于 牛客的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循环形式上与矩阵相同,可以写快速幂。(可惜我弱)
最后。
马炜梁《植物学》看完祭√
(滑稽)