图论/位运算 Codeforces Round #285 (Div. 2) C. Misha and Forest

题目传送门

 1 /*
 2     题意:给出无向无环图,每一个点的度数和相邻点的异或和(a^b^c^....)
 3     图论/位运算:其实这题很简单。类似拓扑排序,先把度数为1的先入对,每一次少一个度数
 4                 关键在于更新异或和,精髓:a ^ b = c -> a ^ c = b, b ^ c = a;
 5 */
 6 #include <cstdio>
 7 #include <cstring>
 8 #include <cmath>
 9 #include <algorithm>
10 #include <queue>
11 using namespace std;
12
13 const int MAXN = 7e4 + 10;
14 const int INF = 0x3f3f3f3f;
15 int ans[MAXN][2];
16 int d[MAXN], s[MAXN];
17
18 int main(void)        //Codeforces Round #285 (Div. 2) C. Misha and Forest
19 {
20     // freopen ("C.in", "r", stdin);
21
22     int n;
23     while (scanf ("%d", &n) == 1)
24     {
25         queue<int> Q;
26         for (int i=0; i<n; ++i)
27         {
28             scanf ("%d%d", &d[i], &s[i]);
29             if (d[i] == 1)    Q.push (i);
30         }
31
32         int cnt = 0;
33         while (!Q.empty ())
34         {
35             int u = Q.front ();    Q.pop ();
36             if (d[u] == 0)    continue;
37             int v = s[u];
38             ans[++cnt][0] = u;    ans[cnt][1] = v;
39             if ((--d[v]) == 1)    Q.push (v);
40             s[v] = s[v] ^ u;
41         }
42
43         printf ("%d\n", cnt);
44         for (int i=1; i<=cnt; ++i)
45         {
46             printf ("%d %d\n", ans[i][0], ans[i][1]);
47         }
48     }
49
50     return 0;
51 }
时间: 2024-10-11 05:11:17

图论/位运算 Codeforces Round #285 (Div. 2) C. Misha and Forest的相关文章

Codeforces Round #285 (Div. 2) C - Misha and Forest

思路:类似一个拓扑排序的题,根据 对度数为1的点,它所连的边的编号即为异或和这一 规律,直接进行拓扑排序即可. 每次对得到的节点度数减一,并且异或上他所连的节点. 代码: #include<cstdio> #include<cstring> #include<iostream> #include<vector> #include<algorithm> #include<queue> using namespace std; typed

字符串处理 Codeforces Round #285 (Div. 2) B. Misha and Changing Handles

题目传送门 1 /* 2 题意:给出一系列名字变化,问最后初始的名字变成了什么 3 字符串处理:每一次输入到之前的找相印的名字,若没有,则是初始的,pos[m] 数组记录初始位置 4 在每一次更新时都把初始pos加上去,那么就保证更新了初始的名字,这也是唯一要思考的地方了:) 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <cstring> 9 #include <algorithm> 1

CodeForces Round #285 Div.2

C.Misha and Forest (图论 BFS) 比赛进行了一半才想起来有场CF没打,=_=|| 前两道题快速切掉,C题一直卡没什么好的思路 憋了几天,忍不住偷偷瞄了一下别人AC的代码,发现我题没看清题目,题中说了给出的图是森林. 于是切入点找到了! 题意: 一个由n个节点构成的森林,编号从0到n-1,给出每个节点的 度数 和 相邻节点编号的异或和,输出图中的边数和所有邻接节点的编号. 分析: 因为是森林,所以图中的叶子节点就是突破口.叶子节点最明显的特征就是: 度数为1 它相邻节点编号的

Codeforces Round #285 (Div. 2) ABCD

A题 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 7 using namespace std; 8 9 #define LL long long 10 #define eps 1e-8 11 #define inf 0x3f3f3f3f 12 #define mnx 100010

Codeforces Round #285 (Div.1 B &amp; Div.2 D) Misha and Permutations Summation --二分+树状数组

题意:给出两个排列,求出每个排列在全排列的排行,相加,模上n!(全排列个数)得出一个数k,求出排行为k的排列. 解法:首先要得出定位方法,即知道某个排列是第几个排列.比如 (0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0). 拿排列(1,2,0)来说,首位是1,前面有cnt=1个小于1的没被用过的数(0),所以它的排行要加上(cnt=1)*2!,第二位为2,因为1已经放了,所以小于2的只有0了,即cnt=1个,所以,排

Codeforces Round #285 (Div. 2) (A、B、C、D)

A:就根据题意计算比较一下即可 B:从每个起点往后走一遍走到底,输出即可,字符串直接map映射掉 C:类似拓扑排序,从临接个数为1的入队,那么临接Xor和,其实就是他的上一个结点,因为他只临接了一个结点,这样利用拓扑排序,当一个结点的度数为1的时候入队即可,注意要判断一下度数0的情况,直接continue D:利用树状数组去求这种大的全排列数,其实一个全排列 ,可以看成a1 * (n - 1)! + a2 * (n - 2)!....,那么其实只要处理出每一项的系数,然后在由系数就可以求出变换后

codeforces #285 div.2 C. Misha and Forest

题目链接:    http://codeforces.com/contest/501/problem/C 题意:    给出图的每个顶点的度数和相邻顶点的异或值的和,求出这个图的边的情况和边的数目: 分析:   找出度为一的点,其所对应的异或值即为与之相邻的顶点(<- ^ ->),再将与之相邻顶点的度数减一: **********代码: #include<iostream> #include<cstdio> #include<cstring> #includ

【树链剖分】【dfs序】【LCA】【分类讨论】Codeforces Round #425 (Div. 2) D. Misha, Grisha and Underground

一棵树,q次询问,每次给你三个点a b c,让你把它们选做s f t,问你把s到f +1后,询问f到t的和,然后可能的最大值是多少. 最无脑的想法是链剖线段树--但是会TLE. LCT一样无脑,但是少一个log,可以过. 正解是分类讨论, 如果t不在lca(s,f)的子树内,答案是dis(lca(s,f),f). 如果t在lca(s,f)的子树内,并且dep(lca(s,t))>dep(lca(f,t)),答案是dis(lca(s,t),f): 否则答案是dis(lca(f,t),f). #in

Codeforces Round #425 (Div. 2) D. Misha, Grisha and Underground

题意:给出 一颗树,然后q个询问,每个询问给出3个点,让我们自己选择一个起点一个终点,这条路线上的点标记,问第三个点到终点的最多标记点是多少 思路:第三个点到终点的标记点,肯定是第三个点与起点的最近公共祖先到终点的标记点.我们可以求出三个点的的三种最近公共祖先,取深度最大的点K,然后求K到三个点的距离+1 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10; 4 5 const int DEG=17; 6