1. 程式人生 > 其它 >noip模擬63(待補)

noip模擬63(待補)

「電壓機制·括號密碼·排列·B關係」

A. 電壓機制

題目可以迅速轉化為:刪掉一條邊使得圖變為一個二分圖.

然而這並沒有什麼用..

另外可以發現我們必須刪掉一條邊,這條邊滿足是所有奇環的公共邊,而且不能是偶環的邊.

所以可以考慮差分實現.

A_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS {
	#define ll long long int
	#define ull unsigned ll
	#define lf double
	#define lbt(x) (x&(-x))
	#define mp(x,y) make_pair(x,y)
	#define lb lower_bound 
	#define ub upper_bound
	#define Fill(x,y) memset(x,y,sizeof x)
	#define Copy(x,y) memcpy(x,y,sizeof x)
	#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
	inline ll read() {
		ll res=0; bool cit=1; char ch;
		while(!isdigit(ch=getchar())) if(ch=='-') cit=0; 
		while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
		return cit?res:-res;
	}
} using namespace BSS;

const ll N=5e5+21;

ll m,n,ans,ts=1,cnt,alls;
ll head[N],odd[N],cf[N],dep[N];
struct I { ll u,v,nxt,vis; } e[N<<2];
inline void add(ll u,ll v){
	e[++ts].u=u,e[ts].v=v,e[ts].nxt=head[u],
	head[u]=ts;
}
void dfs(ll u,ll depth){
	dep[u]=depth;
	for(int i=head[u];i;i=e[i].nxt){
		if(e[i].vis) continue;
		e[i].vis=1,e[i^1].vis=1;
		if(dep[e[i].v]){
			ll len=dep[u]-dep[e[i].v]+1;
			if(len&1){
				odd[i]++,odd[i^1]++;
				cf[e[i].v]--; alls++;
			} 
			else{
				odd[i]--,odd[i^1]--;
				cf[e[i].v]++;
			}
			cf[u]+=odd[i];
		}
		else{
			dfs(e[i].v,depth+1);
			odd[i]+=cf[e[i].v],odd[i^1]+=cf[e[i].v];
			cf[u]+=cf[e[i].v];
		}
	}
}
signed main(){
	File(a);
	n=read(),m=read(); ll u,v;
	for(int i=1;i<=m;i++){
		u=read(),v=read();
		add(u,v),add(v,u);
	}
	dfs(1,1);
	for(int i=2;i<=ts;i+=2) ans+=(odd[i]==alls);
	printf("%lld\n",ans),exit(0);
}

B. 括號密碼

C. 排列

D. B關係