ACM 训练
文章平均质量分 64
AC_0_summer
这个作者很懒,什么都没留下…
展开
-
HDU 5363 元素为1~n的集合有多少个子集的元素和为偶数-思维-(快速幂取模)
题意:一个集合有元素1~n,求他的子集满足这样的条件:子集的所有元素的和是偶数,问有多少个这样的子集分析:一个排列组合问题。元素和为偶数,那么奇数肯定要调偶数个,偶数就无所谓了,所以偶数有2^(n/2)种选法,再乘以奇数有(C((n+1)/2,0)+C((n+1)/2,2).....)种选法,再减一,除去空集,注意,上面取奇数的时候用的是(n+1)/2(这里是向下取整的除法),是综合n为偶原创 2015-08-07 00:44:23 · 2255 阅读 · 0 评论 -
!HDU 4346 插旗子RGR的插法有多少种-思维&正难则逆&思维!
题意:只有R和G两种旗子,美丽的插法是存在两个R的中点插G的情况,现在给你一个字符串代表现在有些地方已经插了,求美丽的插法有多少种分析:美丽=总 — 不美丽所以我们来求不美丽有多少种。这里就是思维的问题了:一个不美丽的序列必须满足的条件是任何两个相邻R的距离为奇数并且所有的相邻R的距离相等。奇数这是显然的,如果两个相邻的R不为奇数,那么它们的中点存在,并且是G,这与不美丽矛盾;原创 2015-08-04 20:54:35 · 913 阅读 · 0 评论 -
HDU 4343 多查询求区间内的最大不相交区间个数-思维&贪心-卡时间&二分&剪枝
题意:给你一些区间,现在有m个查询,求出每个查询的区间内的最大的不相交区间个数分析:几天前那道说谎问题时用dp的摞箱子模型求的最大的不相交区间个数,但是这题不能用这个方法,因为这题是动态的查询,不可能每个查询dp一次,超时。这题用贪心策略。求区间[l~r]里的最大不相交区间,贪心策略就应该先选该区间内右端点最小的,这样给以后待选的区间留下更大的空间,所以我们的做法就是先按照区间的右端点原创 2015-08-04 20:31:52 · 1502 阅读 · 2 评论 -
!HDU 4313 破坏导弹攻城计划-连通图-(最小生成树变形)
题意:有n个城市,城市之间有n-1条路连接每个城市,也就是说有一个树,敌人在一些城市放了导弹,共有m个导弹,敌人想把导弹运到一起然后开战,现在给你个任务就是摧毁一些路,使任何两个导弹都不能运到一起,摧毁每条路都有相应的代价,求最小的代价。分析:导弹不能运到一起就是说任何两个导弹不能在一个连通图中,所以我们的任务就是用最少的代价摧毁一些路使m个导弹分别在m个连通图中。这题是就反面,最少的原创 2015-08-03 18:20:40 · 794 阅读 · 0 评论 -
HDU 4312 最小切比雪夫距离-转化成曼哈顿距离再分治
题意:二维空间,n个点,求以某点为起点到各点的最小切比雪夫距离分析:上一道题之前已经用“分治“思想在O(n)的时间内求出了n个点,以某点为起点到各点的最小曼哈顿距离,那么我们根据二维空间切比雪夫距离和曼哈顿距离的关系,可以把切比雪夫距离转化成曼哈顿距离,再直接用之前的方法即可。二维空间:曼哈顿距离 :d=|x1-x2|+|y1-y2|,到某点的曼哈顿距离为r的点组成一个边长为√2*原创 2015-08-03 18:10:10 · 2594 阅读 · 0 评论 -
!Gym 100625J 狱警放两犯人的最小开门数-bfs-(优先队列+bfs,求各自到交点的距离)
题意:二维矩阵,狱警从外面到里面去放两个犯人,问中途需要开的门的最小的次数。分析:这题从外面进去,那么只要是矩阵边缘可走的点(除了墙壁的点)都可作为起点,还有两个终点,所以直接枚举起点再搜索是不可行的。这题的做法是用三次bfs,分别求得从外面到每一个可走点的最小距离(开门次数)、两个犯人到每个可走点的最小距离,然后遍历一遍矩阵,把三个距离加起来,更新答案即可。求矩阵外面到矩阵里的最小距离是原创 2015-08-14 16:06:00 · 1749 阅读 · 0 评论 -
Gym 100625D 已知一条边追踪游人-最短路径-(两次dijkstra算法)
题意:有一群人在图上行走,这群人只走最短路径,你知道图的结构、他们的起点和几个给定的终点,还知道一条他们经过了的边,现在通过这条边在给定的终点中找出他们可能的终点。分析:原创 2015-08-14 23:25:46 · 855 阅读 · 0 评论 -
HDU 4082 Hou Yi's secret-求相似三角形的最大个数-(坑货)
题意:找相似三角形的最大个数。注意不是所有相似三角形的个数,而是不同类相似三角形 中个数最大的分析:之前理解成了所有相似三角形的个数,所以尽管考虑了所有的特殊情况以及精度问题还是不停的wawawa,甚至重新写了一遍不用余弦来判断而是用边。绝望之中仔细看别人的代码,原来题意理解错了。这题的收获:1.三角形相似的判定:用余弦定理、或者边成比例。最好用边,然后判定的时候不用比值,用乘积,原创 2015-07-22 20:42:01 · 1331 阅读 · 0 评论 -
!HDU 4135 Co-prime-容斥原理-(位运算技巧)
题意:求区间 [a~b]内与n互素的数的个数分析:容斥原理很容易想到,关键在于怎么实现。有三种方法:dfs、队列数组、位运算。我觉得位运算比较好理解。先求出n的质因数设有cnt个,则这cnt个数有2^cnt-1种组合。用二进制位很容易证明:设有三个质因数作为例子,则 001,010,100,011,101,110,111,就分别表示了选一个,选两个,选三个的各种情况,这样就很明显了,共原创 2015-07-21 22:24:11 · 947 阅读 · 0 评论 -
Gym 100625C 密文匹配-模拟题-(map)
题意:已知n个明文和一个密文,推出可能的匹配关系,然后输出字符串ss的密文。分析:一个模拟题,当时想偏了,还想着要同一字母可能在任意位置,然后要记录每个字母的位置,找密文的相应位置必须是同一字母,balabala的,不知道什么鬼。其实就是简单的对应关系,不用管位置啥的,只管同一字母对应的密文是一样的就行了。26个字母,枚举一遍就是了。对应关系匹配啥的用map是最好不过的了。小tirck原创 2015-08-14 01:00:30 · 1002 阅读 · 0 评论 -
HDU 4349 组合数的奇数个数-杨辉三角&Lucas定理
题意:给你一个n,求C (n,0),C (n,1),C (n,2)...C (n,n),奇数的个数。分析:Lucas定理:A、B是非负整数,p是质数。AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]。则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0]) modp同余原创 2015-08-04 21:31:54 · 1758 阅读 · 0 评论 -
!HDU 4345 置换群的环长有多少种-dp
题意:置换群,问环的长度有多少种分析:环的长度就是每次你选择的区间长度的最小公倍数。总区间长度是n,那么这道题就是求和等于n的各个数的最小公倍数有多少种。状态:dp[i][j]前i个质数,区间长度不超过j的最优解转移:dp[i][j]=dp[i-1][j]+dp[i-1][j-k],k=prim[i]^1,2...这题和上一题的dp难哭我了。代码:#include#i原创 2015-08-04 22:06:22 · 835 阅读 · 0 评论 -
HDU 4365 正方形格子涂色中心对称轴对称的涂法有多少种-思维-(矩阵坐标关系&快速幂取模)
题意:n*n的格子,涂色,有k种颜料,必须满足旋转任意个90度和翻转之后图片的样子不变,现在已经有m个格子涂过色了,问还有多少种涂法满足上述条件。分析:满足上述对称条件,那么涂色的种类问题我们可以放在正方形的一个角来做,因为一个角确定了其他角的颜色也就确定了。以左上角的下半角为例。共有1+2+....+(n+1)/2个格子,然后记录涂过色的格子对应到这个三角形里的格子数目,用tot来记原创 2015-08-07 00:03:50 · 2852 阅读 · 0 评论 -
!HDU 5305 朋友关系网一半网友问题-dfs-(暴力搜索)
题意:有n个人,m个朋友关系,现在每个人的朋友中必须一半是online一半是offline,问你有几种分配方案。分析:昨天一看这题就知道自己做过,无奈想不起来啊,没做出来我就知道应该上一次也没做出来,果然是。勤补题才是王道。这题用深搜。搜索还是不太会用,这题我自己做的话估计怎么也想不到用dfs。努力啊少年。代码:#include#include#include#inclu原创 2015-08-06 22:28:28 · 942 阅读 · 0 评论 -
HDU 4362 多时段多地点找龙珠-dp-(数塔模型)
题意:一个时间点在数轴的不同位置有龙珠,但每个时间点只能且必须收集一个龙珠,在不同的位置收集龙珠会损失不同的能量,移动距离也会损失能量,求m段时间后损失的最小能量。分析:就是一个数塔的dp模型,跟免费馅饼还有多时段多课问题一样。dp[i][j]:第i段时间第j的位置的最小能量损失;转移:dp[i][j]=min(dp[i+1][k]+|a[i][j].pos-a[i+1][k].pos原创 2015-08-05 21:42:59 · 1074 阅读 · 0 评论 -
HDU 5344 多个数的和异或-思维-(位运算)
题意:n个数的两两做和,然后异或分析:异或的性质:两个相同的数异或为0,所以Ai+Aj异或Aj+Ai等于0,所以最终结果就是Ai+Ai的异或代码:#includelong long t,n,m,z,l;long long a[1000005];int main(){ scanf("%I64d",&t); while(t--){ scanf("原创 2015-08-06 00:32:24 · 2915 阅读 · 0 评论 -
HDU 4371 AliceBob之生成数列直到大于n或者小于等于S(i-2)-思维-(由已知条件推最优步骤)
题意:已知n、d1、d2....dm,Alice先生成一个数S1=0,Bob再生成一个数S2=S1+dk,之后他们生成的数遵循这样的条件:Si=S(i-1)+dk,或者Si=S(i-1)-dk,其中1分析:既然想不出什么直接搜索之类的方法,那么一定就是找规律了。这题我们来推一下他的条件得到每个人每一步的最利于自己的做法。考虑三个数:S(i-2),S(i-1),Si,假设当前步骤是生成S原创 2015-08-05 22:16:38 · 813 阅读 · 0 评论 -
!codeforces 400E Inna and Binary Logic-yy-(位运算)
题意:有n个数存放在数组a1[]中,然后数组a1[]生成数组a2[],a2[]生成a3[].....一直生成an[],公式是ai[k]=ai-1[k]&ai-1[k+1],现在如果把初始数据也就是数组a1[]里的某一个数换成另一个数,求所有数组的总和是多少。分析:既然这里的数组生成公式里用到了位与运算,那么就用位运算来做了。把数字写成二进制,公式的意思就是说同一数组的相邻数字的对应二进制位原创 2015-07-24 22:09:13 · 744 阅读 · 0 评论 -
HDU 4268 AliceBob大牌覆盖小牌-思维(贪心+multiset)
题意:Alice有n张牌,Bob有n张牌,A能覆盖B当且仅当A的长宽不小于B的长宽,现在输入他们的牌的长宽,求最多能覆盖多少张。分析:思维。先分别按长的降序排序,然后遍历A,每次都从B中选出长小于等于A的长的牌,把他们的宽放进multiset,然后利用lower_bound()函数找出A的宽能覆盖的最长的宽从multiset中删除。以此类推。这样做就保证了局部操作的最优性,这也是这题的贪心原创 2015-08-17 22:41:46 · 736 阅读 · 0 评论 -
!HDU 4359 左子树节点和小于右子树的树有多少种-dp
题意:n个节点,每个节点的权值为2^0,2^1....2^(n-1),求满足任何节点的左子树的节点和小于右子树的节点和的分配方案有多少种分析:由于等比数列的性质:1+2+....2^(k-1)情况有:1.只有左子树,2.只有右子树,3.都有dp[i][j]:表示选i个节点深度转移:dp[i][j]+=C(i-2,k)*dp[k][j-1]*dp[i-1-k][j-1],这里用到原创 2015-08-04 21:57:34 · 1406 阅读 · 0 评论 -
HDU 4357 字符交换位置无数次变成另一个字符串-YY-(神题
题意:有两个字符串,第一个字符串的任意两个字符可以交换位置,交换位置后的两个字符要+1,也就是a变成b,z变成a,问第一个字符串能否最终变成第二个字符串。分析:神题!长度为2的和长度大于2的分开讨论,但是都是直接yy大法。长度为2的好想,自己想。长度大于2的,这篇博客写得很详细点击打开链接,谢谢博主。代码:#include#includeusing namespace原创 2015-08-04 22:24:20 · 1685 阅读 · 0 评论 -
HDU 4336 集齐方便面卡片的期望-期望dp 或 容斥原理 -(二进制压缩辅助)
题意:要集齐n种卡片,现已知每打开一袋方便面得到每种卡片的概率Pi,Pi的和小于等于1,求集齐这n种卡片需要买的方便面的期望。分析:一、期望dp,这题要用二进制压缩,这是很显然的。状态:dp[i]现在已经收集了i种卡片到达收集所有卡片的期望。这个状态能转移到的状态有:1).dp[i](下次打开的方便面得到的卡片是已经收集过的);2).dp[i|(1所以方程:dp[i]=Pi * d原创 2015-08-01 18:26:58 · 2806 阅读 · 0 评论 -
Gym 100625H 多边形面积-计算几何
题意:输入多边形的n个顶点,现在假设在第一二个顶点连线的中点有一个照相机,这个相机的视角与这条边的夹角是45度,求阴影的面积和多边形总面积的比值。分析:纯粹的几何题,会用向量求面积、交点、判断点在不在两点之间就行了。熟能生巧。代码:#include#include#include#include#define eps 1e-10using namespace std;con原创 2015-08-13 18:47:15 · 844 阅读 · 0 评论 -
!HDU 4334 集合各出一数和为0是否存在-思维、卡时间-(指针的妙用)
题意:有5个集合,集合的大小是n,每一个集合出一个数,问能不能找到五个数的和为0。数据范围:T分析:暴力枚举是n^5*T,超时,那么就要用一些技巧了。这里有一个指针的妙用:如何在O(n)的复杂度找A,B,使得A+B==C(A,B分别属于一个数列a,b)。做法是先把a,b分别按升序排序,然后一个指针i指向a的首,指针j指向b的尾,判定指针指向的数的和是否==C,若等于则结束查找,若小于,原创 2015-08-01 23:31:04 · 845 阅读 · 0 评论 -
HDU 5319 两把刷子刷墙问题(多校)-直接模拟
题意:有两把刷子,一把刷红色,一把刷蓝色,红色的方向是东南,蓝色的方向是西北,红色加蓝色等于绿色,现在已知这面墙当前的状态,求从白墙到这个状态最少刷了多少次分析:多校题,所以尽管我一开始就觉得是直接模拟没有什么技巧,还是一直不敢交。1A很开心,加油!代码:#include#include#includeusing namespace std;int t,n;string a[原创 2015-07-28 17:58:37 · 1523 阅读 · 0 评论 -
!HDU 4193 循环序列前缀和非负-单调队列-(区间最值)
题意:一个数列,求分别以每个元素为首位时(循环),前缀和都非负的序列个数分析:首先是个循环序列问题,所以要做处理:把序列复制一遍变成2*n的序列,这样任意一个长度为n的区间就是一种序列,共n种然后求前缀和就可以用sum[j]-sum[i-1],这个式子表示以第i的元素为首位的序列,然后以第j个元素结尾的前缀和。同一个序列的不同结尾的前缀和每次都是减sum[i-1],只有sum[j]不同原创 2015-07-26 23:41:47 · 1129 阅读 · 0 评论 -
HDU 5326 公司人员管理树问题(多校)-简单dp
题意:给出一个公司的人员管理树,求直接和间接下属共k人的人有多少。分析:刚开始一看是树就吓到了,不敢做,后来咬着牙一想,不难啊,G哥说是dp,我用的我也不知道的方法,过了。我的方法就是用vis[i][j]记录i与j的直接隶属关系,然后通过vis[i][j]和vis[j][k]又能找到vis[i][k]的间接隶属关系,a[i]+=a[j],a[i]+=a[k]即可。相信自己。这是G哥代码:原创 2015-07-28 18:15:12 · 817 阅读 · 0 评论 -
!HDU 4283 屌丝联谊会-区间dp
题意:一群屌丝排队参加联谊,每个人都有屌丝值,如果他是第k个进场的,那么他的愤怒值就是(K-1)*Di,主办方想使所有屌丝的愤怒值总和最小,就用一个黑屋子来改变屌丝的进场顺序,黑屋子实际上是一个栈,先进后出。现在要求用这个栈能得到的最小的愤怒值总和是多少。分析:难点在于你不知道用了多少次黑屋子、用在哪些人身上以及每次各自进黑屋子的人数。很容易知道每个决策都会影响最终结果,那么我们就想用dp原创 2015-07-27 22:56:53 · 1030 阅读 · 0 评论 -
!codeforces 399C Cards-数论&贪心-(暴力枚举)
题意:有两种字符x和o,计算相同的连续字符的个数的平方,然后用o的平方和减去x的平方和,求最大的结果,并输出相应的序列。分析:数论知识是:要使o1^2+o2^2+.....尽可能的大,就要让o尽量凑到一起使它尽量长;要使x1^2+x2^2+.....尽可能的小,就要尽量分散他们,因此每次分的时候采用均分的方式用上面的理论为基础,然后枚举把o和x分的块数,不断更新结果。每一块的长度用上面原创 2015-07-24 01:35:04 · 1256 阅读 · 0 评论 -
!CodeForces 287B--(贪心、二分)
题意:有2到k个出水管的k-1个水管,有n个房子,求用最少的水管把水送到每一家分析:贪心思想从最大的开始用,只要求出等差数列的和大于等于n的最小的即为所求。(注意:不用管实际结果是不是真的用等差数列,因为只要) 二分法找每次计算的等差数列和的最左值。原创 2015-05-21 17:01:43 · 936 阅读 · 0 评论 -
Codeforces 71C--剪枝
题意:圆上均匀的分布n个点,每个点的值为1或者0,求是否存在以1(不需要用完所有值1的点)为顶点的正多边形分析:由于n个点已经是均匀分布的所以如果存在正多边形那么边数一定是n的约束(仔细思考),所以约束条件又多了一些 初步分析数据范围是10的5次方,枚举会超时,但是其实加上正多边形的条件剪枝不会超时代码:#includeusing namespace std;原创 2015-05-19 17:40:16 · 1468 阅读 · 1 评论 -
Codeforces 358B--string--(简单的字符匹配)
题意:一句话加密。每个单词的前后都要加上"分析:简单的字符匹配的题。 先预处理需要加密的句子,然后与输入的密文比较。主要是注意积累string的用法,还有本题预处理的方法。#include#includeusing namespace std;int main(){ string a,b,c; int n; cin>>n; b="<3"; whi原创 2015-04-09 12:49:36 · 814 阅读 · 0 评论 -
codeforces 322B--(YY题)
codeforces 322B原创 2015-03-29 23:22:16 · 718 阅读 · 0 评论 -
!HDU 4380 三角屋内有奇数个宝藏的三角形有多少个-计算几何-(向量叉乘&线段与点的关系&暴力枚举)
题意:小明要买三座房子,这三个房子构成一个三角形,已知n个房子的坐标,任何三个房子都不在一条直线上,又已知有m个宝藏的坐标,问房子构成的三角形内有奇数个宝藏的三角形有多少个。数据范围:n(3~100),m(1~1000)分析:简单的计算几何。记住这题的做法。三角形内的点的个数=上面的线段下面的点的个数 -- 下面两条线段下面的点的个数(或者下面一条线段减上面两条线段,看具体位置情况,所原创 2015-08-07 23:17:28 · 1492 阅读 · 0 评论 -
HDU 4175 多时段多课最小能量消耗问题-dp-(数塔模型)
题意:有c个时段的课,每个时段有t种课,每种课对应一个能量消耗值,从一节课转移到另一节课移动的距离为n,则移动消耗的能量也是n,现在小明要上课,他全时段的课都要上,同一时段只能选一种课,并且一天结束之后还要赶到L的位置,求他的最小能量消耗。分析:数塔模型,从后往前推;三重循环。20*25*1000*1000不会超时(20是tests)。为什么是数塔模型呢,因为分成了c段,每段必须选且只能选原创 2015-07-28 23:08:46 · 1011 阅读 · 0 评论 -
!HDU 4311 最小曼哈顿距离-思维&卡时间-(横纵坐标分开算,排序)
题意:有n个点,求以这n个点中的某一点为起点,到各点的曼哈顿距离和最小是多少分析:暴力枚举又要超时,这种题一般都是考思维了,多半都是用技巧找到一个高效的方法。个人觉得这题跟上一篇文章的题是一个类型。这题也是用“分治”,虽说题目要求的是曼哈顿距离,但是我们为什么真的就要一步到位的求呢,可以横纵坐标分开求,先x排序,然后遍历一遍,求出横坐标的距离,然后y排序,遍历一遍求出坐标的距离加在刚才原创 2015-08-02 00:14:03 · 3781 阅读 · 0 评论 -
HDU 4355 数轴上的点找使Si^3*Wi最小的和-浮点数三分
题意:一个数轴上有n个点,现在要找一个点到所有点的距离Si的立方乘以点的权Wi的和最小分析:三分。浮点数的二分或者三分可以直接用一个数字来限制查找的次数。TLE了几次,把查找次数从10000改到100就过了,本来以为数据范围比较大,100的精度不够。代码:#include#include#include#include#include#define eps 1e-8#def原创 2015-08-01 17:56:57 · 802 阅读 · 0 评论 -
!HDU 5371 最长双回文串(多校7)-卡时间-(manacher+排序+set+lower_bound())
题意:给定一个有n个数字的序列,找出一个连续的子序列满足这样的条件:平均分成三段,第一段与第三段一样,第二段是第一段的倒序。求这样的子序列的最大长度。数据范围:n~100000分析:上面的条件抽象出来其实就是双回文串,所以题目就是求一个序列的最长双回文串。主体做法是:1.先用manacher算法O(n)求出每个元素的最大回文半径;2.把每个元素看成一个圆心,那么两个点能构成双回原创 2015-08-12 01:42:19 · 1031 阅读 · 0 评论 -
!HDU 5317 求区间里两个数的质因数个数的gcd的最大值-预处理
题意:设一个数i的质因数个数为F(i),现给你一个区间[l~r],求max(F[i],F[j]) 数据范围:10^6分析:预处理出所有的F[i],O(nlgn),10^6不会超时;然后查询用O(7),查询不能用O(n),因为有多个查询会超时。区间问题减少查询时间复杂度多半类似一个区间的和用两个前缀和相减的方式,前缀和可以在预处理的时候计算,然后区间查询是用两个前缀和相减就行了。如su原创 2015-07-30 23:19:59 · 1300 阅读 · 0 评论 -
HDU 5327 区间里由不同的数字组成的数的个数-set-(枚举)
题意:形如12345是我们要找的数,形如11是不合法的数,找出区间[a~b]里的合法数的个数,1分析:预处理,枚举从1开始到i结束的区间的合法数的个数,然后输入一个区间就输出sum[b]-sum[a-1]即可。这里借助set工具,利用它的count()函数,枚举数i,判定它是否为合法的数,方法是取它的每一位,然后在set里对这一位计数,如果 !=0,说明set里已经有相同的数字了,那么这个数就原创 2015-07-30 20:13:26 · 927 阅读 · 0 评论