HDU 4303 Contest 1】的更多相关文章

说实话,挺复杂的一道题. 我采用栈的方式,DFS在搜索完一个节点的所有子结点后,通过排序,加快计算该结点所有可能的路径:子结点与子结点的连通,子结点与父结点的连通,通过父结点与各祖先结点的连通.同时记录路径数计算.思路清晰就能写出来了. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define LL __int64 const int N=300…
HDU 4303 Hourai Jeweled 解题报告 评测地址: http://acm.hdu.edu.cn/showproblem.php?pid=4303 评测地址: https://xoj.red/contests/view/1155/1 题目描述 Kaguya Houraisan was once a princess of the Lunarians, a race of people living on the Moon. She was exiled to Earth over…
http://acm.hdu.edu.cn/showproblem.php?pid=4303 题意:给出一棵树,树上的每一个节点都有一个权值,每条边有一个颜色,如果一条路径上相邻边的颜色都是不同的,那么它就是符合要求的.求出所有符合要求的路径上的节点的权值和. 思路:num[u]表示u节点下有几条符合要求的子树路径,sum[u]表示u为起点(或者终点也可以)往子树方向符合要求的路径权值和. 如图,u的父节点颜色为1,u->v的边颜色为2,那么此时u可以和v相连,num[v]就是v保留的路径数,这…
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…
Hourai Jeweled Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 163840/163840 K (Java/Others)Total Submission(s): 1149    Accepted Submission(s): 457 Problem Description Kaguya Houraisan was once a princess of the Lunarians, a race of people l…
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];…
意甲冠军: long long ans = 0; for(int i = 1; i <= n; i++) for(int j = i+1; j <= n; j++) ans += F(i,j); F(i,j)表示i点到j点路径上全部的点权和. 若i->j路径上存在2条相邻边边权同样则 F(i,j) = 0 问:ans的值. int乘法爆掉了我也醉了. .. 思路: 和网上的统计边方法不同,这里是用统计点出现的次数来计算 我们计算每一个点i 出现的次数,则答案就是 i的次数*i的点权 =&…
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,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/((…
只需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…