제출 #1177667

#제출 시각아이디문제언어결과실행 시간메모리
1177667sasdeBridges (APIO19_bridges)C++20
0 / 100
3093 ms4888 KiB
#include<bits/stdc++.h>
#define task "strdel"
#define ii pair<int,int>
#define iii pair<int,ii>
#define iv pair<ii,ii>
#define se second
#define fi first
#define ffi fi.fi
#define sfi se.fi
#define sse se.se
#define fse fi.se
#define lt(i, c, d) for(int i = c; i <= d; ++i)
#define fl(i, c, d) for(int i = d; i >= c; --i)
#define pb push_back
#define emb emplace_back
#define emf emplace_front
#define em emplace
using namespace std;
const int N=1e6+5,lg=20,mod=1e9+7;
mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
int Rand(int u,int v){
 return u+rd()%(v-u+1);
}
struct pt
{
  pt(){};
  pt(int _rku,int _rkv,int _u,int _v,int _szu,int _szv,int _i):rku(_rku),rkv(_rkv),u(_u),v(_v),szu(_szu),szv(_szv),i(_i){};
  int rku,rkv,u,v,szu,szv,i;
};
struct zz{
  int n;
vector<pt>res;
vector<int>r,rk,sz;
void build(int _n){
n=_n;
r=vector<int>(n+5);
rk=vector<int>(n+5,0);
sz=vector<int>(n+5,1);
for(int i=1;i<=n;++i)r[i]=i;
}
int acs(int u){
  return r[u]==u?u:acs(r[u]);
}
void join(int u,int v,int i){
  u=acs(u);
  v=acs(v);
  if(u!=v){
    if(rk[u]>rk[v])swap(u,v);
    res.emb(rk[u],rk[v],u,v,sz[u],sz[v],i);
    r[v]=u;
    rk[u]+=(rk[u]==rk[v]);sz[u]+=sz[v];
  }
}
void rollback(int w){
  while(!res.empty()&&w<res.back().i){
    int u=res.back().u;
    int v=res.back().v;
    int rku=res.back().rku;
    int rkv=res.back().rkv;
    r[u]=u;
    r[v]=v;
    rk[u]=rku;
    rk[v]=rkv;
    sz[u]=res.back().szu;
    sz[v]=res.back().szv;
    res.pop_back();
  }
}
}s;
int n,m,ans[N];
struct pt1{
  int u,v,w,i;
}b[N];
vector<int>query;
struct pt2{
  int b,r,i;

};
struct pt3{
  int s,w,i;

};
vector<pt2>res;
vector<pt3>res1;
bool k[N];
int k1[N];
void solve(){
  cin >> n >> m;
  s.build(n);
  // cout <<n;
  for(int i=1;i<=m;++i)cin >> b[i].u >> b[i].v >> b[i].w,b[i].i=i;
  int q;
cin >> q;
int sq=sqrt(q);
for(int test=1;test<=q;++test){
  int t,u,v;
  cin >> t >> u >> v;
if(t==1)res.pb({u,v,test});
else res1.pb({u,v,test}),query.emb(test);
if(test%sq==0){

  if(res1.empty()){
  for(pt2 x:res)b[x.b].w=x.r,k[x.b]=0;;
    continue;
  }
  sort(res1.begin(),res1.end(),[](const pt3 &x,const pt3 &y){return x.w>y.w;});
  vector<int>nojo,jo;
  for(pt2 x:res)k[x.b]=1;
  for(int i=1;i<=m;++i){
    if(k[i])jo.emb(i);
    else nojo.emb(i);
  }
  sort(nojo.begin(),nojo.end(),[](const int &x,const int &y){
    return b[x].w>b[y].w;
  });
  int j=0;

  for(pt3 x:res1){
    // if(test==4)cout <<x.w<<" "<<b[nojo<<'\n';

    while(b[nojo[j]].w>=x.w&&j<m){

      s.join(b[nojo[j]].u,b[nojo[j]].v,0);
      ++j;
    }
    for(pt2 y:res){
      if(y.i<x.i){
        k1[y.b]=y.i;
      }
    }
    for(int y:jo){
      if(k1[y]){
        if(b[k1[y]].w>=x.w)s.join(b[k1[y]].u,b[k1[y]].v,1);
      }
      else{
        if(b[y].w>=x.w)s.join(b[y].u,b[y].v,1);
      }
    }
    ans[x.i]=s.sz[s.acs(x.s)];
    s.rollback(0);
   for(pt2 y:res){
        k1[y.b]=0;
    }
  }
  s.rollback(-1);
  // for(int i=1;i<=m;++i)cout <<b[i].w<<" ";cout<<'\n'
  for(pt2 x:res)b[x.b].w=x.r,k[x.b]=0;
  res.clear();res1.clear();
}
}
if(!res1.empty()){
    sort(res1.begin(),res1.end(),[](const pt3 &x,const pt3 &y){return x.w>y.w;});
  vector<int>nojo,jo;
  for(pt2 x:res)k[x.b]=1;
  for(int i=1;i<=m;++i){
    if(k[i])jo.emb(i);
    else nojo.emb(i);
  }
  sort(nojo.begin(),nojo.end(),[](const int &x,const int &y){
    return b[x].w>b[y].w;
  });
  int j=0;

  for(pt3 x:res1){
    // if(test==4)cout <<x.w<<" "<<b[nojo<<'\n';

    while(b[nojo[j]].w>=x.w&&j<m){

      s.join(b[nojo[j]].u,b[nojo[j]].v,0);
      ++j;
    }
    for(pt2 y:res){
      if(y.i<x.i){
        k1[y.b]=y.i;
      }
    }
    for(int y:jo){
      if(k1[y]){
        if(b[k1[y]].w>=x.w)s.join(b[k1[y]].u,b[k1[y]].v,1);
      }
      else{
        if(b[y].w>=x.w)s.join(b[y].u,b[y].v,1);
      }
    }
    ans[x.i]=s.sz[s.acs(x.s)];
    s.rollback(0);
   for(pt2 y:res){
        k1[y.b]=0;
    }
  }
}
for(int i:query)cout <<ans[i]<<'\n';
}
main()
{
  srand(time(0));
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    if(fopen(task".inp","r")){
      freopen(task".inp","r",stdin);
      freopen(task".out","w",stdout);
    }
    int t=1;
 //   cin >> t;
while(t--){
    solve();
}

}

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

bridges.cpp:194:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  194 | main()
      | ^~~~
bridges.cpp: In function 'int main()':
bridges.cpp:201:14: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  201 |       freopen(task".inp","r",stdin);
      |       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:202:14: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  202 |       freopen(task".out","w",stdout);
      |       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...