【线性基】bzoj2322: [BeiJing2011]梦想封印
线性基的思维题+图常见套路
Description
渐渐地,Magic Land上的人们对那座岛屿上的各种现象有了深入的了解。
为了分析一种奇特的称为梦想封印(Fantasy Seal)的特技,需要引入如下的概念:
每一位魔法的使用者都有一个“魔法脉络”,它决定了可以使用的魔法的种类。
一般地,一个“魔法脉络”可以看作一个无向图,有N个结点及M条边,将结点编号为1~N,其中有一个结点是特殊的,称为核心(Kernel),记作1号结点。每一条边有一个固有(即生成之后再也不会发生变化的)权值,是一个不超过U的自然数。
每一次魔法驱动,可看作是由核心(Kernel)出发的一条有限长的道路(Walk),可以经过一条边多次,所驱动的魔法类型由以下方式给出:
将经过的每一条边的权值异或(xor)起来,得到s。
如果s是0,则驱动失败,否则将驱动编号为s的魔法(每一个正整数编号对应了唯一一个魔法)。
需要注意的是,如果经过了一条边多次,则每一次都要计入s中。
这样,魔法脉络决定了可使用魔法的类型,当然,由于魔法与其编号之间的关系尚未得到很好的认知,此时人们仅仅关注可使用魔法的种类数。
梦想封印可以看作是对“魔法脉络”的破坏:
该特技作用的结果是,“魔法脉络”中的一些边逐次地消失。
我们记总共消失了Q条边,按顺序依次为Dis1、Dis2、……、DisQ。
给定了以上信息,你要计算的是梦想封印作用过程中的效果,这可以用Q+1个自然数来描述:
Ans0为初始时可以使用魔法的数量。
Ans1为Dis1被破坏(即边被删去)后可以使用魔法的数量。
Ans2为Dis1及Dis2均被破坏后可使用魔法的数量。
……
AnsQ为Dis1、Dis2、……、DisQ全部被破坏后可以使用魔法的数量。
Input
第一行包含三个正整数N、M、Q。
接下来的M行,每行包含3个整数,Ai、Bi、Wi,表示一条权为Wi的与结点Ai、Bi关联的无向边,其中Wi是不超过U的自然数。
接下来Q行,每行一个整数:Disi。
Output
一共包Q+1行,依次为Ans0、Ans1、……、AnsQ。
HINT
【数据规模和约定】
所有数据保证该无向图不含重边、自环。
所有数据保证不会有一条边被删除多次,即对于不同i和j,有Disi≠Disj
30%的数据中N ≤ 50,M ≤ 50,Q ≤50,U≤100;
60%的数据中N ≤ 300,M ≤ 300,Q ≤50,U≤10^9;
80%的数据中N ≤ 300,M ≤ 5000,Q ≤5000,U≤10^18;
100%的数据中N ≤ 5000,M ≤ 20000,Q ≤20000,U≤10^18;
题目分析
这里线性基图上的问题和2115Xor一样,处理的技巧是把图做成dfs树和非树边。
题目所求的问题即:在一个无向图中,求以1为起点的非简单路径的种类数。
那么和上一题一样, $所有的非简单路径$ 等价于 $一条简单路径$ + $若干个环$。而我们遇到的最主要问题在于,现在有两条路径,而它们各自和一些环异或之后,可能会存在结果相同的情况。整一个问题的瓶颈正是在于这一部分的去重。

