7.26训练总结

考场错误:
A题由于问号没有改成井号,一直再调,一直没发现错误,然后依次做完了CBDHI,然后再通过手捏了一个比较大的样例,找到了这个低级错。
然后完成了E题之后,写F的过程中,由于写错了拓扑序的bfs的一些细节,F还wa了三发,最后总计完成了8题,仍然是罚时较多

Gym - 100971J

这道题目就是寻找两点间的路径,如果有一个度数为3的点,那么其中一个人就可在那里等待,等另一个人过去了

如果有两条路径显然也可以到达,那么我们就这样判断了

#include
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
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;
}

你可能感兴趣的:(图论,算法)