Submission #1361097

#TimeUsernameProblemLanguageResultExecution timeMemory
1361097ereringTour (BOI25_tou)C++20
100 / 100
825 ms258300 KiB
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define endl '\n'
#define pb push_back
const int N=1e6+5,MAXA=1e6+5,inf=2e9+5,MOD=982451653;
vector<int> adj[N*4];
vector<pair<int,int>> out[N],in[N];
int id[N*4],st[N],vv,offset[N];
void build(int node,int offsett){
    if(node>=offsett)return;
    adj[id[node]].pb(id[node*2]);
    adj[id[node]].pb(id[node*2+1]);
    build(node*2,offsett);
    build(node*2+1,offsett);
}
void query(int node,int qlo,int qhi,int lo,int hi,int u,int plus){
    if(qlo>qhi)return;
    if(lo>=qlo && hi<=qhi){
      //  if(plus==6)cout<<lo<<' '<<hi<<' '<<out[vv][node-offset[vv]].second<<endl;
        if(lo!=hi)adj[u].pb(node+plus);
        else adj[u].pb(out[vv][node-offset[vv]].second);
        return;
    }
    if(lo>qhi || hi<qlo)return;
    int mid=(lo+hi)/2;
    query(node*2,qlo,qhi,lo,mid,u,plus);
    query(node*2+1,qlo,qhi,mid+1,hi,u,plus);
}
int vis[N*4],goal=-1;
bool stop=0;
vector<int> ans;
void dfs(int node){
    vis[node]=1;
    if(stop)return;
    for(auto i:adj[node]){
        if(vis[i]==1){
            goal=i;
            ans.pb(node);
            return;
        }
        if(vis[i]==0){
            dfs(i);
            if(stop)return;
            if(goal!=-1){
                ans.pb(node);
                if(goal==node)stop=1;
                return;
            }
        }
    }
    vis[node]=2;
}
signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int t; cin>>t;
    while(t--){
        int n,m; cin>>n>>m;
        ans.clear(); goal=-1; stop=0;
        for(int i=1;i<=n;i++){
            in[i].clear(); out[i].clear(); adj[i].clear();
        }
        for(int i=1;i<=m*4;i++)adj[i].clear();
        pair<int,int> p[m];
        int a[m];
        for(int i=0;i<m;i++){
            int c,u,v; cin>>u>>v>>c;
            p[i]={u,v}; a[i]=c;
            out[u].pb({c,i+1}); in[v].pb({c,i+1});
        }
        int dummy=m+1;
        for(int i=1;i<=n;i++){
            sort(out[i].begin(),out[i].end());
            offset[i]=1;
            while(offset[i]<out[i].size())offset[i]*=2;
            st[i]=dummy;
            for(int j=1;j<offset[i];j++)id[j]=dummy++;
            for(int j=offset[i];j<offset[i]+out[i].size();j++)id[j]=out[i][j-offset[i]].second;
            for(int j=offset[i]+out[i].size();j<offset[i]*2;j++)id[j]=dummy++;
            build(1,offset[i]);
        }
       // cout<<adj[7][0]<<' '<<adj[7][1]<<endl;
        for(int i=0;i<dummy;i++)vis[i]=0;
        for(int i=0;i<m;i++){
            int c=a[i],v=p[i].second;
            vv=v;
            int first=lower_bound(out[v].begin(),out[v].end(),make_pair(c,-1))-out[v].begin();
            int last=upper_bound(out[v].begin(),out[v].end(),make_pair(c,inf))-out[v].begin();
            last--;
            if(first<out[v].size() && out[v][first].first==c){
                if(out[v].size()==1)continue;
                else{
                 //   cout<<i+1<<' '<<first<<' '<<last<<' '<<out[v][0].first<<' '<<out[v][1].first<<' '<<st[v]<<endl;
                    query(1,0,first-1,0,offset[v]-1,i+1,st[v]-1);
                    query(1,last+1,(int)out[v].size()-1,0,offset[v]-1,i+1,st[v]-1);
                }
            }
            else{
            //    cout<<i+1<<' '<<v<<' '<<out[v][0].second<<endl;
                if(out[v].size()==1)adj[i+1].pb(out[v][0].second);
                else if(out[v].size())query(1,0,(int)out[v].size()-1,0,offset[v]-1,i+1,st[v]-1);
            }
        }
        for(int i=1;i<=m;i++){
            if(!vis[i])dfs(i);
            if(ans.size())break;
        }
        if(ans.size()){
            cout<<"YES"<<endl;
            vector<int> real;
            for(int i=0;i<ans.size();i++){
            //    cout<<ans[i]<<' ';
                if(ans[i]<=m)real.pb(ans[i]);
            }
           // cout<<endl;
            cout<<real.size()<<' '<<real[0]<<' ';
            for(int i=real.size()-1;i>0;i--)cout<<real[i]<<' ';
            cout<<endl;
        }
        else cout<<"NO"<<endl;
    }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...