CDOJ 1284 苦恼的郭大侠 map启发式合并
苦恼的郭大侠
题目连接:
http://acm.uestc.edu.cn/#/problem/show/1284
Description
花开雷霆崖,血染伊吕波。
公元1772年。
郭大侠终于照着天行廖的叮嘱,摆出了阵型,准备带着部队与天行廖相逢于雷霆崖。
但郭大侠实在是没有把握,这个阵型是真的如天行廖所言,所向披靡,于是准备在于天行廖相逢前再确认一遍。
按照天行廖的叮嘱说,这个阵型得满足以下两个要求才能发挥最大威力:
1.这个阵型是一颗树,即n个点,n-1条边,任意两点之间都能互相到达。
2.这个阵型满足好朋友的对数大于n对,好朋友即满足P(u,v)=0,P(u,v)表示从u点到v点的简单路径上点编号的异或和。注意P(u,v)和P(v,u)视作一样,只计数一次。
郭大侠的士兵的的确确摆出了一颗树,但是点数太多了,很难统计好朋友的对数。
这可怎么办?
现在郭大侠找到了你,希望你能帮助憔悴的郭大侠解决这个问题,希望你能够数出这棵树上究竟有多少对好朋友。
Input
第一行n,表示点的数量,(1<=n<=100000)
接下来n-1行,每行两个整数u,v,表示点u与点v之间连有一条边(1<=u,v<=n)
保证是一棵树
Output
输出这棵树上究竟有多少对好朋友。
Sample Input
17
9 8
9 11
9 13
9 15
9 16
11 10
13 12
15 14
16 17
8 1
1 5
5 4
4 6
6 7
7 2
2 3
Sample Output
18
Hint
题意
题解:
map启发式合并就好了
对于每个点暴力统计答案就好了
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+7;
vector<int> E[maxn];
map<int,int> H[maxn];
int pre[maxn];
long long ans = 0;
void uni(int x,int y)
{
if(H[x].size()<H[y].size())
swap(H[x],H[y]);
map<int,int>::iterator it;
while(H[y].size())
{
it=H[y].begin();
H[x][it->first]+=it->second;
H[y].erase(it);
}
}
void dfs(int x,int fa,int val)
{
H[x][val]++;
for(int i=0;i<E[x].size();i++)
{
int v = E[x][i];
if(v == fa)continue;
dfs(v,x,val^v);
for(auto a:H[v])
{
int t = a.first^x;
if(H[x].count(t))
ans+=1ll*H[x][t]*a.second;
}
uni(x,v);
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int x,y;scanf("%d%d",&x,&y);
E[x].push_back(y);
E[y].push_back(x);
}
dfs(1,0,1);
cout<<ans<<endl;
}
CDOJ 1284 苦恼的郭大侠 map启发式合并的更多相关文章
- CSU 1811: Tree Intersection(线段树启发式合并||map启发式合并)
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1811 题意:给出一棵树,每一个结点有一个颜色,然后依次删除树边,问每次删除树边之后,分开的两个 ...
- Codeforces 1455G - Forbidden Value(map 启发式合并+DP)
Codeforces 题面传送门 & 洛谷题面传送门 首先这个 if 与 end 配对的结构显然形成一个树形结构,考虑把这棵树建出来,于是这个程序的结构就变为,对树进行一遍 DFS,到达某个节 ...
- cdoj 1334 郭大侠与Rabi-Ribi Label:贪心+数据结构
郭大侠与Rabi-Ribi Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 最近 ...
- cdoj 1342 郭大侠与甲铁城 树状数组+离线
郭大侠与甲铁城 Time Limit: 1500/800MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit St ...
- cdoj 1334 郭大侠与Rabi-Ribi 贪心+数据结构
郭大侠与Rabi-Ribi Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Su ...
- cdoj1342郭大侠与甲铁城
地址:http://acm.uestc.edu.cn/#/problem/show/1342 题目: 郭大侠与甲铁城 Time Limit: 1500/800MS (Java/Others) ...
- cdoj1339郭大侠与线上游戏
地址:http://acm.uestc.edu.cn/#/problem/show/1339 题目: 郭大侠与线上游戏 Time Limit: 6000/2000MS (Java/Others) ...
- cdoj1338郭大侠与英雄学院
地址:http://acm.uestc.edu.cn/#/problem/show/1338 思路: 郭大侠与英雄学院 Time Limit: 6000/2000MS (Java/Others) ...
- cdoj1337郭大侠与阴阳家
地址:http://acm.uestc.edu.cn/#/problem/show/1337 思路: 郭大侠与阴阳家 Time Limit: 3000/4000MS (Java/Others) ...
随机推荐
- Django【进阶】分页功能Pagination
项目中,我们需要很多非业务逻辑的功能,例如分页功能,而且此类功能移植性很好,可以在不同的项目中使用,所以整理好这些功能会一定程度上提高开发效率,下面是分页功能代码,使用时,可单独放在utils目录 & ...
- vue路由-基础
安装 1.直接下载 / CDN https://unpkg.com/vue-router/dist/vue-router.js 在 Vue 后面加载 vue-router,它会自动安装的: <s ...
- 微信支付:curl 出错,错误码: 60
在测试微信支付 - 模式二 - 扫码支付时,遇到如下错误: curl出错,错误码:60 这是因为在 WxPay.Api.php 文件中做了严格的 ssl 证书校验: curl_setopt($ch,C ...
- python基础===时间处理模块
时间模块 Python中有很多方便我们处理时间信息的模块 time 模块 datetime 模块 pytz 模块 dateutil 模块 这里我们着重介绍的是前两种 time模块 time.time( ...
- UIResponder简介
1.简介 在使用设备的时候我们大多时候是但手指触摸控件了进行的,比如点击密码按钮解锁,上下浏览网页等动作.你肯定也摇动过iphone抢红包和***等等,我们的系统可以处理这些事件则都需要去使用UIRe ...
- 调用微信JS-SDK接口上传图片
最近要在微信上做个问卷调查,有个上传图片功能,折腾找了半天资料,都不好弄,最终打算调用微信提供的上传图片接口,实现上传图片功能!此功能最大的好处是可以在微信服务器上暂存图片,减少本地服务器图片的缓存, ...
- 通过第三方组件NPOI读取Excel的方法
public class ExcelHelper { public class x2003 { #region Excel2003 /// <summary> /// 将Excel文件中的 ...
- hdu 1533(最小费用最大流)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- 基础平台为第三方应用接入提供oauth2认证接口
oauth2开放认证协议原理及案例分析 http://blog.csdn.net/volcan1987/article/details/7287605 谈谈基于OAuth 2.0的第三方认证 [上篇] ...
- 前端获得session信息方式对比,优化
在开发中,页面 js 经常会遇到需要 当前登录用户信息(菜单权限,用户基本信息,配置信息) 的地方,一般情况我们可能对这些信息获取方式不是太在意,但是现在的前端通过webpack打包,即使做了代码分割 ...