还需要加强分析题目特殊性质,设计对应特殊算法,少想多写大力dfs剪枝不要管MLETLE直接上的能力

红包是一个有艺术细胞的男孩子。

红包由于NOI惨挂心情不好,暑假作业又多,于是他开始在作业本上涂鸦。

一开始,他在纸上画了一棵 nn 个节点的树。但是他觉得这样的画太简单了,体现不出他高超的绘画功底,于是他又额外画上了 kk 条边。

然而他觉得这样画面太复杂,于是想删去一些边使得这个无向图仍然是连通的。

请帮红包求出删边的方案数。两个方案被认为是不同的当且仅当存在一条边在其中一组中被删而另一组中没有。(什么边都不删也算一种方案)

输入格式

第一行两个整数,n,kn,k。保证 1≤n≤105,k≥01≤n≤105,k≥0。

接下来 n−1n−1 行,描述了红包最开始画的那颗树。每行两个整数 v,uv,u 表示 vv 和 uu 之间有一条无向边。

接下来 kk 行,描述了红包后来加的边。每行两个整数 v,uv,u 表示红包在 vv 和 uu 之间又加上了一条边。数据保证树中原有的边不会被再添加一次且 v≠uv≠u。

保证 1≤v,u≤n1≤v,u≤n。

输出格式

一个整数,表示方案数。你只用输出答案对 998244353998244353(7×17×223+17×17×223+1,一个质数)取模后的值。


题目分析

关于离线维护动态图连通性有一种常见套路:处理出原图的一颗dfs树,再为每一条非树边随机分配一个权值,剩下的树边权值就是所有经过它的非树边权值异或和。那么选出的边集对原图连通性没有影响当且仅当该边集的权值两两线性无关。

之前做过一题的套路就是这样的:【思维题 集合hash 树上差分】11.5撸树

关于这个随机化算法的证明,网上找到两篇高质量的证明 “图不连通 iff 删掉边集的权值线性相关”,

  1. 杜教的Dzy loves Chinese证明
  2. bzoj3569 DZY Loves Chinese II 正确性证明

对于这题,首先注意到k不大,那么就不需要常规做法的双哈希pair,而是直接将第i条非树边权值设为$2^{i-1}$.这样一来就能够在保证正确性的前提下减少常数。第二,如何求一个集合的线性无关子集个数?注意到这里的线性无关子集大小与集合元素种类都是和k同阶的。然后就可以用 算法七 的暴力dfs寻找线性无关子集数量,而因为“线性无关”这道剪枝“十分有力”,所以uoj榜上这个做法吊打标算……

 #include<bits/stdc++.h>
#define MO 998244353
typedef unsigned long long ull;
const int maxn = ;
const int maxm = ; struct Edge
{
int v,id;
Edge(int a=, int b=):v(a),id(b) {}
}edges[maxm];
struct node
{
ull val,cnt;
}a[maxm];
struct LinearBasis
{
ull a[];
bool insert(ull x)
{
for (int i=,chk=; i>=&&!chk; i--)
if ((x>>i)&){
if (a[i]) x ^= a[i];
else a[i] = x, chk = true;
}
return x > ;
}
};
int n,k,m,cnt,u[],v[];
int edgeTot,head[maxn],nxt[maxm];
ull eval[maxm],enod[maxn];
long long ans; int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
void addedge(int u, int v, int id)
{
edges[++edgeTot] = Edge(v, id), nxt[edgeTot] = head[u], head[u] = edgeTot;
edges[++edgeTot] = Edge(u, id), nxt[edgeTot] = head[v], head[v] = edgeTot;
}
void color(int x, int fa)
{
for (int i=head[x]; i!=-; i=nxt[i])
{
int v = edges[i].v, id = edges[i].id;
if (v==fa) continue;
color(v, x), enod[x] = enod[x]^enod[v], eval[id] = enod[v];
}
}
void dfs(int x, LinearBasis s, int c)
{
if (x==cnt+) ans = (ans+c)%MO;
else{
dfs(x+, s, c);
if (s.insert(a[x].val))
dfs(x+, s, 1ll*c*a[x].cnt%MO);
}
}
int main()
{
memset(head, -, sizeof head);
n = read(), k = read();
for (int i=; i<n; i++)
addedge(read(), read(), i);
for (int i=; i<=k; i++)
u[i] = read(), v[i] = read(), eval[i+n-] = (ull)1ll<<i,
enod[u[i]] = enod[u[i]]^eval[i+n-], enod[v[i]] = enod[v[i]]^eval[i+n-];
color(, );
m = n+k-;
std::sort(eval+, eval+m+);
for (int i=,j=; i<=m; i=j)
if (eval[i]){
for (j=i; eval[j]==eval[i]&&j<=m; j++);
a[++cnt].val = eval[i], a[cnt].cnt = j-i;
}else ++j;
dfs(, LinearBasis(), );
printf("%lld\n",ans);
return ;
}

END

