Submission #1305917

#TimeUsernameProblemLanguageResultExecution timeMemory
1305917StefanSebez다리 (APIO19_bridges)C++20
0 / 100
2539 ms6580 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
const int N=1e5+50,M=50050,S=320;
array<int,3>edges[N],Qs[N];

int par[M],sajz[M];
//vector<pair<int,int>>undo;
void DSU(){for(int i=0;i<M;i++) sajz[i]=1;}
int FS(int u){if(par[u]==0)return u;return par[u]=FS(par[u]);}
bool US(int u,int v){
    u=FS(u),v=FS(v);
    if(u==v) return 0;
    if(sajz[u]<sajz[v])swap(u,v);
    par[v]=u;
    sajz[u]+=sajz[v];
    //undo.pb({u,v});
    return 1;
}
/*void Undo(){
    auto [u,v]=undo.back();undo.pop_back();
    sajz[u]-=sajz[v];
    par[v]=0;
}*/
void Clear(){DSU();}//{while(!undo.empty())Undo();}
vector<int>E[N];
bool was[N];
int DFS(int u){
    //printf("* %i\n",u);
    int res=sajz[u];
    was[u]=true;
    for(auto i:E[u])if(!was[i])res+=DFS(i);
    return res;
}

bool skip[N];
int main(){
    DSU();
    int n,m;scanf("%i%i",&n,&m);
    for(int i=1;i<=m;i++){
        int u,v,w;scanf("%i%i%i",&u,&v,&w);
        edges[i]={w,u,v};
    }
    int q;scanf("%i",&q);
    for(int i=0;i<q;i++){
        int type,u,v;scanf("%i%i%i",&type,&u,&v);
        Qs[i]={type,u,v};
    }
    vector<int>res;
    for(int B=0;B*S<q;B++){
        int l=B*S,r=min(q-1,B*S+S-1);
        vector<array<int,4>>upd,qs;
        vector<array<int,3>>grane;
        vector<int>ans;
        int qcnt=0;
        qs.reserve(r-l+1);
        upd.reserve(r-l+1);
        for(int i=l;i<=r;i++){
           auto [type,u,v]=Qs[i];
           if(type==1) skip[u]=true;
           else qs.pb({v,u,qcnt++,i});
        }
        for(int i=1;i<=m;i++){
            if(skip[i]) upd.pb({edges[i][0],edges[i][1],edges[i][2],i});
            else grane.pb(edges[i]);
        }
        sort(grane.begin(),grane.end());
        sort(qs.begin(),qs.end());
        ans.resize(qcnt);
        for(int i=qcnt-1,j=(int)grane.size()-1;i>=0;i--){
            while(j>=0&&grane[j][0]>=qs[i][0]){
                US(grane[j][1],grane[j][2]);
                j--;
            }
            int undocnt=0;
            for(int k=l;k<=qs[i][3];k++){
                auto [type,u,v]=Qs[k];
                if(type==1) edges[u][0]=v;
            }
            vector<int>vts;
            for(auto [w,u,v,j]:upd){
                if(edges[j][0]>=qs[i][0]){
                    //undocnt+=US(u,v);
                    int u1=FS(u),v1=FS(v);
                    E[u1].pb(v1);
                    E[v1].pb(u1);
                    vts.pb(u1),vts.pb(v1);
                }
                edges[j][0]=w;
            }
            //for(int i=1;i<=n;i++)printf("%i ",was[i]==1?1:0);printf("\n");
            ans[qs[i][2]]=DFS(FS(qs[i][1]));
            //for(int i=1;i<=n;i++)printf("%i ",sajz[i]);printf("\n");
            //for(int i=1;i<=n;i++)printf("%i ",was[i]==1?1:0);printf("\n");
            //printf("vts: ");for(auto u:vts)printf("%i ",u);printf("\n");
            for(auto u:vts)was[u]=false,E[u].clear();
            was[FS(qs[i][1])]=false;
            //ans[qs[i][2]]=sajz[FS(qs[i][1])];
            //while(undocnt--) Undo();
        }
        for(auto i:ans) res.pb(i);
        for(int i=l;i<=r;i++){
            auto [type,u,v]=Qs[i];
            if(type==1) edges[u][0]=v,skip[u]=false;
        }
        Clear();
    }
    for(auto i:res) printf("%i\n",i);
    return 0;
}

Compilation message (stderr)

bridges.cpp: In function 'int main()':
bridges.cpp:45:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   45 |     int n,m;scanf("%i%i",&n,&m);
      |             ~~~~~^~~~~~~~~~~~~~
bridges.cpp:47:24: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   47 |         int u,v,w;scanf("%i%i%i",&u,&v,&w);
      |                   ~~~~~^~~~~~~~~~~~~~~~~~~
bridges.cpp:50:16: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |     int q;scanf("%i",&q);
      |           ~~~~~^~~~~~~~~
bridges.cpp:52:27: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   52 |         int type,u,v;scanf("%i%i%i",&type,&u,&v);
      |                      ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...