求调,O(n^3),不用memset不会做

P1141 01迷宫

wangborui123 @ 2023-12-23 10:59:51

怎么优化啊啊啊


#include <bits/stdc++.h>
using namespace std;
char a[2005][2005];
struct h
{
    int x,y;
};
int z[5][5]={{1,0},{-1,0},{0,1},{0,-1}};
queue<h>q;
bool f[2005][2005];
int main()
{
    int ans=0;
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>a[i][j];
        }
    }
    for(int t=0;t<m;t++)
    {
        int u,v;
        cin>>u>>v;
        q.push((h){u,v});
        while(!q.empty())
        {
            h now=q.front();
            int ux=now.x,uy=now.y;
            q.pop();
            if(ux<1 or ux>n or uy<1 or uy>n or f[ux][uy]==1)
            {
                continue;
            }
            f[ux][uy]=1;
            ans++;
            for(int i=0;i<4;i++)
            {
                if(a[ux+z[i][0]][uy+z[i][1]]!=a[ux][uy])q.push((h){ux+z[i][0],uy+z[i][1]});
            }
        }
        memset(f,0,sizeof(f));//知道问题在这里但是不会优化了,求调
        cout<<ans<<endl;
        ans=0;
    }
    return 0;
}

}

by kyEEcccccc @ 2023-12-23 11:13:29

拿个vector把用到的位置全部存起来,然后清空的时候把这些位置拿出来清空即可。


by wangborui123 @ 2023-12-23 13:59:32

@kyEEcccccc OK,我去试试,谢谢大佬


by wangborui123 @ 2023-12-23 14:06:20

@kyEEcccccc 80了,但还有两个TLE


by wangborui123 @ 2023-12-23 14:06:41

@kyEEcccccc


#include <bits/stdc++.h>
using namespace std;
char a[2005][2005];
struct h
{
    int x,y;
};
int z[5][5]={{1,0},{-1,0},{0,1},{0,-1}};
queue<h>q;
bool f[2005][2005];
int main()
{
    int ans=0;
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>a[i][j];
        }
    }
    for(int t=0;t<m;t++)
    {
        vector<h>xx;
        int u,v;
        cin>>u>>v;
        q.push((h){u,v});
        while(!q.empty())
        {
            h now=q.front();
            int ux=now.x,uy=now.y;
            q.pop();
            if(ux<1 or ux>n or uy<1 or uy>n or f[ux][uy]==1)
            {
                continue;
            }
            f[ux][uy]=1;
            xx.push_back((h){ux,uy});
            ans++;
            for(int i=0;i<4;i++)
            {
                if(a[ux+z[i][0]][uy+z[i][1]]!=a[ux][uy])q.push((h){ux+z[i][0],uy+z[i][1]});
            }
        }
        for(int i=0;i<xx.size();i++)
        {
            h node=xx[i];
            int x1=node.x,y1=node.y;
            f[x1][y1]=0;
        }
        cout<<ans<<endl;
        ans=0;
    }
    return 0;
}

by kyEEcccccc @ 2023-12-23 14:32:15

vector开在外面试试。我不太懂,可能复杂度不对?


by wangborui123 @ 2023-12-23 14:38:00

@kyEEcccccc 我现在应该是o(n^2)了吧,vector如果开在外面那我又要清空vector了啊,所以我放到循环里面了


by kyEEcccccc @ 2023-12-23 18:14:51

清空vector的复杂度是vector的长度。创建/析构一个vector的时间同样如此。但是vector是动态空间,一个已经存放过若干元素的vector,clear以后重新加入元素的时间和一个新vector加入相同数量的元素,前者可能快很多。在总操作次数多时尤其如此。


|