Submission #1155091

#TimeUsernameProblemLanguageResultExecution timeMemory
1155091ace5Newspapers (CEOI21_newspapers)C++20
8 / 100
0 ms584 KiB
#include <bits/stdc++.h>

using namespace std;
/*
typedef long long ll;

mt19937 rnd(228);

const int maxn = 300005;
const int sqr = 550;
const int pos1 = 150002;
const int maxq = 50005;

ll val[maxn];
int bl[maxn];
ll a[maxn];
int posex[maxn];
vector<pair<int,int>> ex(maxn);
int L = 0,R = -1;
int kel = 0;

struct block
{
    block(int _l,int _r,ll _sum,ll _wsum,ll _ans){l = _l,r = _r;sum = _sum;wsum = _wsum;ans = _ans;};
    block(){};
    int l,r;
    ll sum;
    ll wsum;
    ll ans;
    void upd()
    {
        sum = 0;
        wsum = 0;
        ans = 0;
        for(int j = l;j <= r;++j)
        {
            ans += val[j] * (sum * (j-l+2) - wsum) + (val[j] * (val[j] + 1) / 2);
            sum += val[j];
            wsum += (j-l+1) * val[j];
        }
    }
};

block mrg(block a,block b)
{
    block ans;
    ans.sum = a.sum + b.sum;
    ans.wsum = a.wsum + b.wsum + b.sum * (a.r-a.l+1);
    ans.ans = a.ans + b.ans + a.sum * (b.wsum + b.sum) + (a.sum * (a.r-a.l+1) - a.wsum) * b.sum;
    ans.l = a.l;
    ans.r = b.r;
    return ans;
}

block decomp[sqr];


void add_dec(int i,int x)
{
   // cout << "adding: " << x << " to " << i << endl;
    val[i] += x;
    decomp[bl[i]].sum += x;
    decomp[bl[i]].wsum += x * (i - bl[i]*sqr + 1);
    decomp[bl[i]].ans += x *
    decomp[bl[i]].upd();
   // cout << decomp[bl[i]].ans << ' ';
}

ll get(int l,int r)
{
    block ans = block(0,-1,0,0,0);
    while(l < r)
    {
        if(l % sqr != 0 || l + sqr - 1 > r)
        {
            ans = mrg(ans,block(l,l,val[l],val[l],val[l] * (val[l]+1) / 2));
            l++;
        }
        else
        {
            ans = mrg(ans,decomp[bl[l]]);
            l += sqr;
        }
    }
    return ans.ans;
}

int get_pos(int tpos,int sz)
{
    int d = (sz-tpos)/2;
    return pos1 + (sz%2 == tpos%2 ? -d : d);
}

void add(int el)
{
    //cout << el << "+\n";
    int tv = ex[posex[el]].first;
    int tpos = posex[el];//(upper_bound(ex.end()-kel-1,ex.end(),make_pair(tv,maxn+5))-ex.begin()-1);
    //cout << tpos << ' ';
    add_dec(get_pos(tpos,ex.size()),1);
    if(!ex[tpos].first)
        kel++;
    ex[tpos].first ++;
    int el2 = ex[tpos].second;
    swap(ex[tpos].second,ex[posex[el]].second);
    swap(posex[el],posex[el2]);
}
void sub(int el)
{
    //cout << el << "-\n";
    int tv = ex[posex[el]].first;
    int tpos = posex[el];//(lower_bound(ex.end()-kel-1,ex.end(),make_pair(tv,0))-ex.begin());
   // cout << tpos << ' ';
    add_dec(get_pos(tpos,ex.size()),-1);
    ex[tpos].first --;
    if(!ex[tpos].first)
        kel--;
    int el2 = ex[tpos].second;
    swap(ex[tpos].second,ex[posex[el]].second);
    swap(posex[el],posex[el2]);
}

ll res[maxq];

struct query
{
    query(int _l,int _r,int _i){l = _l;r = _r;i = _i;};
    query(){};
    int l,r,i;
    bool operator < (const query & oth){return (l/sqr != oth.l/sqr ? l/sqr < oth.l/sqr : r < oth.r);};
};

vector<query> ev;

void go_ll()
{
    L--;
    add(a[L]);
}
void go_lr()
{
    sub(a[L]);
    L++;
}
void go_rr()
{
    R++;
    add(a[R]);
}
void go_rl()
{
    sub(a[R]);
    R--;
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    for(int i = 0;i < maxn;++i)
    {
        ex[i].second = i;
        posex[i] = i;
        val[i] = 0;
        bl[i] = i/sqr;
    }
    for(int i = 0;i < sqr;++i)
        decomp[i] = block(i*sqr,(i+1)*sqr-1,0,0,0);
    int n = 300000,q = 50000;
    //cin >> n >> q;
    for(int i = 0;i < n;++i)
    {
        a[i] = rnd()%300000+1;
        //cin >> a[i];
    }
    for(int i = 0;i < q;++i)
    {
        int l = rnd()%n+1,r = rnd()%n+1;
        if(l > r)
            swap(l,r);
        //cin >> l >> r;
        l--;
        r--;
        ev.push_back(query(l,r,i));
    }
    sort(ev.begin(),ev.end());
    for(int i = 0;i < ev.size();++i)
    {
        if(i != 0 && ev[i].l/sqr != ev[i-1].l/sqr)
        {
            cout << ev[i].l << ' ' << ev[i].r << endl;
        }
       // cout << ev[i].r << ' ';
        int tl = ev[i].l;
        int tr = ev[i].r;
        while(L > tl)
        {
            go_ll();
        }
        while(R < tr)
        {
            go_rr();
        }
        while(L < tl)
        {
            go_lr();
        }
        while(R > tr)
        {
            go_rl();
        }
        res[ev[i].i] = get(0,maxn-1);
    }
    for(int i= 0 ;i < q;++i)
    {
        cout << res[i] << "\n";
    }
    return 0;
}*/

