
ACM算法(题解):
FeBr2
(๑•̀ㅂ•́)و✧
展开
-
并查集
并查集原创 2016-04-28 00:58:08 · 411 阅读 · 0 评论 -
欧拉函数——找新朋友(HDU 1286)
欧拉函数(Euler’s totient function、φ函数、欧拉商数)定义:在数论中,对正整数n,欧拉函数是小于等于n的数中与n互质的数的数目。通式: φ(N)=N*(1-1/P1)(1-1/P2)…*(1-1/Pn). (其中x为非零整数,p1,p1…pn为对于一个正整数N的素数幂分解N=P1^q1*P2^q2*…*Pn^qn. )性质:欧拉函数是积性函数——若m,n互质, φ(mn原创 2016-07-13 10:05:03 · 601 阅读 · 0 评论 -
线段树(区间最大值查询和点修改)——I Hate It ( HDU 1754 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1754分析&&题解:直接套模板即可,需要注意的是得用C输入。(T^T,C++输入直接T超3000,C输入瞬间800+,非人哉)1.线段树标准预处理:#define lc (d<<1)#define rc (d<<1|1)#define mid ( l+r >>1)2.建树:const int原创 2016-07-23 14:23:08 · 427 阅读 · 0 评论 -
字典树(+DFS)——Watto and Mechanism ( CodeForces 514C )
题目链接: http://codeforces.com/contest/514/problem/C分析: 题目是先给出n个字符串和m个字符串,对于m个字符串中每一个字符串都可以在n个字符串中找到一个与之匹配(允许由一位字符的差异,但不允许超出或少于)。一看题目,就能想到是用n 个字符串建树,然后再搜索。题解: 比较难写的是这个DFS函数,先讨论字符串有没有到底,到底后无错误并且之后没有节点原创 2016-07-17 11:00:37 · 720 阅读 · 1 评论 -
字典树——统计难题 ( HDU 1251 )
字典树:定义: 字典树(Trie树)是一种树形数据结构,其作用是存储多个字符串,并可以自动按照字典序排好。该算法的时间复杂度为O(n),空间复杂度为O(nk),其中n为所有字符串的和,k为所有可能出现的字符的个数。实现方法: 树上的每个节点代表了一个字符串,每个节点最多有k个孩子,第k个孩子代表的字符串为原结点的字符串后接上第k个字符构成。Node结点代码:struct node{原创 2016-07-15 16:40:10 · 599 阅读 · 0 评论 -
Kmp找字符串循环节——Period ( POJ 1961 )
题目链接: http://poj.org/problem?id=1961分析: 给出一个字符串长度为N,从左变开始取2~N个字符出来构成一个新字符串,若新字符串能被一个最短的循环节构成则输出新字符串的长度和循环节循环次数。题解: 直接用Kmp里的SetNext()函数,求出该字符串里每一个字符的重复位置,用2~N长度减去以该长度为下标对应Next数组里的值即重复位置得到该两个重复出现字符间原创 2016-07-15 15:09:46 · 4078 阅读 · 0 评论 -
多重背包——(HDU-2191)
题意:为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买。请问:你用有限的资金最多能采购多少公斤粮食呢?Input输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(1 Output对于每组测试原创 2016-03-27 12:31:03 · 599 阅读 · 0 评论 -
数位DP——Bomb ( HDU 3555 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3555分析: 题意为给除一个数N,求出1-N这些数中含有49的子串的数的个数。初学数位DP,这道题就当例题了。题解:首先我们确定状态转移方程 dp[i][j]用于存储符合条件的数的个数i 代表目前处理的数长度为i这里dp[i][j]处理的数可以包含前导0dp[i][0]代表长度为i的数中原创 2016-07-18 17:06:10 · 470 阅读 · 0 评论 -
树形DP总结
状态转移方程:题型一Q:给出一颗树,每个节点有其价值,如果父节点在,子节点就不能存在,然后求选哪些点能得到最大价值。A:从问题入手,先得出dp[i][j] 表示第i个节点,状态为j (0:不选,1:选)的情况下的价值。 然后再推导除出状态转移方程:dp[i][0] = max ( dp[i-1][1], dp[i-1][0] ) dp[i][1] = dp[i-1][0]题型二Q:给出一颗原创 2016-07-21 21:45:51 · 946 阅读 · 0 评论 -
树形DP——Party a Haili-Bula ( HDU 3342 )
题目链接: http://poj.org/problem?id=3342分析: 输入数据为字符串,需要与序号绑定,所以需要用到map容器。然后就是树形DP了。题解:1.MAP存储:map<string, int> names;map<string, int>::iterator it;int ADD(string x)//加入字符串{ int num; it = nam原创 2016-07-21 20:20:50 · 351 阅读 · 0 评论 -
树形DP——Rebuilding Roads ( POJ 1947 )
题目链接: http://poj.org/problem?id=1947分析: 求最少删除多少边才能得到一颗含有P节点的子树。从根节点开始往下推能得出dp数组(见问题三)。题解:1.用vector建树,存储:for(int i=0;i<=n;i++) vec[i].clear(); //每次先清空vectorfor(int i=1;i<n;i++){ int a,b原创 2016-07-22 11:10:17 · 364 阅读 · 0 评论 -
线段树(区间更新与区间查询)——Just a Hook ( HDU 1698 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1698分析&题解:不多说,这类水题都放模板1.线段树标准预处理:#define lc (d<<1)#define rc (d<<1|1)#define mid ( l+r >>1)//l,r表示整个区间范围2.建树:#define Max 100005int a[Max];struct Tr原创 2016-07-23 14:57:27 · 400 阅读 · 0 评论 -
递归搜索 ( 水题 )——A Rational Sequence ( UVA 7363 )
题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5385分析&&题解: 给出一个数,计算它在这颗树中的序号,因为,这颗树的子节点都是由根节点推出的,那么我们可以从这个数反推其父节点,知道推到根节点,然后递归回去的时候开始计算树原创 2016-07-24 15:41:47 · 701 阅读 · 0 评论 -
计算几何 ( 判断线段相交 )——You can... ( HDU 1086 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1086分析&&题解: 给出N条线段,每条线段告诉你起始点和结束点,判断这N条线段构成多少条交点,不同线段交于一点可以被重复计算。这就非常简单了,直接模板过去。判断线段相交(包括端点):double multiply(point sp, point ep, point op) //得到线段(sp原创 2016-07-24 15:49:07 · 798 阅读 · 0 评论 -
计算几何 ( 求多边形面积 )——改革春风吹满地 ( HDU 2036 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2036分析&&题解: 给出一个多边形的顶点数N和这N个顶点的坐标(坐标为整数,所以注意要将 点结构体里的类型换成int,否则用C读取不进去!!!),然后直接套模板计算即可。计算多边形面积://vcount 为定点数,p[]存储定点,从0开始double Area(int vcount, po原创 2016-07-24 17:29:40 · 437 阅读 · 0 评论 -
计算几何 ( 求两圆相交面积 )——Open-air shopping malls ( HDU 3264 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3264分析: 给出N个圆的圆心坐标和圆半径,然后以其中一个圆心做一个大圆要求覆盖所以圆并使得覆盖面积大于被覆盖圆的1/2,求该大圆的最小半径。 因为N最多为20个,我们可以直接搜索每一个圆心,然后二分查半径范围,直到确定半径小于误差。题解:1.建立圆:const double eps = 1原创 2016-07-25 11:30:16 · 939 阅读 · 0 评论 -
计算几何(组合计数+向量排序)——Eureka ( HDU 5738 ) ( 2016 Multi-University Training Contest 2 1005 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5738分析: best set 意为全部共线的一个点集,所以题目转换为给出一堆点,求出里面全部共线的点集的数量。题解:1.判断是否共线,采用记录向量的方式:struct node{ int dx, dy, num;//num为数量 node(){} node(int原创 2016-07-22 16:51:20 · 576 阅读 · 0 评论 -
暴力交叉匹配——La Vie en rose ( HDU 5745 )(2016 Multi-University Training Contest 2 1012)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5745分析: 给两串字符,一串目标字符,一串匹配字符,匹配字符可以前后交换,然后输出匹配位置。过的人很多,所以应该就是暴力搜索。题解: 由两种匹配方式,直接匹配,如果不行,可以和后一个位置匹配(因为匹配字符串可以前后交换,但每一个字符只能交换一次)。所以这里加一个判断直接暴力搜索AC代码:原创 2016-07-22 15:06:35 · 469 阅读 · 0 评论 -
数学——Acperience ( HDU 5734) ( 2016 Multi-University Training Contest 2 1001 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5734分析: 给出一个已知向量W = ( w1, w2, …, wn ),和一个不确定向量B = ( b2, b2, …, bn )(bi ∈{+1, -1}),还有一个缩放因子α≥0。求||W-αB||^2的最小值 Note: ||X|| = √x1^2+⋯+xn^2 (X= x1, x2,原创 2016-07-22 12:08:28 · 346 阅读 · 0 评论 -
最小生成树+DFS求任意两点间平均路径长度 ——Abandoned country (HDU 5732)( 2016Multi-University Training Contest 1 1001 )
题目链接: http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1001&cid=704分析: 点数最大为100000,所以最小生成树应该用Kruskal。因为任意两点的距离不相等,所以最小生成树唯一,那么期望也就是唯一的。而这个期望即任意两点距离的平均值。我们先统计出每条边在所有路径中被用到的次数,用它乘以这条边的权重,加在一原创 2016-07-20 16:27:21 · 1140 阅读 · 0 评论 -
Yet another A + B——KTU Programming Camp (Day 1) I题
题目链接: http://codeforces.com/gym/100735/problem/I分析: 给出3个数A,B,C,每个数可以用给出的这三个数替换,问是否能替换后使其满足A + B = C .由于题目给出的数据范围很大 1 ~ 10^100,所以不用多想,先敲一个高精度大数加法,单元测试过来再拿来用!题解: 大数加法敲完后,这题就完成60%了,为了精简之后的计算,所以我们还要写个原创 2016-07-15 09:17:56 · 918 阅读 · 0 评论 -
Restore——KTU Programming Camp (Day 1) E题
题目链接: http://codeforces.com/gym/100735/problem/E分析: 很水的签到题,但是一定要把思路想清楚了再做,否则(T_T) .题解: 设一开始斜对角线为0的矩阵元素之和为Sum0,补全后每一横排元素之和为S,缺失的斜对角线元素之和为X,由题意得 X = S,所以由Sum0 + S = n * S 所以S = Sum0/(n-1) , 然后设缺失时矩阵原创 2016-07-15 09:08:53 · 901 阅读 · 0 评论 -
计算几何 ( 求凸包,计算三角形面积 )——最大三角形 ( HDU 2202 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2202分析: 给出平面上的N个点,在其中找出三个点,使得其构成的三角形的面积最大。题解: 先用找出凸包上的所有点,然后一次枚举遍历即可。1.求凸包:int cmp(point a, point b) //水平排序{ if(a.x==b.x)return a.y<b.y;原创 2016-07-25 14:25:21 · 2755 阅读 · 0 评论 -
计算几何 ( 凸包 )——Wall ( HDU 1248 )
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1348分析: 给出N个点,求距离这N个点围成的多边形距离为L的围墙的周长。可以得出,这个周长就是多边形周长加上一个圆的周长。多半形周长可以先求出凸包点集,然后依次累加距离即可。然后这个题需要注意输出格式!最后一个输出数据不用加两个换行!!!题解: 1.求凸包:int cmp(point a,原创 2016-07-25 20:15:05 · 418 阅读 · 0 评论 -
欧拉定理——PowMod ( HDU 5728 )(2016 Multi-University Training Contest 1 1006)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5728分析: 题中有 k = ∑(m,i=1) φ(i∗n) mod 1000000007,即求和函数 sum(n, m) = ∑(m,i=1) φ(i∗n) mod 1000000007. 那么考虑将质因子p的贡献单独处理,可以得到 sum(n, m) = φ(p) × sum(n/p,原创 2016-07-22 20:01:13 · 528 阅读 · 0 评论 -
博弈论——Life Winner Bo ( HDU 5754 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5754分析: 给出国际象棋中四种棋子:王,后,车,马;按照国际象棋中的走法,从(1, 1)走到(N, M)点,B先走,G后走,谁赢输出谁的名字,平局输出D。题解: 直接画图分析每种棋子的必胜策略: ①王。首先注意一个3*3的棋盘,开始在(1,1),问走到(3,3)谁有必胜策略。穷举所有情况转载 2016-07-26 21:12:05 · 359 阅读 · 0 评论 -
网络流( ISAP + 拆点 )——Dining ( POJ 3281 )
题目链接: http://poj.org/problem?id=3281分析: 一头牛只吃指定的几种食物或饮料,但是每一种食物和饮料都只有一个,给出N头牛及其要求,F种食物和D种饮料,问最多可以满足多少头牛的需要(饮料和食物都满足需求)。题解: 1.建图:需要将每头牛拆成牛1和牛2,然后建立一个源点S,从S出发作边连接每一个食物,容量为1。然后从食物出发向和其对应的牛做边,容量为1。再连接原创 2016-07-27 14:02:39 · 578 阅读 · 0 评论 -
网络流 ( ISAP+建图 )——A Plug for UNIX ( POJ 1087 )
题目链接: http://poj.org/problem?id=1087分析:给出k个设备,每个设备对应一种插头,再给出n种插板(每种一个)和m种适配器(每种数量无限),只有插头插板相同编号才能插入,适配器可以转换插头编号,求最少由几个设备插不上。题解: 因为输入的设备名称和插头插板都是字符串所以,需要用到map转换乘数字。从S建立到k个设备的边,容量为1; 从k个设备建立到其对应插头的边原创 2016-07-27 17:20:58 · 393 阅读 · 0 评论 -
KMP(内含next数组讲解) —— 剪花布条 ( HDU 2087 )
关于KMP算法前缀next最同俗易懂的解释请看: http://blog.youkuaiyun.com/yearn520/article/details/6729426next数组代码:void SetPrefix(const char *Pattern, int prefix[]){ int len=CharLen(Pattern);//模式字符串长度。 prefix[0]=0;原创 2016-07-14 18:13:07 · 425 阅读 · 0 评论 -
扩展KMP学习
模板转自: http://blog.youkuaiyun.com/dyx404514/article/details/41831947 (侵删)(扩展KMP的详细介绍也在里面)next数组计算const int maxn=100010; //字符串长度最大值 int next[maxn],ex[maxn]; //ex数组即为extend数组 void GETNEXT(char *str)转载 2016-07-28 09:51:06 · 556 阅读 · 0 评论 -
扩展KMP ( Next数组 )——Simpson's Hidden Talents ( HDU 2594 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2594分析: 给出两个字符串S1,S2,求出一个最长子串(既是S1 的前缀又是S2的后缀),一开始是打算用完整的扩展KMP去做,但是结果迷之WA,后来改成合并字符串,把S2接S1后面,然后获取整个字符串的Next数组来做。题解:从strlen(s1)的地方开始遍历Next数组,这个时候找S[str原创 2016-07-28 11:08:26 · 588 阅读 · 0 评论 -
树状数组 ( 基础篇 )——敌兵布阵 ( HDU 1166 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1166分析: 输入一堆数,范围小于50000,要求对其进行修改具体元素,区间求和两种操作。一看就是树状数组。题解:先来一发树状数组的基本模板:int TreeArray[40005],N;int lowbit(int i)//lowB操作!!!{ return i & (-i);原创 2016-07-22 21:00:21 · 466 阅读 · 0 评论 -
拓扑排序(Topological Order 基础篇)—— 确定比赛名次 (HDU 1285 )
以下内容概括自: http://www.cnblogs.com/skywang12345/p/3711489.html#anchor1概念: 将一个有向无环图(Directed Acyclic Graph DAG)进行排序进而得到一个有序的线性序列。基本步骤:构造一个队列Q 和 拓扑排序的结果队列T;把入度为0的节点加入Q;当Q不为空的时候,执行下列步骤: 从Q中取出一个顶点n,并放入原创 2016-07-18 14:30:08 · 481 阅读 · 0 评论 -
构造法——The table ( CodeForces 226D )
题目链接: http://codeforces.com/problemset/problem/226/D分析: 一看数据范围都是100,可能就可以直接做,那么就不管三七二十一,直接上。题解: 先敲俩find函数,一个扫所有行,如果哪行的和为负,直接返回,另一个扫所有列。然后while大判断,如果两个函数有返回,返回的是行,就翻转那行,重新计算和;返回的是列,就翻转那列,重新计算和。用两个数原创 2016-07-15 21:44:15 · 351 阅读 · 0 评论 -
构造法——Diverse Permutation ( CodeForces 482A )
题目链接: http://codeforces.com/problemset/problem/482/A分析: 这是一道构造法构造数学模型的题,建议先列出一定数量数据,然后从中寻找规律,建立模型。题解: 如果数组长度为n,间隔数为k的话,我们可以假设k=n-1,然后列出n=4, n=5, n=6, n=7时候的数组的取值。取值的时候可以用这种方法:每次设第k个位置为1,那么它与之后元素的差原创 2016-07-15 21:38:53 · 519 阅读 · 0 评论 -
博弈论 —— The Game of Parity ( CodeForces 549C )
题目链接: http://codeforces.com/problemset/problem/549/C分析: 这道博弈论重在分清楚情况,偶数人数的城多一座少一座并不会改变最终剩余人数的奇偶性,只有奇数人数的城市的数量会对结果产生影响。题解: 首先先算出奇数人数城市的数量Odd和偶数人数城市的数量Even,再算出可以操作的总次数T。如果T/2大于Odd,那么Daenerys就可以把所有奇数原创 2016-07-14 13:21:59 · 504 阅读 · 0 评论 -
贪心——Happy Line (CodeForces 549G)
题目链接: http://codeforces.com/problemset/problem/549/G分析:数据范围很大,n为200000,ai为10^9,所以相直接模拟做肯定会TLE(半小时成功T了QAQ) 。以下转载自 (http://blog.youkuaiyun.com/qq_24451605/article/details/46586533)题解: 我们假设两个人a和b,a,b的钱分别是转载 2016-07-14 11:32:09 · 443 阅读 · 0 评论 -
同余与扩展欧几里得解模线性方程——CLooooops(POJ 2115)
题目链接: http://poj.org/problem?id=2115分析: 题目大意为求解能使得 A + x * C = B 的最小的x , 0 ≤ x < 2^k .题解: 我们可以先构造模线性方程,原式转换为 x * C = B - A ,即有 C*x = B - A (mod 2^k),(此处用到了模运算规则),得出标准模线性方程,利用扩展欧几里得即可求解。注意:int类型的原创 2016-07-13 18:12:49 · 371 阅读 · 0 评论 -
中国剩余定理(CRT 孙子定理)——Biorhythms(POJ 1006)
定义:中国古代求解一次同余式组(见同余)的方法。表述: 设正整数两两互素,则同余方程组 有整数解。并且在模下的解是唯一的,解为 其中,而为模的逆元。代码:int CRT(int a[],int m[],int n) { int M = 1; int ans = 0; for(int i=1; i<=n; i++) M原创 2016-07-13 10:53:43 · 898 阅读 · 0 评论 -
同余与乘法逆元
同余:定义:设m≠0,若m∣a-b,即a-b=km,则称a与b同余,余数为m。充要条件:a、b关于模m同余的充要条件是整数a和b被同一正整数m除时,有相同的余数。性质: 同余类:根据整数模n所得的余数,可以把整数分成n个等价类:[0],[1],…,[n-1]。 包含整数的模n等价类为:[a]n={a+kn| k∈Z}。例题:求3406写成十进位数时的个位数. 根据题意是要求a满足34原创 2016-07-12 16:47:15 · 3318 阅读 · 0 评论