题目:http://codeforces.com/problemset/problem/391/E2    题意:有三棵树.每棵树有ni个结点,加入两条边把这三棵树连接起来,合并成一棵树.使得合并的树中随意两点之间的最短路径    的和最大. 分析:    三棵树要合并成一棵树,则第一棵树必须选择一个点,如果为X.第二棵树必须选择两个点,如果为Y1, Y2,第三棵树必须选择一个点,如果为Z    记第一棵树中全部结点到X的路径总和为:tot1    第二棵树中全部结点到Y1,Y2的路径总和分别为…
[清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出一个 N 行 M 列的矩阵A, 保证满足以下性质: M>N.    矩阵中每个数都是 [0,N] 中的自然数.    每行中, [1,N] 中每个自然数都恰好出现一次.这意味着每行中 0 恰好出现 M−N 次.    每列中,[1,N] 中每个自然数至多出现一次. 现在我们要在每行中选取一个非零数,…
#38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘以一个数的逆元: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 100005…
转载请注明出处:http://www.cnblogs.com/Delostik/p/3553114.html 目前已有[A B C D E] 例行吐槽:趴桌子上睡着了 [A. Genetic Engineering] http://codeforces.com/contest/391/problem/A 问最少插入几个字符,使得字符串不存在连续偶数个相同字母.不说什么 #include <iostream> #include <string> using namespace std…
传送门:http://codeforces.com/problemset/problem/686/D 题意:给你n个节点,其中1为根, 第二行给你2~n的节点的父亲节点编号. 然后是q个询问,求询问的节点为根的重心的节点编号. 思路:利用树的重心的一个性质:树的重心在 根节点 和 根节点的最大子结点的重心 之间.并且2*cnt[v]>cnt[u](u为根节点,v为重心). 代码: #include<iostream> #include<vector> using namesp…
题意: 给你01字符串的长度再给你一个串. 然后你可以在这个串中选择一个起点和一个终点使得这个连续区间内所有的位取反. 求: 经过处理后最多会得到多少次01变换. 例如:0101是4次,0001是2次,000110是3次. 分析: 区间内部的数目是不会发生变化的,因为每一位都是按位取反,相当于都没变,唯一发生变化的是区间边缘,所以考虑到连续的两个或多个1或者0的时候在其中某处设置断点会使得变换次数增加,很容易理解当某处有两个连续点的时候变换次数增加1,因为一个区间只有两个端点所以变换次数最多增加…
题意: 给你n个点和n-1条边组成的一棵树,按顺序给出数的每一条边. 询问m次,每次给出一个x求x除以从点a到点b所有边的权值和的乘积,还有修改,给出边的编号,修改某条边的权值. 思路: 树链剖分,用点的编号建立线段树,当然一开始要记录第几条边的两个端点各是什么,便于修改的时候进行查询. 重点是用深度较大的那个点记录两个点之间的权值. 查询的时候当两者重链的top相等的时候注意去掉top点的权值. 然后这道题每条边的权值都是在10^18以内,所以如果线段树某个元素代表的权值之乘积大于1e18的话…
蒟蒻第二篇题解... 比赛的时候写这道题MLE了qwq..根据CF的赛制我也没敢再交第二次.. 简单讲一下思路好了(假装是dalao)..根据题意要加一个或者不加新的点..如果加一个新的点意味着从这个点往后的时间里状态都会反转(亮->灭&&灭->亮)..则加入点后的亮灯时间=(点后总时间-点后原本亮灯时间)..根据三个样例不难发现加的点位置在原有点的两侧并且两侧位置等价(这一点感性理解一下就好)..然后就要在加点的时候判断一下已有点两侧是否能加点(一开始没看m最大1e9..用v…
题意: 只有一个环,然后环都是0(环缩点相当于树的根),然后其余的输出到根的距离 思路: 可以从度为1的 开始搜 把那些分支全标记掉,然后再取没有标记掉的,BFS一下搞出距离. 具体这个标记: 倒着搜这样肯定没有多对一,标记掉度等于2的那些点就好了,度>2的要减减,而且环里的点的度不可能搜到度 = 2 因为环=点的度为2,他又连出一条边 度=3. 后话: 这种n个点 n条边/n-1条边的题都是套路了,要仔细考虑图特性:点的度(出度,入度),怎么搜(顺着搜,倒着搜,BFS好写还是DFS好写) 但是…
哇塞?开始的三个数其中两个数一定能确定一个序列.(鸽巢原理) #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=3e4+10; int a[N],n; bool vis[N]; void print(vector<int>v) { int sz = v.size(); for(int i=0; i<sz; i++) printf("%d ",v[i…