首页 > 其他分享 >2023.2 做题笔记

2023.2 做题笔记

时间:2023-02-02 21:14:36浏览次数:79  
标签:cnt 200005 删除 int 笔记 2023.2 权值 define

【Baekjoon19394】Eulerian Orientation

选中边不好做,考虑删除边,一个删除 \(x\) 条边的图的权值是 \((m-x)^2\),令 \(k\) 个合法图分别删除 \(x_1,x_2,...,x_k\),答案就是 \(\sum_{i=1}^k (m-x_i)^2=km^2-2m\sum_{i=1}^k x_i+\sum_{i=1}^k x_i^2\)。

对于第一项,只需要求出合法图的个数。任意取出图的一个生成森林,如果将一条非树边 \((u,v)\) 选中,树上 \(u,v\) 两点间路径上的边的选中状态会翻转,即非树边任意选,树边由非树边选择方案唯一确定,易得 \(k=2^{m-n+cnt}\)。

对于第二项,考虑 \(\sum x_i\) 的组合意义,即对于每个合法的删除方案,选一条被删除的边的方案数之和。枚举选中的这条边是什么,求出钦定它删除后有多少种删除方案。如果选中割边,则 \(cnt\) 减少 \(1\),否则 \(cnt\) 不变。

对于第三项,同样的套路,钦定两条边删除。如果都是割边,则 \(cnt\) 增加 \(2\);如果一条割边一条非割边,则 \(cnt\) 增加 \(1\);如果两条非割边,则 \(cnt\) 增加 \(0\) 或 \(1\)。前两种情况很简单,如果能求出删掉两条边使得图不连通的方案数,问题即可解决。

在图中随便找一棵生成森林。对于非树边赋一个随机权值,令一条树边的权值为覆盖它的非树边权值的异或和,则删除一个边集后图不连通在很大概率下当且仅当这个边集存在一个子集的异或和为 \(0\),用这个方法去找出权值一样的树边即可,复杂度 \(O(n)\) 或 \(O(n \log n)\),瓶颈在排序。

Code
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define int long long
#define fi first
#define se second
#define pii pair<long long,long long>
#define mp make_pair
#define pb push_back
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const int INF=1e18;
int fpow(int x,int b){
	if(x==0) return 0;
	if(b==0) return 1;
	int res=1;
	while(b>0){
		if(b&1)	res=res*x%mod;
		x=x*x%mod;
		b>>=1;
	}
	return res;
}
int n,m;
vector <pii > g[200005],t[200005];
mt19937_64 rnd(time(0));
int U[200005],V[200005],tp[200005];
ull We[200005],Wv[200005];
// 0: out tree, 1: in tree
bool vis[200005];
void dfs0(int u)
{
	vis[u]=1;
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i].fi;
		if(vis[v]) continue;
		tp[g[u][i].se]=1;
		t[u].pb(mp(v,g[u][i].se)),t[v].pb(mp(u,g[u][i].se));
		dfs0(v);
	}
}
int cntB;
vector <ull> vec;
map <ull,int> ma;
int notB;
void dfs1(int u,int isrt)
{
	vis[u]=1;
	for(int i=0;i<t[u].size();i++)
	{
		int v=t[u][i].fi;
		if(vis[v]) continue;
		dfs1(v,0);
		Wv[u]^=Wv[v];
	}
	if(!isrt) 
	{
		if(!Wv[u]) cntB++;
		else vec.pb(Wv[u]);
	}
}
void solve()
{
	for(int i=1;i<=n;i++) g[i].clear(),t[i].clear(),Wv[i]=0;
	vec.clear();
	cntB=notB=0;
	for(int i=1;i<=m;i++) scanf("%lld%lld",&U[i],&V[i]),g[U[i]].pb(mp(V[i],i)),g[V[i]].pb(mp(U[i],i)),tp[i]=We[i]=Wv[i]=0;
	int c=0;
	for(int i=1;i<=n;i++) vis[i]=0;
	for(int i=1;i<=n;i++) if(!vis[i]) dfs0(i),c++;
	for(int i=1;i<=m;i++) if(!tp[i]) We[i]=rnd(),Wv[U[i]]^=We[i],Wv[V[i]]^=We[i],vec.pb(We[i]);
	for(int i=1;i<=n;i++) vis[i]=0;
	for(int i=1;i<=n;i++) if(!vis[i]) dfs1(i,1);
	sort(vec.begin(),vec.end());
	for(int i=0;i<vec.size();i++)
	{
		int j=i;
		while(j<vec.size()&&vec[j]==vec[i]) j++;
		j--;
		notB+=1LL*(j-i+1)*(j-i+1);
		i=j;
	}
	int ans=fpow(2,m-n+c)*m%mod*m%mod;
//	cout<<ans<<endl;
	ans=(ans-2LL*m%mod*cntB%mod*fpow(2,m-1-n+c+1)%mod+mod)%mod;
	ans=(ans-2LL*m%mod*(m-cntB)%mod*fpow(2,m-1-n+c)%mod+mod)%mod;
//	cout<<ans<<endl;
	ans=(ans+cntB*cntB%mod*fpow(2,m-2-n+c+2)%mod)%mod;
	ans=(ans+2LL*cntB*(m-cntB)%mod*fpow(2,m-2-n+c+1)%mod)%mod;
	ans=(ans+notB%mod*fpow(2,m-2-n+c+1)%mod)%mod;
//	cout<<ans<<endl;
	int cnt=m*m-cntB*cntB-2LL*cntB*(m-cntB)-notB;
//	cout<<m<<" "<<n<<" "<<c<<" "<<m-n+c<<" "<<cnt<<" "<<cntB<<" "<<notB<<endl;
	ans=(ans+cnt%mod*fpow(2,m-2-n+c)%mod)%mod;
	printf("%lld\n",ans);
}
signed main()
{
	int _=1;
//	cin>>_;
	while(cin>>n>>m) solve();
	return 0;
}

