随笔分类 -  UVALive

摘要:题目要求给m个任务分配给n个机器,但最后任务量最多的那个机器的任务量尽量少,利用最大流,在最后的汇点那里设置关卡,二分结果,把机器到最终汇点的容量设置为该值,这样就达到题目条件,这样跑最大流 还能把m个任务跑完(最终流量为m),则可行,继续二分用的dinic#include #include #in... 阅读全文
posted @ 2014-10-06 11:37 KRisen 阅读(298) 评论(0) 推荐(0)
摘要:还是强连通分量的题目,但是这个题目不同的在于,问你最少要添加多少条有向边,使得整个图变成一个强连通分量然后结论是,找到那些入度为0的点的数目 和 出度为0的点的数目,取其最大值即可,怎么证明嘛。。。我也不好怎么证,不过细细一琢磨发现就是这样,改天找聪哥一起探讨下怎么证明#include #inclu... 阅读全文
posted @ 2014-08-10 16:26 KRisen 阅读(142) 评论(0) 推荐(0)
摘要:这个题首先要利用题目的特性,先贪心,否则无法进行DP因为求期望的话,越后面的乘的越大,所以为了得到最小值,应该把概率值降序排序,把大的数跟小的系数相乘然后这种dp的特性就是转移的时候,由 i推到i+1每次添加一个数,就要考虑这个新数应该和谁放在一组,枚举他放在哪一组即可dp[i][j]代表当前第i个... 阅读全文
posted @ 2014-07-22 23:50 KRisen 阅读(333) 评论(0) 推荐(0)
摘要:先输入n个字符串的字典,每个字符串的前缀+后缀可以组成新的合法字符串,但肯定是有重复的,问从给定的字符串,生成的所有可能的字符串为多少个把前缀和后缀压入字典树,达到前缀和后缀的去重,首先的总和即为前缀数目乘以后缀数目,之后为了去重,记录每个前后缀非第一个相同的每个字母,则每个相同字母必定会产生重复。... 阅读全文
posted @ 2014-07-19 21:00 KRisen 阅读(229) 评论(0) 推荐(0)
摘要:这题真是坑啊,题意不明,其实就是往桟里面压入空的set集合,所以之前的询问大小都是只有0,只有add的时候,才会产生新的占空间的集合用stack和set直接进行模拟#include #include #include #include #include #include using namespac... 阅读全文
posted @ 2014-07-17 21:59 KRisen 阅读(249) 评论(0) 推荐(0)
摘要:这个题意搞了半天才搞明白 就是如果定义一个d-summit,即从该点到另一个更高的点,经过的路径必定是比当前点低至少d高度的,如果该点是最高点,没有比他更高的,就直接视为顶点 其实就是个BFS染色,先按降序排序,然后每个点对其可到达的点染色,h-d的点为边界,走到这里就不用往下染了 然后其他店染色的... 阅读全文
posted @ 2014-07-17 21:57 KRisen 阅读(475) 评论(0) 推荐(0)
摘要:给定N个点的坐标,代表N各城市,有M种操作,共分两种,一种是连线,把两个点连起来(一旦构成连通图,这个连通图即为一个州),还有种询问操作,为y=c,(c为小数部分恒为.5的实数),问y=c这条线经过了多少个大周,这些州总共有多少个城市很明显要用到并查集,比较好的做法是把并查集落实到线段树上,并查集维... 阅读全文
posted @ 2014-07-16 14:12 KRisen 阅读(410) 评论(0) 推荐(0)
摘要:已知有 x[0-(n-1)],但是不知道具体的值,题目给定的信息 只有 I P V,说明 Xp=V,或者 I P Q V,说明 Xp ^ Xq=v,然后要求回答每个询问,询问的是 某任意的序列值Xp1^Xp2,,,,X^pk这个题目用加权并查集是这么处理的:1. f[]照样是代表父节点,照样进行路径... 阅读全文
posted @ 2014-07-01 14:09 KRisen 阅读(1156) 评论(0) 推荐(0)
摘要:首先黑点和白点是组成一个二分图这毫无疑问关键是题目中要求的所有黑白配的线不能交叉。。。一开始我也没想到这个怎么转化为二分图里面的算法。后来看书才知道,如果两两交叉,则可以把两根线当四边形的对角线,连四边形的两条边,则肯定不交叉,而且一个很明显的特征是,不交叉的两条线的他们的长度和 一定比交叉线的长度... 阅读全文
posted @ 2014-06-04 22:18 KRisen 阅读(281) 评论(0) 推荐(0)
摘要:这道题目让我学到了很多一道不走寻常路的题目,给定一串数列的 和 的正负号,即假设数列 为 a1,a2,a3.....an,则一致了 Sij的正负号或者是否等于0,Sij代表了 从 ai 到 aj的和。要你求出任意一种序列,满足题目给定的Sij条件确实是看了白书上的思路都还不太知道怎么写,然后看了LR... 阅读全文
posted @ 2014-05-26 22:52 KRisen 阅读(204) 评论(0) 推荐(0)
摘要:今天比赛的时候拿到的第一道题,其实挺简单的,求两等差序列中相同元素的个数,我想了一下就觉得,只要找到了第一个相等的点,然后后面求最大公约数就可以直接得到结果了网上叫什么拓展欧几里得,我反正是按照我们的思路来的关键是如何找到第一个相等的点,因为首项和公差能达到 10^9,项数可以达到10^18,我觉得... 阅读全文
posted @ 2014-05-18 20:38 KRisen 阅读(303) 评论(0) 推荐(0)
摘要:是时候要做做数学类的题目了这属于比较简单的矩阵快速幂了,因为有个已知的矩阵循环的结论,所以为了节约时空,只需要保留一行即可,这个稍微有点难写,也不是难写,主要是注意细节。其他的矩阵快速幂一下即可#include #include #include #include #define N 505#def... 阅读全文
posted @ 2014-04-24 22:18 KRisen 阅读(293) 评论(0) 推荐(0)
摘要:第二道AC自动机的题目了,之前参考的是网上一个博客算法,不怎么好,难写而且占空间后来参照大白书做的这题,代码简洁多了#include #include #include #include #include #include #define N 12000using namespace std;map mc; //防止模板里出现重复的struct AutoTrie{ int ch[N][28]; int val[N]; int f[N]; int cnt[N]; int last[N]; int sz; void init() { m... 阅读全文
posted @ 2014-04-11 21:55 KRisen 阅读(155) 评论(0) 推荐(0)
摘要:这个题目上周的对抗赛的,美国2013区域赛的题目,上次比赛真惨,就做出一道题,最多的也只做出两道,当时想把这题做出来,一直TLE。这个题目用挂在Hunnu OJ的数据可以过,但UVALive上死活过不了,好像UVALive卡的时间不太对,没人过了这道题。我当初是想用一个dp[s]表示键入状态,然后由dp[0]开始逐渐向上深搜,结果就TLE了,后来比较了一下别人的代码,,果然我这样还是不行不管我怎么优化,我这一维数组,不能对某个状态马上就返回,因为随时可以再被更新,但是如果用个二维数组,dp[s][i],表示在状态为s的时候,键入第i个字符时候的最小键入数目,就可以只更新一次,下次再遇到这个情况 阅读全文
posted @ 2014-03-19 15:56 KRisen 阅读(251) 评论(0) 推荐(0)
摘要:其实主要是想学一下字典树的写法,但这个题目又涉及到了DP;这个题目要求某些单词组成一个长子串的各种组合总数,数据量大,单纯枚举复杂度高,首先肯定是要把各个单词给建成字典树,但是之后该怎么推一时没想到。其实就是通过递推,从1扫到最后一位,由d[i]代表1-i位的时候的组合总数,则对d[i]进行扩张,凡是可以从第i+1位到第j位正好对应一个单词,则,d[j]+=d[i];这样递推完,d[len]即为最后结果为了表示某个单词的结尾,在字典树中再加一个变量 flag,当单词结尾的时候为1,否则为0,这样只要在树种读到了flag=1的时候,即表示读到这个单词。#include #include #inc 阅读全文
posted @ 2014-03-12 21:51 KRisen 阅读(394) 评论(0) 推荐(0)
摘要:大白书上的题目,比较巧妙的是其分析,为了求某个i点做裁判的时候的情况数,只要知道左边有多少比它小的记为ansc,右边有多少比它小的记为ansd,则总种数,必定为ansc*(右边总数-ansd)+ansd*(左边总数-ansc)。为了速度求出ansc和ansd,用到树状数组,这倒不是很难得地方,每次读到a[i],更新a[i]值+1即可。反过来求一次即可求出来 ansd注意最后数据可能超过32位整数,因此用long long树状数组的使用还有些不熟练。。。要继续加强#include #include #include using namespace std;int x[100005];long l 阅读全文
posted @ 2014-03-11 23:46 KRisen 阅读(264) 评论(0) 推荐(0)
摘要:这道题目的DP思想挺先进的,用状态DP来表示各个子巧克力块。原本是要 dp(S,x,y),S代表状态,x,y为边长,由于y可以用面积/x表示出来,就压缩到了只有两个变量,在转移过程也是很巧妙,枚举S的子集s0,然后 s1=S-s0来代表除该子集的另一个集合,接下来分两种情况,如果这个子集是通过把 S保留x,切割y,则转移到dp(s0,x)和dp(s1,x),另一种情况是转移到dp(s0,y)和dp(s1,y)。为了更加缩小状态,统一把转移方程的 x换成 min(x,sum[S]/x),sum为该状态下的面积#include #include #include //#include #defin 阅读全文
posted @ 2014-03-05 13:54 KRisen 阅读(233) 评论(0) 推荐(0)
摘要:这个题目我最初的做法沿用树形DP的做法,设置一个 dp[i][0]表示机器人在i点不回去的最短路径,dp[i][1]表示机器人在i点回去的最短路径,规划方向为i-1向i转移,结果发现这个不能用树形的结构去描述,当前状态不能仅仅靠前一个状态就决定好了,对于后面的点来说,可能当前点走另外一条路会好一些故,最后还是使用了书上的结构,其实也很简单,用d[i],表示收完从1-i所有的垃圾并送回原点的垃圾桶的最优距离,显然,最终结果就是d[n];则,如果某个j点满足 w(j+1,i)#include #include #include using namespace std;int d[100010];i 阅读全文
posted @ 2014-03-02 20:19 KRisen 阅读(468) 评论(0) 推荐(0)
摘要:就是经典约瑟夫环问题的裸题我一开始一直没理解这个递推是怎么来的,后来终于理解了假设问题是从n个人编号分别为0...n-1,取第k个,则第k个人编号为k-1的淘汰,剩下的编号为 0,1,2,3...k-2,k,k+1,k+2...此时因为从刚刚淘汰那个人的下一个开始数起,因此重新编号把k号设置为0,则k 0k+1 1...0 n-k1 n-k+1假设已经求得了n-1个人情况下的最终胜利者保存在f[n-1]中,则毫无疑问,该胜利者还原到原来的真正编号即为 (f[n-1]+k)%n (因为第二轮重新编号的时候,相当于把每个人的编号都减了k,因此重新+k即可恢复到原来编号)。由此,我们可以想象,当最. 阅读全文
posted @ 2014-02-26 14:46 KRisen 阅读(3796) 评论(1) 推荐(4)
摘要:题意很简单,在一串正整数序列中找一个连续的子序列使该序列和大于等于一个已知量S,但要求序列长度最短,通常喜欢暴力枚举这个题目跟大白书之前的一个题目很像,在数列A中 求 Ai-Aj最大 并且 i=S,则不断增加i,否则,就增加j。这样只是枚举了一下终点,而找到起点几乎是常数时间。#include #include #include using namespace std;int num[100010];int B[100010];int main(){ int n,s; while (scanf("%d%d",&n,&s)!=EOF) { for (int i 阅读全文
posted @ 2014-02-18 11:52 KRisen 阅读(274) 评论(0) 推荐(0)