摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4415题意:Ezio 作为一个刺客他想杀掉n个人,他仅有的武器就是一把剑这把剑有攻击值m,每个人对应了两个值ai,bi,即杀掉i这个人必须消耗剑的ai的攻击之,然后你可以获得bi超级攻击法术,可以杀死bi个人。问他要怎么杀法才能是它杀的人最多而且消耗的剑的攻击之最小。思路:由于bi的非零的特殊性,我们将n个人按bi==0分为一组1,bi!=0分为一组2,非零的这一组只要我们能够杀掉其中的一个那么我们就可以杀掉所有的这一组的人(bi的非零性)。对于第2组我们要么全部杀光,要么一个不杀,这样就给了我们两种情况的讨 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4407比赛的时候想到了先求与p不互质的然后减去,但是就是遇到了容斥处理的问题,当时没有想到对因子容斥,只想到求和容斥那去了。。哎。悲剧啊、、题意:给出一个长度为n序列初始值为1,2,......n对其进行两种操作:"2 x c" 将x位置的值替换成y;"1 x y p" 求区间[x,y]内与p互质的数的和。思路:首先对于2操作我们离线处理,因为只有对于1,2,3.....n这样的序列我们在求1操作时才好处理,首先对p进行因式分解,可知他最多有6个因子因为到17是就已经大 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4409赛后才过只能说悲剧了,知道思路,stl不熟悉,所以导致写的很慢....占据了很多时间,手速+代码准确度。。哎。。。题意:给你一个家谱,n个人的姓名,姓名前边的点代表了他是第几代人。每个人的祖先肯定在他之前出现。有三种操作:L:输出这个家族的序列,不是按层数,而是递归的输出,还要保证字典序升序;b name 输出name的兄弟个数,注意这里堂兄弟不算:c name1 name2 求name1 name2的最近公共祖先。思路:首先我用set建图这样就能保证L输出时按字典序输出,mp用来进行映射,rmq+lc 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4297题意:给出n个点的有向图,每个点的出度均为1.有m个询问,每个询问两个数(u,v),表示两个人一个在u一个在v。对于每个询问,请你选择一个点P使得u、v均能到达P。设u到达P需要A步,v到达P需要B步。求一个P使得max(A,B)最小?若答案不唯一,输出min(A,B)最小的;若答案还不唯一,输出A>=B的。(不存在P的A=B=-1)思路:这个有向图很特别,由于每个节点只有一条出边,所以如果形成一个环的话就只能有指向这个环的边,同时一个子图内最多存在一个环,tarjan搞掉环,建反图虚拟根节点转换 阅读全文
摘要:
http://poj.org/problem?id=1330题意:给n个点,n-1条边,一棵树,求每个询问的LCA;思路:rmq求LCA。。。。http://dongxicheng.org/structure/lca-rmq/View Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include < 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4291题意:...思路:首先暴力求出最外层模100000007的循环节MOD2,然后求出模MOD2的循环节MOD1.求出循环节后用类似与斐波那契数列举证优化的方法求解将时间复杂度由O(N)降到O(logN*2^3);ps:注意这里我们虽然求(n - 1)次幂就能得到{fn,fn-1}了,但是对于当n等于0时就要特殊判断,单纯的一个求幂判断完毕也就罢了,但是当多次求幂时,里面套着也会出现0也需要判断。比较麻烦您容易忽略。所以我们可以求到a^n次方去a.mat[0][1] = a.mat[1][0]。 当计算n- 阅读全文
摘要:
数据结构struct Mat{ ll mat[3][3]; void init(){ for (int i = 0; i < 2; ++i){ for (int j = 0; j < 2; ++j){ mat[i][j] = ; } } mat[1][1] = 0; }}; 乘法Mat operator * (Mat a,Mat b){ Mat c; int i,j,k; CL(c.mat,0); for (i = 0; i < 2; ... 阅读全文
摘要:
http://poj.org/problem?id=3070思路:这里n很大单纯的递推是O(N)会超时,所以要用矩阵快速幂优化;f(n) 1 1 f(1) = 的n-1次方 *f(n-1) 1 0 f(0)View Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <set>#in 阅读全文
摘要:
<本人转载>C语言的自增++,自减--运算符对于初学者来说一直都是个难题,甚至很多老手也会产生困惑,最近我在网上看到一个问题:#include <stdio.h>void main() /*主函数*/{int a,b,c,d;a=5;b=5;c=(a++)+(a++)+(a++);d=(++b)+(++b)+(++b);printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);}结果是什么?而后Eric搜了一下后发现,类似的问题很多,也就是说对自增自减运算符感到迷惑是一个普遍存在的问题,基于此,Eric决定对自增自减运算符做个小 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4289题意:有N个城市 M条无向边 有一些恐怖分子要从某一城市到另一城市 打算在某些城市安放一些SA 去抓住他 但若在某个城市安放SA需要一定费用 求一个集合使每个到达终点的路线肯定会经过其中一个点,而这个集合里面每个点都安放了SA,这样就能找到所有的恐怖分子,求该集合使费用最小。思路:网络流的题目做的还太少,对于这类题目还是不太敏感,没想到拆点建图。。。。题目意思是求一个s-t割,求最小的费用肯定要求最小割了,又由于最小割等于最大流,所以我们只要用最大流求解即可,而这里建图是关键,这里将每个点拆成两个点(i 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4293题意:有n个人分成了若干组走在一条林荫道路上,导游为了能够确定人数,要求每个人喊出自己所在的队伍前边有多少人Ai表示,后边有多少人Bi表示,于是我们得到了n条信息。这里面有错误的信息也有正确的信息,要求我们尽量使正确信息最大求出正确信息的数量。思路:想了很久一直在捉摸它的最有子结构从何而来,怎样dp....今天下午虎哥给了点提示终于明白了如何做了。。。YM虎哥.....首先我们根据每个人提供的前边Ai个人,后边Bi个人,可以确定这个人所在队伍的人数的范围。于是我们得到了N个区间,我只要求出不想交区间最多 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4296题意:给出n个石板的重量w和它的承受能力s,将这n个石板累在一起,这样每个石板都有一个PDV =(Σwj)-si ,(Σwj)表示在i石板上的石板的重量和,我们计算每块石板的PDV如果是负数说明石板不会被压坏,如果是正数则表示石板会被压坏,要求我们确定一个顺序是的所有正数的最大值最小。一次来表示石板的最大承压能力;思路:开始读题读了老长时间都没读懂,最后还是把题意理解错了,试了分别按s,w排序都不对,郁闷了。最后才看懂了题意,我们要求的是正数的最大值的最小,我们只要保证每次可能出现正数时他是可能的里面. 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4288题意:给出三种操作add x 向集合里添加x(这里保证集合中不存在该元素), del x删除集合里的x(这里保证集合里面不存在x),sum:然后给出N个操作,输出每次的sum;思路:才开始看到这题就想到了上次那个维护区间(i-a)%k == 0的题目区间部分更新的题目,每个线段树上的节点添加记录该区间内模k余(0到k-1)的值,可是这里是求整个区间,而且一旦删除一个值它们原来满足模k的余数就会发生改变。直接就晕了。。。看了下解题报告原来和上次的题目是类似的,我们还是记录当前区间模5余(0到4)的值,只是 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4292题意:有N个顾客,餐厅里有F中食物,D中饮料。给出每种食物的个数以及每种饮料的个数。还给出两个关系矩阵N*F 和N*D Y表示第i个人对于第j个食物或者饮料是满意的,求出该餐厅能使顾客满意的最多人数。思路:这里我们主要是保持每个人能够拿到自己满意的一份食物和一瓶饮料,(注意每个人只能那一份食物和饮料). Food ------ Peole ------- Drink 按这样的思路只要给出一个最大流即可,但是我们要保持每个人只拿到一份食物与饮料所以要将n个点拆成2*n个点每一对加权值为1,其余的就是给出. 阅读全文
摘要:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4772题意:给定n个点n-1条边,每个点对应一个财富值,走每条路径都对应着一个所需要的时间,问在m天内从k出发然后回到k,所能取得到的最大财富值 v1 V2 ....V1.思路:由于题目给定的是一棵生成树,所以从k出发后必须按原路返回才可满足条件,也就是每条边走两次。dp[k][m]表示从k出发的又回到k的路径所取得的最大值。就是相当于往容量为m的包里放物品一样。每个点对应一个包。View Code #include <iostream>#include < 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4268题意:Alice and Bob各自都有N个矩形纸牌,Alice 想用他的纸牌尽量多的覆盖Bob的纸牌,i覆盖j满足的条件是p[i].h >= p[j].h p[i].w >= p[j].w ,并且一张纸牌只能覆盖一张,求最多覆盖的张数。思路:这里给出的n很大,(N <= 100,000) 首先分析肯定回事O(nlogn)级别的算法,才开始我想到的是二分,分别将Alice and Bob的纸牌排序,枚举Alice的纸牌二分查找Bob的纸牌里最大的能满足被Alice 的纸牌覆盖的然后覆盖 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4274题意:我们派出的间谍得到一些信息,信息包括N个职工分别负责N个部门,每个职工最多有一个上司,每个职工的工资最少为1,上司i负责部门i 而i的下属也属于部门i,给出m个部门的描述,i < W 表示部门i的所有人的总工资小于w,(包括i以及i的下属,下边一样);i > W 表示部门i的所有人的总工资大于W;i = W 表示部门i所有人的总工资等于W让你判断这些信息是否正确,如果寻在矛盾说明不正确。思路:比赛时,最后20分钟才有思路,不过没写完,。。郁闷。。每个点low[i]记录i部门最少可得的工 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4272题意:给你一个数字栈,每次必须从栈顶开始往下找距离<=5的范围内,如果存在与栈顶相同的数字,则两个数字同时出栈,其余数字还在栈中保持相对位置不变。思路:比赛时,这道题目相当坑爹,才开始写的是<5 VON想到贪心模拟,可是我出了两组数据一组数据按最近贪不对,另一组按最远贪也不对。于是我们纠结啊。。。。后来知道题目出错,是<=5于是贪心水过。后来才发现贪心是不对的这组数据:121 2 2 1 3 1 1 1 1 1 1 3应该输出0可是输出1也对。。我对这题无语了。。。我处理成<=7 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4277题意:给出n条线段,每条线段的长度为li(1 <= li <= 10000)1 <= N <= 15。才开始想到了爆搜算了一下时间复杂度O(3^15)*15勉强可以,可是在判重问题上一直很纠结,不知道该怎么处理,素以就放下了。赛后看了看解题报告,可谓经典啊。。爆搜所有的组合,然后set(或者hash判重),这里由于li<=10000 N <=15 所以最大的长度肯定小于10000000000000000ll,在__int64的表示范围之内,所以我们只需要将a,b, c 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4267题意:给你N个数,有两种操作:2 x询问a[x]的值;1 a b k c a <= i <= b 满足(i - a)%k == 0的a[i] += c;(1 <= N <= 50000) (1 <= a <= b <= N, 1 <= k <= 10, -1,000 <= c <= 1,000)思路:一看就知道这肯定是线段树的题目,可是区间内满足(i - a)%k == 0的点才进行处理怎么办,如果i i + k,i + 2k的循环处理的 阅读全文