Submission #755406

#TimeUsernameProblemLanguageResultExecution timeMemory
755406guagua0407다리 (APIO19_bridges)C++17
14 / 100
1329 ms7560 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define f first
#define s second
#define all(x) x.begin(),x.end()
#define _ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

void setIO(string s) {
    freopen((s + ".in").c_str(), "r", stdin);
    freopen((s + ".out").c_str(), "w", stdout);
}

struct edge{
    int a,b,w;
};

struct query{
    int t,a,b,ind;
};

const int mxn=5e4+5;
const int mxm=1e5+5;
edge E[mxm];
query qs[mxm];
bool in[mxm];
bool visited[mxm];
int ans[mxm];
int K=1000;

struct DSU{
    vector<int> e;
    stack<pair<int,int>> st;
    DSU(int n){
        e=vector<int>(n,-1);
    }
    void init(){
        for(auto &v:e) v=-1;
        while(!st.empty()) st.pop();
    }
    int find(int x){
        return (e[x]<0?x:find(e[x]));
    }
    int sz(int x){
        return -e[find(x)];
    }
    bool unite(int a,int b){
        a=find(a);
        b=find(b);
        if(a==b) return false;
        if(e[a]>e[b]) swap(a,b);
        st.push({a,e[a]});
        st.push({b,e[b]});
        e[a]+=e[b];
        e[b]=a;
        return true;
    }
    void roll_back(int sz){
        while(st.size()>sz){
            pair<int,int> tmp=st.top();
            st.pop();
            e[tmp.f]=tmp.s;
        }
    }
};

bool comp(query x,query y){
    return x.b>y.b;
}

bool comp2(edge x,edge y){
    return x.w>y.w;
}

int main() {_
    int n,m,q;
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int a,b,w;
        cin>>a>>b>>w;
        a--;
        b--;
        E[i]={a,b,w};
    }
    cin>>q;
    for(int i=0;i<q;i++){
        int t,a,b;
        cin>>t>>a>>b;
        a--;
        qs[i]={t,a,b,i};
    }
    DSU dsu(n);
    for(int k=0;k<q;k+=K){
        vector<query> tmp;
        vector<int> ein;
        for(int i=k;i<min(k+K,q);i++){
            if(qs[i].t==1){
                in[qs[i].a]=true;
                ein.push_back(qs[i].a);
            }
            else{
                tmp.push_back(qs[i]);
            }
        }
        sort(all(tmp),comp);
        vector<edge> ok;
        for(int i=0;i<m;i++){
            if(!in[i]) ok.push_back(E[i]);
        }
        sort(all(ok),comp2);
        int pos=0;
        for(int i=0;i<tmp.size();i++){
            while(pos<ok.size() and ok[pos].w>=tmp[i].b){
                dsu.unite(ok[pos].a,ok[pos].b);
                pos++;
            }
            int prev_sz=dsu.st.size();
            for(int j=tmp[i].ind-1;j>=k;j--){
                if(qs[j].t==1 and !visited[qs[j].a]){
                    visited[qs[j].a]=true;
                    if(qs[j].b>=tmp[i].b){
                        dsu.unite(E[qs[j].a].a,E[qs[j].a].b);
                    }
                }
            }
            for(auto v:ein){
                if(!visited[v]){
                    if(E[v].w>=tmp[i].b){
                        dsu.unite(E[v].a,E[v].b);
                    }
                }
                else{
                    visited[v]=false;
                }
            }
            ans[tmp[i].ind]=dsu.sz(tmp[i].a);
            dsu.roll_back(prev_sz);
        }
        for(int i=k;i<min(k+K,q);i++){
            if(qs[i].t==1){
                E[qs[i].a].w=qs[i].b;
                in[qs[i].a]=false;
            }
        }
        dsu.roll_back(0);
    }
    for(int i=0;i<q;i++){
        if(qs[i].t==2){
            cout<<ans[i]<<'\n';
        }
    }
    return 0;
}
//maybe its multiset not set

Compilation message (stderr)

bridges.cpp: In member function 'void DSU::roll_back(int)':
bridges.cpp:61:24: warning: comparison of integer expressions of different signedness: 'std::stack<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   61 |         while(st.size()>sz){
      |               ~~~~~~~~~^~~
bridges.cpp: In function 'int main()':
bridges.cpp:114:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<query>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |         for(int i=0;i<tmp.size();i++){
      |                     ~^~~~~~~~~~~
bridges.cpp:115:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |             while(pos<ok.size() and ok[pos].w>=tmp[i].b){
      |                   ~~~^~~~~~~~~~
bridges.cpp: In function 'void setIO(std::string)':
bridges.cpp:12:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:13:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   13 |     freopen((s + ".out").c_str(), "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...