제출 #906513

#제출 시각아이디문제언어결과실행 시간메모리
906513imarnBridges (APIO19_bridges)C++14
100 / 100
1818 ms94592 KiB
#include<bits/stdc++.h>
#define ll long long
#define pii pair<ll,ll>
#define f first
#define s second
#define pb push_back
#define all(x) x.begin(),x.end()
using namespace std;
const int N=1e5+5,B=1000;
int pr[N],u[N],v[N],w[N],t[N],x[N],y[N],sz[N];
stack<pii>st;
bool vis[100001]{0};
int ans[100001]{0};
int get(int r){
    return pr[r]==r?r:get(pr[r]);
}
void uni(int a,int b){
    a=get(a),b=get(b);
    if(a==b)return;
    if(sz[a]<sz[b])swap(a,b);
    pr[b]=a;sz[a]+=sz[b];
    st.push({a,b});
}
void rollback(int x){
    while(st.size()>x){
        pii u=st.top();st.pop();
        sz[u.f]-=sz[u.s];pr[u.s]=u.s;
    }
}
vector<int>block[1001];
bool cmp1(int a,int b){
    return y[a]>y[b];
}
bool cmp2(int a,int b){
    return w[a]>w[b];
}
int main() {
    ios_base::sync_with_stdio(0);cin.tie(0);
    int n,m;cin>>n>>m;
    for(int i=1;i<=m;i++)cin>>u[i]>>v[i]>>w[i];
    int q;cin>>q;
    for(int i=1;i<=q;i++)cin>>t[i]>>x[i]>>y[i];
    for(int l=1;l<=q;l+=B){
        int r=min(q,l+B-1);
        iota(pr,pr+n+1,0);
        memset(vis,0,sizeof vis);
        vector<int>up,un,qr;
        for(int j=1;j<=n;j++)sz[j]=1;
        for(int j=l;j<=r;j++){
            if(t[j]==1)vis[x[j]]=1,up.pb(j);
            else qr.pb(j);
        }
        for(int j=1;j<=m;j++)if(!vis[j])un.pb(j);
        for(int j=l;j<=r;j++){
            if(t[j]==1)w[x[j]]=y[j];
            else {
                block[j-l].clear();
                for(auto it : up)if(w[x[it]]>=y[j])block[j-l].pb(x[it]);
            }
        }
        sort(qr.begin(),qr.end(),cmp1);
        sort(un.begin(),un.end(),cmp2);
        int cur=0;
        for(int j=0;j<qr.size();j++){
            while(cur<un.size()&&w[un[cur]]>=y[qr[j]])uni(u[un[cur]],v[un[cur]]),cur++;
            int prev=st.size();
            for(auto it : block[qr[j]-l])uni(u[it],v[it]);
            ans[qr[j]] = sz[get(x[qr[j]])];
            rollback(prev);
        }
    }
    for(int i=1;i<=q;i++)if(t[i]==2)cout<<ans[i]<<'\n';
}

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

bridges.cpp: In function 'void rollback(int)':
bridges.cpp:25:20: warning: comparison of integer expressions of different signedness: 'std::stack<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   25 |     while(st.size()>x){
      |           ~~~~~~~~~^~
bridges.cpp: In function 'int main()':
bridges.cpp:64:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |         for(int j=0;j<qr.size();j++){
      |                     ~^~~~~~~~~~
bridges.cpp:65:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |             while(cur<un.size()&&w[un[cur]]>=y[qr[j]])uni(u[un[cur]],v[un[cur]]),cur++;
      |                   ~~~^~~~~~~~~~
#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...