제출 #1066899

#제출 시각아이디문제언어결과실행 시간메모리
1066899doducanh다리 (APIO19_bridges)C++14
100 / 100
1575 ms32592 KiB
///breaker
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define ii pair<int,int>
#define mp make_pair
#define in(x) freopen(x,"r",stdin)
#define out(x) freopen(x,"w",stdout)
#define bit(x,i) ((x>>i)&1)
const int maxm=1e5+7;
const int maxn=5e4+7;
const int B=1000;
struct edges
{
    int u,v,w;
};
struct query
{
    int t,x,y;
};
edges e[maxm];
query q[maxm];
int ans[maxm];
int n,m,qu;
vector<int>to_add[1005];
int r[maxm];
int sz[maxm];
void reset()
{
    for(int i=1;i<=n;i++){
        r[i]=i;
        sz[i]=1;
    }
}
inline int Find(int a) {
	while (r[a] != a) a = r[a];
	return a;
}
stack<int>st;
void Union(int u,int v)
{
    u=Find(u);
    v=Find(v);
    if(u==v)return;
    if(sz[u]>sz[v])swap(u,v);
    st.push(u);
    sz[v]+=sz[u];
    r[u]=r[v];

}
void roll_back(int x)
{
    while(st.size()>x){
        int u=st.top();
//        cout<<u<<" "<<sz[u]<<"\n";
        st.pop();
        sz[r[u]]-=sz[u];
        r[u]=u;
    }
}
void sol(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>e[i].u>>e[i].v>>e[i].w;
    }
    cin>>qu;
    for(int i=1;i<=qu;i++){
        cin>>q[i].t>>q[i].x>>q[i].y;
    }
    for(int l=1;l<=qu;l+=B){
        int r=min(l+B-1,qu);
        reset();
        vector<int>up,add;
        vector<bool>is_up(m+1,0);
        for(int i=l;i<=r;i++){
            if(q[i].t==1){
                is_up[q[i].x]=1;
                up.push_back(i);
            }
            else{
                add.push_back(i);
            }
        }
        for(int i=l;i<=r;i++){
            if(q[i].t==1){
                e[q[i].x].w=q[i].y;
            }
            else{
                to_add[i-l].clear();
                for(int j:up){
                    if(e[q[j].x].w>=q[i].y){
                        to_add[i-l].push_back(q[j].x);
                    }
                }
            }
        }
        vector<int>unchanged;
        for(int i=1;i<=m;i++){
            if(!is_up[i]){
                unchanged.push_back(i);
            }
        }
        sort(unchanged.begin(),unchanged.end(),[&](int a,int b){return e[a].w>e[b].w;});
        sort(add.begin(),add.end(),[&](int a,int b){return q[a].y>q[b].y;});
        int lo=0;
        for(int i:add){
            while(lo<unchanged.size()&&e[unchanged[lo]].w>=q[i].y){
                Union(e[unchanged[lo]].u,e[unchanged[lo]].v);
                lo++;
            }
//            cout<<17<<" "<<sz[Find(7)]<<"\n";
            int pre_size=st.size();
            for(int j:to_add[i-l]){
//                cout<<j<<" "<<e[j].u<<" "<<e[j].v<<" ";
                Union(e[j].u,e[j].v);
//                cout<<sz[Find(e[j].u)]<<"\n";
            }
            ans[i]=sz[Find(q[i].x)];
//            cout<<i<<" "<<ans[i]<<"\n";
            roll_back(pre_size);
////            cout<<17<<" "<<sz[Find(7)]<<"\n";
        }

    }
    for(int i=1;i<=qu;i++){
        if(q[i].t==2){
            cout<<ans[i]<<"\n";
        }
    }
}
main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t=1;
    while(t--){
        sol();
    }
    // you should actually read the stuff at the bottom
    return 0;
}
/* stuff you should look for
 * int overflow, array bounds
 * special cases (n=1?)
 * do smth instead of nothing and stay organized
 * WRITE STUFF DOWN
 * DON'T GET STUCK ON ONE APPROACH
 */

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

bridges.cpp: In function 'void roll_back(int)':
bridges.cpp:55:20: warning: comparison of integer expressions of different signedness: 'std::stack<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   55 |     while(st.size()>x){
      |           ~~~~~~~~~^~
bridges.cpp: In function 'void sol()':
bridges.cpp:109:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |             while(lo<unchanged.size()&&e[unchanged[lo]].w>=q[i].y){
      |                   ~~^~~~~~~~~~~~~~~~~
bridges.cpp: At global scope:
bridges.cpp:133:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  133 | main()
      | ^~~~
#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...