HDU 4321 Contest 3】的更多相关文章

题意:给定a和b,n,让你求b+a, b+2*a, .......b+n*a里面有多少1. 当统计第K位的时候 可以注意到 第 B+T*A 和 B+(T+2^(K+1))*A 位是相同的 那么 第K位的时候 只需要统计2^(K + 1)  - 1次就可以了 当统计第K位的时候 可以注意到 连续的 (2^K)/A都是连续的0 或者连续的1 所以可以考虑直接连续记录(2^K)/A个结果. 那么 第K位的时候 只需要统计N / ((2^K)/A)次就可以了 那么 第K位的时候 只需要统计 2^K/((…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4321 ------------------------------------------------------------------------------- 虽然有更优美的做法 不过数据范围还是可以数位$DP$的 即把模型转化为 在区间内 $mod\ a  = b\ mod\ a$ 的数所含$1$的个数之和 四维的数组分别记录 枚举到第$x$位 是否达到上限 $mod\ a$ 的余数 当前…
Problem Description In the ACM International Collegiate Programming Contest, each team consist of three students. And the teams are given 5 hours to solve between 8 and 12 programming problems.  On Mars, there is programming contest, too. Each team c…
意甲冠军:N个人M通过主打歌有自己的期望,每个问题发送人玩.它不能超过随机播放的次数1,追求最大业绩预期 (1 ≤ N ≤ 10,1 ≤ M ≤ 1000). 主题链接:pid=5045" target="_blank">http://acm.hdu.edu.cn/showproblem.php?pid=5045 -->>设dp[i][j]表示已出战了前i - 1道题目,已出战的人的状态序列为j,如今要做第i道题目的最大期望.则最后要求的结果为max{dp[…
Contest Problem Description In the ACM International Collegiate Programming Contest, each team consist of three students. And the teams are given 5 hours to solve between 8 and 12 programming problems. On Mars, there is programming contest, too. Each…
Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2653    Accepted Submission(s): 579 Problem Description A coding contest will be held in this university, in a huge playground. The…
题解:我们使用一个二位数组dp[i][j]记录进行到第i个任务时,人组合为j时的最大和(这里的j我们用二进制的每位相应一个人). 详细见代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; typedef long long ll; double s[11][1010]; double dp[1010][1050];…
pid=5045">主题链接~~> 做题感悟:比赛时这题后来才写的,有点小尴尬.两个人商议着写写了非常久才写出来,I want to Powerful ,I believe me . 解题思路: 遗憾 ! 感觉领悟能力太低 .由于随意时刻随意两个人做的题不超过 1 题 ,so~>  必须是一轮一轮的来(n 道题一轮),每一个人在一轮中仅仅能做一题.假设多做一题就,有可能某个人没选,某个人选择了两道,这样就不符合规定了 . 用 1  代表选择.0  代表没选择.进行某一行的时候就…
利用降幂公式..呃,还是自己去搜题解吧.知道降幂公式后,就不难了. #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define LL unsigned long long using namespace std; bool mod[100005]; LL PHI(LL P){ LL ret=1; for(LL i=2;i*i<=P;i++)…
树状数组,主要是抓住要求连续1的个数.这样,初始时,相同的加1,不同的加0. 查询时,用二分搜索右边界.就是比较当前mid-l+1的值与他们之间1的个数(这可以通过树状数组求区间和得出),记录右边界即可. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string.h> #define lowbit(x) ((x)&a…
本来以为是一道水题,好吧,做了才知道,出题的人有多牛.二分搜索是不可能的了,因为会超内存... 看到别人的搜索两个集合的提示,我就自己一边去想了.终于想出来了: 可以这样做,先把每两个集合的和值枚举出来并成一个大集合,排序,去重.剩下一个集合,于是,共三个集合. 枚举小的那个集合的元素,搜索两个大的集合.可以这样做,定义一个初始为指向最小元素的指针,一个指向最大元素的指针(两个指针是指向不同的集合的),两者之和相等则返回,小于则移动小指针+1,否则移动大指针-1.直至二者相等退出.然后再用两个指…
一开始就想到了扩展KMP,因为只有扩展KMP才是处理后缀的.但忽然短路以为扩展KMP求的是最长公共后缀,囧....又浪费了很多时间,都是对这个算法练得不多 再看那个扩展KMP算法之后,就很确定要的就是这个算法了.嗯,如果直接用扩展KMP,是会超时的.后来看了别人一个很巧妙的处理,把一个串复制一下两个串拼起来,再求扩展KMP.天才的做法啊... 还需要考虑一个问题,就是判重.这个真心不懂,总觉得和循环有点关系,但却想不到什么好方法.好吧,其实这个算法我也懂的,但很久没用过了,用KMP求循环节.当这…
顶好的一道题.其实,是POJ 2411的升级版.但POJ 2411我用的插头DP来做,一时没想到那道题怎么用状态DP,于是回头看POJ 2411那一道的状态DP,其实也很简单,就是每一行都设一个状态,用位来表示,如果上一行为0,则当前行必定是要竖着放的.填1.否则,当前行的位置可以横放填两个格子为1,也可以不放,为0.于是,看上一行的状态能转移到哪些状态,就可以了. 这一道也是一样的想做法,DFS看开始时有哪些状态,记在一个一维矩阵里.因为有一些状态最开始是达不到的,如奇数个1,或者一些不连续1…
一个很直观的想法是,求出每个点上下左右能到达的最大长度.然后枚举其斜边...没想到过了.... 当然,题解有一个很巧妙的优化,利用树状数组,那个太巧妙了. #include<iostream> #include<cmath> #include<cstdio> #include<vector> #include<cstring> #include<algorithm> using namespace std; int t,T,ans,s…
三个摄像头,在XOY上与立体的点求出在平面上的交点,然后求出凸包.三个凸包相交的面积即是所求,即是可以用半平面交的方法求解了. 模板题了.代码拿别人的. #include<cmath> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int mm=111; typedef double DIY; struct point { DIY x,y;…
悬线法可解,稍有点烦琐. #include <iostream> #include <cstdio> #include <cstring> #include <string.h> using namespace std; char map[1010][1010]; int lefts[1010][1010],heights[1010][1010],rights[1010][1010]; int CountSingle(int n,int m,char sin…
果然换个编译器就过了.总的来说,不难,不过就是处理一些空格.学习了一个新的类 istringstream可以按空格划分.然后,那条式子要理解. 式子的意义是: 找到一个串,该串在query中是第几个找到/它的实际位置.之和再除以给出的有几个串就是AVEP #include <iostream> #include <cstdio> #include <sstream> #include <map> #include <string> #includ…
http://www.cnblogs.com/staginner/archive/2012/08/13/2636826.html 自己看过后两周吧,重新写了一遍.很受启发的.对于0.1,可以使用最小割的思想来做,以前有听说过0.1规划的问题,估计就是这样的了.对这个题目使用最小割 ,是一个非常巧妙的思想. 我把别人的题解复制过来吧. 从本质上讲,之所以能够用最大流解决这个问题,关键在于最大流可以求解下面这个函数的最小值: 接下来就分析一下如何用最大流求解上面这个函数的极值. 首先xi一共只有两种…
很明显的区间加减单点查询.但由于规模大,于是离散化.在离散化的时候,可以把要查询的点也加入离散化的数组中. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #define lowbit(x) ((x)&(-x)) #define LL __int64 using namespace std; int tpoint[400010]; int sa…
直接DFS即可 #include <iostream> #include <string.h> #include <algorithm> #include <cstdio> using namespace std; bool vis[2010]; char map[2010][2010]; struct e{ int u,v; int next; }edge[2050000]; int head[2010],tot; void addedge(int u,i…
编辑距离,经典的了.动态规划枚举即过. #include <iostream> #include <cstdio> #include <string.h> #include <algorithm> using namespace std; char bgn[1505][15]; char tmp[15]; int dp[15]; int main(){ int T,n,m,kase=0,e,cnt,pre,tpre; scanf("%d"…
只需A的全部质因数包含在B中即可. #include <iostream> #include <cstdio> #define LL __int64 #include <algorithm> using namespace std; LL gcd(LL a,LL b){ if (b==0) return a; return gcd(b,a%b); } int main(){ int T,kase=0; LL A,B; scanf("%d",&…
可以知道,逃出的人中,最后一个应当是A+B最长的,这是很容易发现的.那么,最选逃出去的必定是A+B最短的.这符合最优. 于是,可以把各小矮人按A+B的和由大到小排序.定义DP[i][j]为i个人中逃出了j个人至少需要“之前”的留在井中的未逃出去的小矮人的高度和.注意这个值是可以为负数的,是负数,则证明需要之前有人留下,这些i个人足可以把j个人送出去. 那么,有DP[i][j]=min{dp[i-1][j]-a[i],max(dp[i-1][j-1],H-sumA[i]-b[i])}. 解释一下递…
很明显的树形DP了.但网上有的说可以用并查集.... 考虑一棵子树,当根结点有机器人时,则必定所有子树都要和根结点断开,而根结点向上返回的路径值则为其父结点与根结点连边的权值. 当根结点安全时,假设其子树有K个危险结点,而由于K个结点需要两两不能相连,那么,至少断开K-1个结点.则把权值最小的K-1断开即可.而剩下的那个结点与根结点的边权值则返上至上一层.这时,相当于K-1个结点都从树中剪去,变成了一条单路径的树了吧,则若要断开剩下的结点与其他点的通路(假设要与祖父结点断开),则必定是要断开剩下…
简单的一题,使用类DIJK的算法就可以了. #include <iostream> #include <cstdio> #include <queue> #include <algorithm> using namespace std; struct Edge{ int u,v; double lose; int next; }edge[2500050]; int head[50010]; bool vis[50010]; int tot; void add…
题目要求两点间的最大值作为距离即: 即是切比雪夫距离.而切比雪夫距离与曼哈顿距离的转换却很巧妙. 把平面坐标所有点绕原点逆向旋转45度后,所得点的曼哈顿距离之和除以√2,即是切雪比夫距离.旋转点的公式是 提取无理数,即每个新坐标可以是(x-y,x+y).计算其曼哈顿距离后除以2即可. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #define LL…
求的是曼哈顿距离.可以把X,Y的距离分开来求.其中,求X.Y的距离可以通过排序后递推的方式求出值的. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #define LL __int64 using namespace std; struct point{ int x,y; int num; }acm[100005]; int n; bool cmpx…
贪心,注意排序条件. #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int N=25; struct En{ int DSP,HP; }E[N]; bool cmp(En a,En b){ if(a.DSP*1.0/a.HP>b.DSP*1.0/b.HP) return true; return false; } int main(){ i…
最大流建图.开始以为旧桥有1000座,没敢用枚举,后来看看题目发现了只是十二座.枚举桥的状态没问题. 对于隧道的容量W,可以虚拟出第三个结点表示,如u->v.增加一个点p,u->p(INF),p->v(INF),p->End(W); #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; con…
纯BFS+优先队列扩展. #include <iostream> #include <cstdio> #include <cstring> #include <string.h> #include <queue> using namespace std; bool vis[5100]; char str[5100]; struct point{ int x,y; int cost; bool operator < (const point…