제출 #756294

#제출 시각아이디문제언어결과실행 시간메모리
756294amin조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++14
100 / 100
1718 ms110068 KiB
#include <bits/stdc++.h>

using namespace std;
#define ll long long

ll pa[100000];
ll ans=0;
set<ll>in[100000],out[100000],pain[100000];
ll sz[100000];
ll par(ll x)
{
    if(pa[x]==x)
        return x;

    pa[x]=par(pa[x]);
    return pa[x];
}
void un(ll x,ll y)
{
    x=par(x);
    y=par(y);
    if(x==y)
    {
        return ;
    }
    if(sz[x]<sz[y])
        swap(x,y);
    ///dont forget the sz[x]+=sz[y];sz[y]=0;
   // pa[y]=x;
    ans-=sz[x]*in[x].size();
    ans-=sz[y]*in[y].size();
    for(auto i:in[y])
    {
        /*if(in[x].find(i)!=in[x].end())
            continue;
*/
        in[x].insert(i);
    }
for(auto i:pain[y])
    pain[x].insert(par(i));
    ans+=in[x].size()*(sz[x]+sz[y]);
    for(auto i:out[y])
    {
    //    if(out[x].find(i)!=out[x].end())
          //  continue;
    out[x].insert(i);
    pain[par(i)].erase(y);
    pain[par(i)].insert(x);
    }

pa[y]=x;
    sz[x]+=sz[y];
    sz[y]=0;
    for(auto i:in[y])
    {
        if(pain[par(i)].find(x)!=pain[par(i)].end())
            un(x,i);
    }
    for(auto i:out[y])
    {
        if(pain[x].find(par(i))!=pain[x].end())
        un(x,i);

    }

}
int main()
{
    //os_base::sync_with_stdio(0);
    cout.tie(0);
    ll n;
    cin>>n;
    ll m;
    ans=n;
    for(ll i=0;i<n;i++)
    {
        sz[i]=1;
        pa[i]=i;
        in[i].insert(i);

    }
    cin>>m;
    while(m--)
    {
        ll x,y;
        cin>>x>>y;
        x--;
        y--;

        if(par(x)==par(y))
        {
         //   cout<<1<<' ';
            cout<<ans-n<<endl;
            continue;
        }
        if(pain[par(x)].find(par(y))!=pain[par(x)].end())
        {
            //cout<<' '<<2<<' ';

            un(x,y);
            cout<<ans-n<<endl;
            continue;
        }
        if(in[par(y)].find(x)!=in[par(y)].end())
        {
            //cout<<3<<' ';
            cout<<ans-n<<endl;
            continue;
        }

        in[par(y)].insert(x);
        out[par(x)].insert(y);
        pain[par(y)].insert(par(x));
        ans+=sz[par(y)];
        //cout<<4<<' ';
        cout<<ans-n<<endl;
    }
}

컴파일 시 표준 에러 (stderr) 메시지

joitter2.cpp: In function 'void un(long long int, long long int)':
joitter2.cpp:39:1: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   39 | for(auto i:pain[y])
      | ^~~
joitter2.cpp:41:5: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   41 |     ans+=in[x].size()*(sz[x]+sz[y]);
      |     ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...