标签:cnt,200005,删除,int,笔记,2023.2,权值,define
From: https://www.cnblogs.com/znstz2018/p/17087422.html

相关文章

  • 2023.2.2 日寄
    距离放假还有\(\underline{~1~}\)天2023.2.2日寄一言\(~~~~\)“全国公民们,在三十五分钟后,我们的国家可能受到一次大规模核打击。加上第一批核弹头到达前所用的飞行......
  • 通用视觉框架 OpenMMLab第一课笔记
    目录计算机视觉是什么计算机视觉应用传统视觉特征机器学习基础机器学习是什么为什么要让"机器"去"学习"机器学习是什么机器学习的典型范式机器学习的基本流程计算机视觉是......
  • JMeter笔记8 | JMeter关联
    (8|JMeter关联)1测试对象接之前的说明,我们的测试对象为禅道开源版本;按照之前的文章搭建部署好本地禅道,开启服务即可①先到官网下载Windows一键安装包,安装完后启......
  • Redis 学习笔记
    Redis是非关系型的键值对数据库,数据是存储在内存中的,读写速度很快,广泛用于缓存方向,也可用于数据库的持久化。MySQL是关系型的磁盘数据库。访问Redis的速度要更快一点,但受......
  • OpenGL ES 2.0编程指导阅读笔记(六)顶点属性、顶点数组和缓冲对象
    顶点数据,又称顶点属性,给定了每个顶点的数据。这类每个顶点的数据可以每个顶点分别给定,也可以给定一个所有顶点共用的常量。在OpenGLES1.1中,顶点属性名称是预定义的,如po......
  • Python学习笔记--面向对象--进阶
    1.一切皆对象,什么是一切皆对象?python中,创建一个学生类,也就是创建了一个类型叫学生类。classStudent:def__init__(self,x,y,z):self.name=x......
  • JMeter笔记9 | JMeter参数化
    (9|JMeter参数化)1测试对象我们使用禅道的创建用户接口,对创建用户的信息进行参数化;接口详情:2分析从接口看,我们需要参数化的有参数有account和password;其他的......
  • docker笔记
    docker架构图  docker常用命令#查看本地镜像dockerimages#拉取远程镜像到本地dockerpullalpine:3.15#运行镜像#将redis镜像端口6379映射到本机端口6379,后台......
  • Mastering Regular Expressions(精通正则表达式) 阅读笔记:前言
    GeneralConcept(一般概念)Ifyoumasterthegeneralconceptofregularexpressions,it'sashortsteptomasteringaparticularimplementation.如果你掌握了......
  • Prometheus Pushgateway配置笔记
    前言pushgateway的安装不再赘述,通用的操作最后以daemonlized方式运行。在Prometheus中给pushgateway上报的数据单独定义一个job:需要注意的点:pushgateway本身没有任何......