Colin's blog

A football fan,an English lover and a coder


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

Karen and Test

发表于 2017-06-20   |   分类于 acm
原题:Karen and Test 原题大意n个正整数排成一行,每相邻两个数进行加或减操作:第一第二个数相加,第二第三个数相减,第三第四个数相加,第四第五个数相减……,得到的结果排成第二行,然后继续这样的操作,并且初始的前两个数是加还是减,与上一行最后两个数的操作符相反,问最后得到的结果是多少? 算法分析考虑最简版本每个ai对最终式子的贡献,可以令ai的系数为1,其余为0,类似0,0,0…1…0,0,0,同时暂且不考虑减法,可以得出每个ai的贡献为C(n-1,k-1) ,然后通过下面这个过程,可以看出最终的式子,是两个奇偶序列和(最简版本),相加或做差得到的,n mod 4 = 2时相加,n mod 4 = 0时做差。(如果n是奇数,那么先暴力进行第一次变换使得n成为偶数) 程序代码#include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; const ll mod = 1e9+7; const ll maxn = 200 ...
阅读全文 »

Scheme

发表于 2017-06-19   |   分类于 acm
原题:Scheme 原题大意给出n个节点,以及和这个节点指向的节点fi,表示从i能够到达fi,问至少需要添加多少条边能够使得原图变为强连通分量,输出边数及添加的边,多解输出任意一组解。 算法分析每个点的出度都是1,可以知道这个图的每个弱连通分量(取消定向后的连通块)都是一个有向环上挂很多棵有向树,如果只有一个弱连通分量,显然就是环上随便找一个点然后向所有入度为0的点连边,否则先考虑将所有分量连起来,假设有t个分量,对这些分量从0到t-1标号,对于第i个分量,如果第(i+1)%t个分量有入度为0的点,那么从第i个分量的环上任取一个点向第(i+1)%t个分量的任意一个入度为0的点连边,否则连到环上任意一个点,现在所有分量已经连成了一个分量,并且最小化了入度为0的点,接下来只需要任取一个环上的点向所有入度为0的点连边即可。 程序代码#include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; const int maxn = 1 ...
阅读全文 »

Chef and Pairs

发表于 2017-06-17   |   分类于 acm
原题:Chef and Pairs 原题大意定义一个函数maxMatching(A,B,y),其输入包含两个整数数组 A 和 B 以及一个整数 y,返回一个整数。记数组 A 的大小为 N,数组 B 的大小为 M。考虑一个由 {a1, a2, … , aN } 和 {b1, b2, … , bM}两个顶点集构成的二分图。节点 ai 和 bj 之间存在边相连当且仅当 abs(Ai - Bj ) <= y。函数maxMatching(A,B,y)便返回这个这个二分图的最大匹配。现在给你两个整数数组 C 和 D 和一个整数 e,请你输出下面这段程序的运行结果: ans = maxMatching(C, D, e)FOR x = -2e9..2e9 FOR i = 1..N F[i] = C[i] + xans = max(ans, maxMatching(F, D, e))output ans 算法分析先看看哪些X是有用的,即有用的事件点有哪些。对于c[i], d[j],可以用的事件点只有两个,通过计算可得。然后把事件点排序,发现每个c能匹配的d是一段不断往下移的区间。因此可 ...
阅读全文 »

Black Nodes in Subgraphs

发表于 2017-06-17   |   分类于 acm
原题:Black Nodes in Subgraphs 原题大意给你一棵由 N 个节点构成的树 T。节点按照 1 到 N 编号,每个节点要么是白色,要么是黑色。有 Q 组询问,每组询问形如 (s, b)。你需要检查是否存在一个连通子图,其大小恰好是 s,并且包含恰好 b 个黑色节点。 输入输入第一行,包含一个整数 T,表示测试数据组数。对于每组测试数据:第一行包含两个整数 N 和 Q,分别表示树的节点个数和询问个数。接下来 N - 1 行,每行包含两个整数 ui 和 vi,表示在树中 ui 和 vi 之间存在一条边。接下来一行包含 N 个整数,c1, c2, … , cN。如果 ci 为 0 表示第 i 个节点是白色的,如果 ci 为1 表示第 i 个节点是黑色的。接下来 Q 行,每行包含两个整数 si 和 bi,表示一组形如 (si, bi) 的询问。对于每组询问输出一行字符串表示答案,其中 Yes 表示存在一个符合要求的连通子图,No 表示不存在。1 <= T <= 5, 2 <= N <= 5e3, 1 <= Q <= 1e5, 1 <= ...
阅读全文 »

Pinary

发表于 2017-06-10   |   分类于 acm
原题:Pinary 1350 原题大意Pinary数是一个仅由0和1组成的数,这个数不存在前导0,且相邻位置不能同时为1.Pinary数的大小由长度和字典序决定,长度不同时,长度越小值越小,长度相同时,字典序越小值越小。例如1是1,10是2,100,101,1000分别为3,4,5。现在给出一个K,问这个数的Pinary表示形式是什么。 算法分析先打表solve(1) = 1;sovle(10) = 2;solve(100) = 3;solve(1000) = 5;solve(10000) = 8;于是这个问题,就转换成了,将一个数字,拆成不连续的fib的若干项之和。@Zeckendorf 齐肯多夫定理。 程序代码#include <iostream> #include <vector> using namespace std; typedef long long LL; int T, n, ans[102]; LL fib[102]; void init() { fib[1] = 1, fib[2] = 2; for(int i=3;i< ...
阅读全文 »
1…678…23
Shen Hao

Shen Hao

Colin's blog | acm |c++

114 日志
6 分类
71 标签
GitHub
© 2017 Shen Hao
由 Hexo 强力驱动
主题 - NexT.Muse