您的位置:首页 > 其它

Acdream原创群赛3(部分题解)

2012-11-21 19:48 162 查看
比赛网址链接:http://www.acdream.net/contest.php?cid=1010

A题: 按位异或。讨论情况。

C题:经典广搜。先打表存储各个数的因子。

G题:可以说是规律题。常规方法nlogn肯定超时。

H题:简单的二分匹配。

I题:树形dfs。



题目大意:给你两个有同样多元素的集合,求一个最小的x,x异或A中所有元素的结果都落在B集合中,且形成一一映射。

解题思路:关键就在于一一映射,并且先把所有的数都转换成二进制  => A,B中元素每位对应的0和1计算出来。假设第1位, A有a0个0,a1个1,b有b1个1,b0个0,

如果a0==b0&&a1==b1 那么x对应的此位必为0,否则a0==b1&&a1==b0,x对应的此位必为1.

View Code

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

const int maxn=100005;
int  f[maxn];
vector<int>vt[maxn];
int n;

int dfs(int u, int fa)
{
f[u]=1;
for(int i=0; i<vt[u].size(); i++)
{
if(vt[u][i]==fa) continue;
f[u]+=dfs(vt[u][i],u);
}
return f[u];
}

int main()
{
int   u, v;
while(cin >> n)
{
for(int i=1; i<=n; i++)
vt[i].clear();
for(int i=0; i<n-1; i++)
{
scanf("%d%d",&u,&v);
vt[u].push_back(v);
vt[v].push_back(u);
}
dfs(1,1);
int ans=0;
for(int i=1; i<=n; i++)
{
if(f[i]%2==0) ans++;
}
cout << ans-1 <<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: