2021天梯赛

l3-2

暴力预处理 30分写法

#include<bits/stdc++.h>
#define inf 0x3f3f3f
#define ll long long 
using namespace std;
const ll N=1e5+7;
ll n,a[N],ans[N],pos,m,maxx;
vector<ll>v[N];
vector<ll>jk[N];
struct node{
    ll len;
    ll a[N];
}k[105]; 
int flag=0;
int judge(int i,int j){//块编号 当前位置 
    if(k[i].len+j-1>n)    return 0;
    for(int z=1;z<=k[i].len;++z){
        if(k[i].a[z]!=a[j+z-1])    return 0;
    }
    return 1;
}
void dfs(int i){
    if(flag==1){
        return ;
    }
    if(i==n){
        flag=1;
        cout<<ans[1];
        for(int i=2;i<=pos;++i){
            cout<<" "<<ans[i];
        }
        return ;
    }
    for(int j=0;j<jk[i].size();++j){
        ans[++pos]=jk[i][j];
        dfs(i+k[jk[i][j]].len-1);
        ans[pos--]=0;
    }
}
int main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;++i){
        scanf("%lld",&a[i]);
        v[a[i]].push_back(i);
    }
    scanf("%lld",&m);
    for(int i=1;i<=m;++i){
        scanf("%lld",&k[i].len);
        for(int j=1;j<=k[i].len;++j){
            scanf("%lld",&k[i].a[j]);
        }
        for(int j=1;j<=n;++j){
            if(judge(i,j)){
                jk[j].push_back(i);
            }
        }
    }
    dfs(1);
    return 0;
} 

树里dfs最长链

注意这种写法很容易被卡。。。。

但是天梯真的好水

#include<bits/stdc++.h>
#define inf 0x3f3f3f
#define ll long long 
using namespace std;
const ll N=1e4+7;
ll maxx=0,n,x,q,d[N];
vector<ll>G[N];
int now[N],pos=0,ans[N];

void dfs(int x,int sum){
    now[++pos]=x;
    for(int j=0;j<G[x].size();++j){
        int to=G[x][j];
        dfs(to,sum+1);
    }
    if(sum>maxx){
        maxx=sum;
        for(int i=1;i<=maxx;++i){
            ans[i]=now[i];
        }
    }
    now[pos--]=-1;
}
int main(){
    cin>>n;
    for(int i=0;i<n;++i){
        cin>>x;
        while(x--){
            cin>>q;
            G[i].push_back(q);
            d[q]++;
        }
        sort(G[i].begin(),G[i].end());
    }
    for(int i=0;i<n;++i){
        if(d[i]==0){
            dfs(i,1);
        }
    }
    cout<<maxx<<"
";
    cout<<ans[1];
    for(int i=2;i<=maxx;++i){
        cout<<" "<<ans[i];
    }
    return 0;
} 
原文地址:https://www.cnblogs.com/PdrEam/p/14709713.html