【线性基 集合hash】uoj#138. 【UER #3】开学前的涂鸦的更多相关文章

  1. UOJ #138. 【UER #3】开学前的涂鸦

    Description 红包是一个有艺术细胞的男孩子. 红包由于NOI惨挂心情不好,暑假作业又多,于是他开始在作业本上涂鸦. 一开始,他在纸上画了一棵 n 个节点的树.但是他觉得这样的画太简单了,体现 ...

  2. bzoj4568: [Scoi2016]幸运数字(LCA+线性基)

    4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...

  3. [CQOI2013]新Nim游戏(博弈论,线性基)

    [CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根 ...

  4. HDU - 3949 :XOR(线性基,所有集合的不同异或和中,求从小到大第K个)

    XOR is a kind of bit operator, we define that as follow: for two binary base number A and B, let C=A ...

  5. uoj#36. 【清华集训2014】玛里苟斯(线性基+概率期望)

    传送门 为啥在我看来完全不知道为什么的在大佬们看来全都是显然-- 考虑\(k=1\)的情况,如果序列中有某一个\(a_j\)的第\(i\)位为\(1\),那么\(x\)的第\(i\)位为\(1\)的概 ...

  6. UOJ #36 -【清华集训2014】玛里苟斯(线性基+暴搜)

    UOJ 题面传送门 看到 \(k\) 次方的期望可以很自然地想到利用低次方和维护高次方和的套路进行处理,不过.由于这里的 \(k\) 达到 \(5\),直接这么处理一来繁琐,二来会爆 long lon ...

  7. UOJ#36. 【清华集训2014】玛里苟斯 线性基

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ36.html 题解 按照 $k$ 分类讨论: k=1 : 我们考虑每一位的贡献.若有至少一个数第 $i$ ...

  8. BZOJ.3811.玛里苟斯(线性基)

    BZOJ UOJ 感觉网上大部分题解对我这种数学基础差的人来说十分不友好...(虽然理解后也觉得没有那么难) 结合两篇写的比较好的详细写一写.如果有错要指出啊QAQ https://blog.csdn ...

  9. Xor && 线性基练习

    #include <cstdio> #include <cstring> ; ; int cnt,Ans,b,x,n; inline int Max(int x,int y) ...

随机推荐

  1. Unraveling the JPEG file

    (文章还剩实践部分没写,答辩过后补上...) JPEG文件在当下数字化生活中是无处不在的,但是在熟悉的JPEG面纱背后,隐藏着一些算法,它们去除了人类眼中无法察觉到的细节.这产生了最高的视觉质量与最小 ...

  2. Jmeter4.0----CSV Data Set Config_对输入参数进行参数化(14)

    1.说明 测试接口时,当请求参数不是固定的,每次请求对应的参数都是不同的,就需要对请求参数进行参数化. 2.步骤 第一步:准备数据 (以报告编制人员为例)首先创建.txt文本,自己编辑要参数化的内容 ...

  3. mediawiki登录时第一次会跳回登录页面,第二次才能登录成功

    原因是:LocalSetting.php中的$wgServer属性使用的是ip,改为域名后成功解决问题 补充:改为域名后使用ip访问会出现第一次登录跳回登录界面的情况,应该根据实际情况来设置$wgSe ...

  4. 《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch

    前言 前面 FLink 的文章中我们已经介绍了说 Flink 已经有很多自带的 Connector. 1.<从0到1学习Flink>-- Data Source 介绍 2.<从0到1 ...

  5. mysql报错this is incompatible with sql_mode=only_full_group_by

    1.报错信息 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: In aggregated query without GROUP ...

  6. HTML5 有哪些不同类型的存储?

    HTML 5 支持本地存储,在之前版本中是通过 Cookie 实现的.HTML5 本地存储速度快而且安全. 有两种不同的对象可用来存储数据: localStorage 适用于长期存储数据,浏览器关闭后 ...

  7. 斗鱼扩展--拦截替换js_辅助抢宝箱(六)

    代码可以在 https://pan.baidu.com/s/1uN120-18hvAzELpJCQfbXA  处下载 说思路 页面加载一段时间后,判断页面有没有宝箱,如果没有就停止注入js,如果有则 ...

  8. 利用XML序列化和Asp.Net Web缓存实现站点配置文件

    我们经常会遇到这样的场景: 今天来了个业务,需要加一个字段,但是考虑的以后可能有变动,需要配成“活”的. 一般最初的做法就是加一个配置到Web.Config文件的AppSettings中去.但是这样有 ...

  9. java中方法体的作用

    java中抽象类中可以存在的抽象方法或接口中的方法不允许有方法体,但不属于方法体是空的.java.awt.event包中的适配器类中方法体是空的. 从语法中说,没有方法体必须是空的这一要求,只要是非抽 ...

  10. 从零开始的全栈工程师——js篇2.2

    条件语句 补充: var a=“hello world” a这个变量是字符串了 对于里面每一个字母来说 他是字节 里面有11个字节 字节总数用length表示 如下: 根据上面的内容咱们又发现了一个运 ...