这里有一种巧妙的技巧,借鉴了最小表示的思想。
首先应该意识到,路径$A$和$B$如果存在各自异或$a$,$b$后数值相等的情况(即A xor a = B xor b),那么路径A,B实质上是等价的,因为它们的其他任何情况也必定是会相等的。
注意到线性基的性质:$(一条路径)异或(若干环)形成的值域集合$=$(一条路径先异或若干环)异或(若干环)形成的值域集合$(这里说得严谨一些就是张成相等)。那么,对于路径$A$,$B$,可以先用线性基内的环将它们“最小表示”一下,于是就保证了加进来的路径“本质不同”。
一个槽点:原数据如果不将$v[]$(存环的数组)从大到小排序,而直接按照插入顺序来“最小表示”,也能通过此题。
#include<bits/stdc++.h>
typedef long long ll;
const int maxn = ;
const int maxm = ;
const int maxq = ; struct Edge
{
int u,v;
ll val;
Edge(int a=, int b=, ll c=):u(a),v(b),val(c) {}
}edges[maxm],etmp[maxm];
int n,m,q,del[maxq];
int edgeTot,head[maxn],nxt[maxm];
ll dis[maxn],p[],ans[maxq],tmp;
bool tag[maxm];
std::set<ll> s;
std::set<ll>::iterator it; ll read()
{
char ch = getchar();
ll 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, ll c)
{
edges[++edgeTot] = Edge(u, v, c), nxt[edgeTot] = head[u], head[u] = edgeTot;
edges[++edgeTot] = Edge(v, u, c), nxt[edgeTot] = head[v], head[v] = edgeTot;
}
ll calc(ll c)
{
for (int i=; i<=p[]; i++)
if ((c^p[i]) < c) c ^= p[i];
return c;
}
void update(ll c)
{
if (!c) return;
for (it=s.begin(); it!=s.end(); it=s.upper_bound(tmp))
{
tmp = *it;
if ((tmp^c) < tmp)
s.erase(it), s.insert(tmp^c);
}
p[++p[]] = c;
for (int j=p[]; j>=; j--)
if (p[j] > p[j-]) std::swap(p[j], p[j-]);
else break;
}
void dfs(int x, int fa, ll c)
{
dis[x] = c, tmp = calc(c);
if (tmp&&(s.count(tmp)==)) s.insert(tmp);
for (int i=head[x]; i!=-; i=nxt[i])
{
int v = edges[i].v;
if (v!=fa){
if (dis[v]==-) dfs(v, x, c^edges[i].val);
else update(calc(dis[v]^c^edges[i].val));
}
}
}
void connect(int u, int v, ll c)
{
addedge(u, v, c);
if (dis[u]!=-&&dis[v]!=-) update(calc(dis[u]^dis[v]^c));
else{
if (dis[u]==-&&dis[v]==-) return;
if (dis[u]==-) dfs(u, v, dis[v]^c);
else dfs(v, u, dis[u]^c);
}
}
int main()
{
memset(dis, -, sizeof dis);
memset(head, -, sizeof head);
n = read(), m = read(), q = read(), dis[] = , s.insert();
for (int i=; i<=m; i++)
etmp[i].u = read(), etmp[i].v = read(), etmp[i].val = read();
for (int i=; i<=q; i++) del[i] = read(), tag[del[i]] = ;
for (int i=; i<=m; i++)
if (!tag[i]) connect(etmp[i].u, etmp[i].v, etmp[i].val);
ans[q+] = s.size()*(1ll<<p[])-;
for (int i=q; i; i--)
{
connect(etmp[del[i]].u, etmp[del[i]].v, etmp[del[i]].val);
ans[i] = s.size()*(1ll<<p[])-;
}
for (int i=; i<=q+; i++) printf("%lld\n",ans[i]);
return ;
}
/*
8 10 0
8 4 5
4 5 9
7 1 5
1 4 9
2 8 1
6 5 5
8 3 6
7 4 7
7 3 6
1 3 3
*/
END
【线性基】bzoj2322: [BeiJing2011]梦想封印的更多相关文章
- BZOJ2322 [BeiJing2011]梦想封印 【set + 线性基】
题目链接 BZOJ2322 题解 鉴于BZOJ2115,要完成此题,就简单得多了 对图做一遍\(dfs\),形成\(dfs\)树,从根到每个点的路径形成一个权值,而每个返祖边形成一个环 我们从根出发去 ...
- BZOJ2322: [BeiJing2011]梦想封印
Description 渐渐地,Magic Land上的人们对那座岛屿上的各种现象有了深入的了解. 为了分析一种奇特的称为梦想封印(Fantasy Seal)的特技,需要引入如下的概念: 每一位魔法的 ...
- 【BZOJ2322】[BeiJing2011]梦想封印 高斯消元求线性基+DFS+set
[BZOJ2322][BeiJing2011]梦想封印 Description 渐渐地,Magic Land上的人们对那座岛屿上的各种现象有了深入的了解. 为了分析一种奇特的称为梦想封印(Fantas ...
- [BZOJ 2322][BeiJing2011]梦想封印
梦想封印 题意 原题面: Problem 2322. -- [BeiJing2011]梦想封印 2322: [BeiJing2011]梦想封印 Time Limit: 20 Sec Memory L ...
- 【BZOJ 2322】[BeiJing2011]梦想封印 利用"环基"+线性基特征值
很容易想到离线加边并且把环和链拆开搞(就是对于每个终点求出起点到他的路径(其实就是dfs树),然后bzoj2115),而且维护也很简单,然而我们发现不同的终点可能得到相同的值,这就是我们遇到的最大的问 ...
- BZOJ_2460_[BeiJing2011]元素_线性基
BZOJ_2460_[BeiJing2011]元素_线性基 Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔 法矿石炼制法杖的技术.那时人们就认识 ...
- [BeiJing2011]元素[贪心+线性基]
2460: [BeiJing2011]元素 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1245 Solved: 652[Submit][Stat ...
- BZOJ2460 [BeiJing2011]元素 【线性基】
2460: [BeiJing2011]元素 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1675 Solved: 869 [Submit][St ...
- 【BZOJ2460】[BeiJing2011]元素 贪心+高斯消元求线性基
[BZOJ2460][BeiJing2011]元素 Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法 ...
随机推荐
- 分布式集群环境下,如何实现session共享一(应用场景)
在web应用中,由于http的请求响应式,无状态.要记录用户相关的状态信息,比如电商网站的购物车,比如用户是否登录等,都需要使用session.我们知道session是由servlet容器创建和管理, ...
- CC08:翻转子串
题目 假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串.请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数. 给 ...
- (转)sudo配置文件/etc/sudoers详解及实战用法
sudo配置文件/etc/sudoers详解及实战用法 原文:http://blog.csdn.net/field_yang/article/details/51547804 一.sudo执行命令的流 ...
- 《java学习三》jvm性能优化------jconsul
利用jconsul检测线程死锁, 死锁的线程,会有 已锁定 三个字 visualVm 也在jdk里 VisualVM 是一款免费的,集成了多 ...
- 渣渣菜鸡的 ElasticSearch 源码解析 —— 环境搭建
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/25/es-code01/ 软件环境 1.Intellij Idea:2018.2版本 2. ...
- 啊哈算法之巧用队列解密QQ号
简述 本算法摘选自啊哈磊所著的<啊哈!算法>第二章第一节的题目——使用队列来解密举例中按照规则加密的QQ号.文中代码使用C语言编写,博主通过阅读和理解,重新由Java代码实现了一遍,意在深 ...
- w3c万维网的介绍和html基本构成
怎么与浏览器交互? 1.鼠标 2.键盘输入 w3c标准: 中文名:万维网联盟!外文名:world wide web cansortium万维网联盟创建于1994年,是web技术领域最具权威个影响的国际 ...
- form-data、x-www-form-urlencoded、raw、binary的区别
1.form-data: 就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件.当上传的字段是文件时 ...
- CF1157D N Problems During K Days
思路: 在1, 2, 3, ... , k的基础上贪心构造. 实现: #include <bits/stdc++.h> using namespace std; typedef long ...
- All boundaries are conventions, waiting to be transcended.
All boundaries are conventions, waiting to be transcended.所有界限都是陈规,等着被打破.