考场错误:
A题由于问号没有改成井号,一直再调,一直没发现错误,然后依次做完了CBDHI,然后再通过手捏了一个比较大的样例,找到了这个低级错。
然后完成了E题之后,写F的过程中,由于写错了拓扑序的bfs的一些细节,F还wa了三发,最后总计完成了8题,仍然是罚时较多
Gym - 100971J
这道题目就是寻找两点间的路径,如果有一个度数为3的点,那么其中一个人就可在那里等待,等另一个人过去了
如果有两条路径显然也可以到达,那么我们就这样判断了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
int n,m,sx,sy,tx,ty;
string s[maxn];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int flag,d1;
vector <int> vis[maxn];
void dfs(int x,int y)
{
vis[x][y]=1;
int du=0;
for(int d=0;d<4;d++)
{
int tox=x+dx[d];
int toy=y+dy[d];
if(tox<0 || toy<0 || tox>=n || toy>=m) continue;
if(s[tox][toy]=='.') du++;
if(vis[tox][toy]) continue;
if(s[tox][toy]=='.') dfs(tox,toy);
}
if(du>=3) flag=1;
if(du==1) d1++;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
cin>>s[i];
for(int j=0;j<m;j++)
{
if(s[i][j]=='1') sx=i,sy=j,s[i][j]='.';
if(s[i][j]=='2') tx=i,ty=j,s[i][j]='.';
}
}
for(int i=0;i<n;i++) vis[i].resize(m+1);
dfs(sx,sy);
// cerr<<"ok";
if(!vis[tx][ty]) printf("NO\n");
else
{
if(!flag && d1==2) printf("NO\n");
else printf("YES\n");
}
return 0;
}
Gym - 100971M
这个dp很显然,既可以使用线段树优化,其实也可以直接使用单调队列进行优化
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int k,cnt,gs[27],n,f[maxn];
char s[maxn];
int main()
{
scanf("%d",&k);
scanf("%s",s+1);
n=strlen(s+1);
memset(f,-1,sizeof(f));
f[0]=0;
int pos=0;
for(int i=1;i<=n;i++)
{
while(cnt<k && pos<n)
{
pos++;
if(!gs[s[pos]-'a']) cnt++;
gs[s[pos]-'a']++;
}
if(cnt==k && f[i-1]!=-1)
{
if(f[pos]==-1) f[pos]=f[i-1]+1;
while(pos<n)
{
if(!gs[s[pos+1]-'a']) break;
gs[s[pos+1]-'a']++;
pos++;
f[pos]=f[i-1]+1;
}
}
--gs[s[i]-'a'];
if(!gs[s[i]-'a']) cnt--;
}
// cerr<<"ok";
for(int i=1;i<=n;i++) printf("%d ",f[i]);
return 0;
}