P11230 [CSP-J 2024] 接龙 建图求条,5pts
查看原帖
P11230 [CSP-J 2024] 接龙 建图求条,5pts
1340759
ARIS2_0楼主2025/1/4 16:03

RT,5pts,AC on #1,chain3 没过。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
// #define debug1(x) cerr<<#x<<"="<<x<<" "
// #define debug2(x) cerr<<#x<<"="<<x<<"\n"
const int inf=1e16,maxn=2e5+10;
namespace ARIS2_0{
    int n,k,ask,len[maxn];
    vector<pii>v[maxn];
    vector<int>num[maxn];
    bool ans[110][maxn];
    void clear(){
        for(int i=0;i<maxn;i++)v[i].clear(),num[i].clear();
        memset(ans,0,sizeof(ans));
    }
    struct node{int id,w,cnt;};
    queue<node>q;
    void bfs(){
        for(int id=1;id<=n;id++){
            int lst=1;
            for(int i=1;i<=len[id];i++){
                if(num[id][i]==1){
                    for(int j=max(lst,i+1);j<=min(i+k-1,len[id]);j++){
                        q.push(node{id,j,1});
                        ans[1][num[id][j]]=1;
                    }
                    lst=i+k;
                }
            }
        }
        while(q.size()){
            int id=q.front().id,w=q.front().w,cnt=q.front().cnt;
            q.pop();
            // debug1(id);debug1(w);debug2(cnt);
            if(cnt==100)continue;
            for(int i=0;i<v[num[id][w]].size();i++){
                int nid=v[num[id][w]][i].fi,nw=v[num[id][w]][i].se;
                if(nid!=id){
                    for(int j=nw+1;j<=min(len[nid],nw+k-1);j++){
                        if(!ans[cnt+1][num[nid][j]]){
                            ans[cnt+1][num[nid][j]]=1;
                            q.push(node{nid,j,cnt+1});
                            /*if(cnt+1==1 and num[nid][j]==1){
                                debug1(cnt);debug2(num[id][w]);
                            }*/
                        }
                    }
                }
            }
        }
    }
    void solve(){
        clear();
        cin>>n>>k>>ask;
        for(int i=1;i<=n;i++){
            cin>>len[i];
            num[i].resize(len[i]+1);
            for(int j=1;j<=len[i];j++){
                cin>>num[i][j];
                v[num[i][j]].push_back({i,j});
            }
        }
        bfs();
        while(ask--){
            int r,c;cin>>r>>c;
            cout<<ans[r][c]<<"\n";
        }
    }
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int t;cin>>t;
    while(t--)ARIS2_0::solve();
	return 0;
}
2025/1/4 16:03
加载中...