제출 #243907

#제출 시각아이디문제언어결과실행 시간메모리
243907errorgornPipes (CEOI15_pipes)C++14
40 / 100
5096 ms65536 KiB
//雪花飄飄北風嘯嘯
//天地一片蒼茫
 
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
#define ll long long
#define ii pair<ll,ll>
#define iii pair<ii,ll>
#define fi first
#define se second
#define endl '\n'
#define debug(x) cout << #x << " is " << x << endl;
 
#define rep(x,start,end) for(auto x=(start)-((start)>(end));x!=(end)-((start)>(end));((start)<(end)?x++:x--))
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
 
ll MAX(ll a){return a;}
ll MIN(ll a){return a;}
template<typename... Args>
ll MAX(ll a,Args... args){return max(a,MAX(args...));}
template<typename... Args>
ll MIN(ll a,Args... args){return min(a,MIN(args...));}
 
#define indexed_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update>
 
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
 

struct ufds{
    int p[100005];
    int r[100005];

    ufds(){
        for (int x=0;x<100005;x++){
            p[x]=x;
            r[x]=0;
        }
    }
    int parent(int i){return (p[i]==i)?i:p[i]=parent(p[i]);}
    void unions(int i,int j){
        i=parent(i),j=parent(j);
        if (i==j) return;
        if (r[i]<r[j]){
            p[i]=j;
        }
        else{
            p[j]=i;
            if (r[i]==r[j]) r[i]++;
        }
    }
}dsu=ufds();

struct node{
	int s,e,m;
	bool val=false;
	node *l,*r;
	
	node (int _s,int _e){
		s=_s,e=_e,m=s+e>>1;
		
		if (s!=e){
			l=new node(s,m);
			r=new node(m+1,e);
		}
	}
	
	void update(int i,int j){
		if (s==i && e==j) val=true;
		else if (j<=m) l->update(i,j);
		else if (m<i) r->update(i,j);
		else l->update(i,m),r->update(m+1,j);
	}
	
	bool query(int i){
		if (val) return true;
		else if (s==e) return false;
		else if (i<=m && l->query(i)) return true;
		else if (m<i && r->query(i)) return true;
		else return false;
	}
} *root=new node(0,100005);


int n,m;
vector<int> al[100005];
int in[100005]; //preorder
int st[100005]; //subtree size
int parent[100005]; //first parent
int hparent[100005]; //parent on heavy path
int depth[100005];
void dfs_st(int i,int p){
    parent[i]=p;
    st[i]=1;
    if (al[i][0]==p && al[i].size()>1) swap(al[i][0],al[i][1]);
    for (auto &it:al[i]){ ///& is important here
        if (it==p) continue;
        depth[it]=depth[i]+1;
        dfs_st(it,i);
        st[i]+=st[it];
        if (st[it]>st[al[i][0]]){
            swap(it,al[i][0]);
            //we ensure heavy child is al[i][0]
        }
    }
}

int dfs_time=0;
void dfs_hld(int i,int p){
    in[i]=++dfs_time;
    for (auto it:al[i]){
        if (it==p) continue;
        hparent[it]=(it==al[i][0])?hparent[i]:it;
        dfs_hld(it,i);
    }
}

void hld_query(int i,int j){
    while (hparent[i]!=hparent[j]){
        if (depth[hparent[i]]<depth[hparent[j]]) swap(i,j);
		//cerr<<"debug: "<<in[hparent[i]]<<" "<<in[i]<<endl;
        root->update(in[hparent[i]],in[i]);
        i=parent[hparent[i]];
    }
    if (in[i]>in[j]) swap(i,j);
	//cerr<<"debug: "<<in[i]+1<<" "<<in[j]<<endl;
    if (in[i]!=in[j]) root->update(in[i]+1,in[j]);
}

 
vector<int> span;

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin>>n>>m;
	
	int a,b;
	rep(x,0,m){
		cin>>a>>b;
		
		if (dsu.parent(a)!=dsu.parent(b)){
			al[a].push_back(b);
			al[b].push_back(a);
			
			dsu.unions(a,b);
			span.push_back(x);
		}
	}
	
	rep(x,1,n+1) if (!depth[x]){
		depth[x]=1;
		parent[x]=0;
		hparent[x]=1;
		if (!al[x].empty()){
   			dfs_st(x,-1);
    		dfs_hld(x,-1);
		}
	}
	
	//rep(x,1,n+1) cout<<x<<" "<<in[x]<<endl;
	
	cin.seekg(0, ios::beg);
	
	int idx=0;
	
	cin>>n>>m;
	rep(x,0,m){
		cin>>a>>b;
		
		if (idx!=sz(span) && span[idx]==x){
			idx++;
			continue;
		}
		else{
			hld_query(a,b);
		}
	}
	
	rep(x,1,n+1) if (depth[x]!=1){
		if (!root->query(in[x])) cout<<x<<" "<<parent[x]<<endl;
	}
	
}

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

pipes.cpp: In constructor 'node::node(int, int)':
pipes.cpp:65:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   s=_s,e=_e,m=s+e>>1;
               ~^~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...