vector<vector<int>> g;
bool cyc = 0;
vector<int> vis;

void dfs1(int v,int p)
{
    vis[v] = 1;
    for(auto u:g[v])
    {
        if(!vis[u])
            dfs1(u,v);
        else if(u != p)
            cyc = 1;
    }
    return ;
}
pair<int,int> dfs2(int v,int p)
{
    pair<int,int> ans  ={v,0};
    for(auto u:g[v])
    {
        if(u != p)
        {
            pair<int,int> ne = dfs2(u,v);
            if(ne.second + 1 > ans.second)
            {
                ans = {ne.first,ne.second+1 };
            }
        }
    }
    return ans;
}
vector<int> path;

bool dfs3(int v,int p,int to)
{
    path.push_back(v);
    if(v == to)
    {
        return true;
    }
    for(auto u:g[v])
    {
        if(u != p)
        {
            if(dfs3(u,v,to))
                return true;
        }
    }
    path.pop_back();
    return false;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    cin >> n >> m;
    g.resize(n);
    vis.resize(n);
    for(int j = 0;j < m;++j)
    {
        int u,v;
        cin >> u >> v;
        u--;
        v--;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs1(0,-1);
    if(cyc)
    {
        cout << "NO\n";
        return 0;
    }
    else
    {
        int st = dfs2(0,-1).first;
        int fn = dfs2(st,-1).first;
        dfs3(st,-1,fn);
        vector<bool> isin(n);
        for(int j = 0;j < path.size();++j)
        {
            isin[j] = 1;
        }
        int no = 0;
        for(int j = 0;j < n;++j)
        {
            if(!isin[j])
            {
                if(g[j].size() != 1)
                {
                    for(auto u:g[j])
                    {
                        if(!isin[u] && g[u].size() > 1)
                        {
                            no = 1;
                        }
                    }
                }
            }
        }
        if(no)
        {
            cout << "NO\n";
        }
        else
        {
            cout << "YES\n";
            if(n == 1)
            {
                cout << "1\n1";
                return 0;
            }
            else if(n == 2)
            {
                cout << "2\n1 1\n";
                return 0;
            }
            vector<int> ans;
            for(int i = 1;i+1 < path.size();++i)
            {
                ans.push_back(path[i]);
                for(auto u:g[path[i]])
                {
                    if(!isin[u] && g[u].size() > 1)
                    {
                        ans.push_back(u);
                        ans.push_back(path[i]);
                    }
                }
            }
            for(int j = path.size()-2;j > 0;--j)
                ans.push_back(path[j]);
            cout << ans.size() << "\n";
            for(auto c:ans)
                cout << c+1 << ' ';
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...