03 2014 档案

摘要:昨天是我负责这个题目的,最后没搞出来,真的给队伍拖后腿了。当时都推出来了 我假设最后结果是取了m个物品,则我把这个m个物品按取的先后编号为 k1 k2 k3 k4...km则最终结果就是 (k1.a+k2.a+...km.a)-((m-1)*k1.b+(m-2)*k2.b+....+1*k(m-1).b+0*km.b);由此可见最终的结果必定是从n个石头中选出m个石头,而且这m个石头要按b值的升序来取,因为按上述式子,这m个石头的a值顺序不影响结果,但b值越小的放前面就使得结果越优,这里也算用了一下贪心思想吧,不过是显而易见的。然后当时聪哥就照着这个敲了一个贪心的,WA了。。。之后就肯定了绝对 阅读全文
posted @ 2014-03-31 15:53 KRisen 阅读(260) 评论(0) 推荐(0)
摘要:http://acm.whu.edu.cn/land/problem/detail?problem_id=1542今天做武大的网赛题,哎,还是不够努力啊,只搞出三个这个题目一看就是个最短路,但是题目数据量太大,n^2承受不起,而且如果只是个最短路,那题目花这么大力气叙述有些城市可以互相免费干嘛呢这个是聪哥发现的神奇的细节,题目里说It is guaranteed that there are no more 200 coalitions.暂且把这个称作空域,也就是说最终免费的城市都成了一个块,而不同的块只有不超过200个,聪哥当时是这么分析的,如果真是这样的话,那可以先用并查集把这200个块求 阅读全文
posted @ 2014-03-30 22:36 KRisen 阅读(292) 评论(0) 推荐(0)
摘要:求火柴的组成的数字最多能组成多少种数字,典型的递推问题但是因为结果巨大,要用高精度运算一开始手写高精度,不仅挫的要死,最后还WA了。最后学了一下白书上面的bign类,相当方便啊。#include #include #include #include #include #define N 720using namespace std;struct bign{ int len,s[N]; bign() { memset(s,0,sizeof s); len=1; } bign(int num) {*this=num;} string ... 阅读全文
posted @ 2014-03-28 15:52 KRisen 阅读(446) 评论(3) 推荐(1)
摘要:Description Here is no naked girl nor naked runners, but a naked problem: you are to find the K-th smallest element in the set of all irreducible fractions , with 0#include using namespace std;int n,k;struct node{ int p,q; node operator+(const node &rhs) { node nt; nt.p=p+rhs... 阅读全文
posted @ 2014-03-27 17:45 KRisen 阅读(253) 评论(0) 推荐(0)
摘要:真是脑残。。。擦具体题解在这里http://www.cnblogs.com/windysai/p/3619222.html原本我为了防止两个数冲突,设置了好多判断,结果发现,如果两个数冲突,另外找两个 i,s+1-i输出就行了,因为两个数冲突 和必定为s+1,反正最后只是要求总和相同,找两个没有访问... 阅读全文
posted @ 2014-03-25 22:13 KRisen 阅读(291) 评论(0) 推荐(0)
摘要:今天下午Virtual了一套最近的CF题,第三题给TLE了,就跑过去上课了。这题给定一个由二进制表示的矩阵,当询问3的时候,求矩阵的值,矩阵的值是所有第i行乘以第i列的值的总和,然后还有1 b是翻转b行的数字 2 b是翻转b列的数字一开始没怎么考虑复杂度,就直接想暴力过,觉得只要把翻转先暂存,最后有询问3的时候再pushdown再计算一下结果。。。简直不经大脑思考,有10^6询问,我这样做,如果询问全部是3,那光是计算矩阵10^6次就能达到12次方的复杂度。。。真是一点都不考虑。。。后来在课上想了点方法,觉得把每一行和列的翻转都预处理一下,以及先把原始结果预处理出来,然后遇到翻转就跟之前的状态 阅读全文
posted @ 2014-03-24 20:37 KRisen 阅读(444) 评论(0) 推荐(0)
摘要:这个题目求某个字符串中含的最长的回文子串。就是一个很简单的LCS模型吗,而且我不明白为什么网上这么多人都说仿照某写法把字符串先逆序一下,然后求LCS,我只想问一下,有必要吗?直接按LCS的套路来就行了啊,只不过方式变了下,按上面的写法,又麻烦,又根本没利用的LCS的精髓思想即,先从间隔0位开始做起,然后是间隔1位。。2.。。n-1位,d[i][j]代表i到j的最长回文串个数于是就有 s[i]==s[j] d[i][j]=d[i+1][j-1]+2,否则就取 max(f[i+1][j],f[i][j-1]),不就行啦。还用得着上面那样搞?不过如果这个问题这么简单我也不会放到博客里来写了。主要是下 阅读全文
posted @ 2014-03-23 21:12 KRisen 阅读(291) 评论(0) 推荐(0)
摘要:依然非常失望,我为什么现在还是那么弱,今天就做出了一道题,垫底。一个大家都看出来的C题,我居然没找到规律,想了一会儿就放弃了。A题是这样的,有n种珍珠,给出这n种珍珠各自的数目,再给出一个M,表示每M个不同珍珠组成一个项链。求问最多可以组成多少个这样的项链。一开始想到的就是贪心,发现如果按升序排序,再从前往后去贪心,样例都过不了,如果从后往前贪,可以过样例,而且感觉好像没有什么不妥,于是就造就了今天的一直WA的情况。这个题目不能用贪心,从前往后贪的时候就发现有问题,即,某个珍珠可以此时用完,但如果等下一次跟后面一个数用完的话,得到的总数将会更大。。。其实同理,由后往前贪也会出现这种情况,只是恰 阅读全文
posted @ 2014-03-22 20:11 KRisen 阅读(202) 评论(0) 推荐(0)
摘要:这个题目刚看到还真不好下手,把一个是 k的倍数的长度的字符串分成len/k块,每块是k个字母,每个块可以重新组合,最后使得整个序列的相同字母尽量在一起,也就是说,最后会把序列从前往后扫,相连的相同字母算一个块,最后使得所有块最少。这个其实是个从前往后扫的问题,只要枚举最后一位是哪个,比如i-1块的最后一位是w,且w在第i块中确实有,则 f[i][j]=min(本身,f[i-1][w]+chunks[i]-1), chunks[i]表示该块有本身有多少个小块。#include #include #include #define INF 1<<30char ch[1010];int r 阅读全文
posted @ 2014-03-22 10:56 KRisen 阅读(207) 评论(0) 推荐(0)
摘要:求一个序列中 的2*n-1个数字 ,前n+1个数字为严格升序 后n+1个为严格降序,求最长的长度一开始还没想清楚怎么解,其实就是一个LCS问题,从头到尾以及反序求一下LCS由于 d[i]为包含了自身的LCS,所以每次比较 min(d1[i],d2[i]),再 2*min-1即可,d1和d2分别为正序和反序的LCS。由于时间卡的紧,要用之前学过的压栈法求LCS,时间复杂度为n*logn,中间出了一些问题,首先就是保存每个节点的LCS值的时候,如果该点是大于sta[top],那自然LCS为top+1,但是如果不是的话,我一开始写成top,原来不是,是要二分的那个位置才是。。。。还有就是二分一开始调 阅读全文
posted @ 2014-03-20 19:16 KRisen 阅读(231) 评论(0) 推荐(0)
摘要:一开始把它当成暴力来做了,即,从终点开始,枚举其最长的回文串,一旦是最长的,马上就ans++,再计算另外的部分。。。结果WA了事实证明就是一个简单DP,算出两个两个点组成的线段是否为回文,再用LCS的类似做法得到每个子结构的最优值。#include #include #define N 1010char s[N];int n,len,d[N][N],sum[N];int min(int a,int b){ if (a0) { tmp=1+sum[j-1]; } ... 阅读全文
posted @ 2014-03-20 15:05 KRisen 阅读(326) 评论(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,因为不但要考虑上下还要考虑左右,在DP里面就没有什么下了咯,但也至少除了考虑左右还要考虑上所以先枚举出在同一行满足条件的状态 即 某状态 若 s&(s#include #include #include #define N 11using namespace std;int dp[105][1<<N-3][1<<N-3];int A[105],m,n,calc[1<<N],num,state[1<<N];void init(){ num=0; for (int i=0;i<(1<<m);i 阅读全文
posted @ 2014-03-17 21:22 KRisen 阅读(191) 评论(0) 推荐(0)
摘要:这个题目搁置了这么久,终于搞完了。给n个人分配n个课程,已经告诉了你n个人对哪几门感兴趣,问最多有多少种分配方式我刚开始都没找到这怎么还可以状态dp,哪来的状态转移,想用暴力DFS,果断TLE的妥妥的。后来给殷犇发了这个题目,他还说你刷个这水题还刷得这包子劲,这题目就是后一行的状态由前一行得到,枚举当前这一行分配的状态,如果可行,就从后面的状态加过来由于状态只是从上一行转移过来,所以可以用滚动数组,用p表示当前,则!p就为上一行的,每次结束再把p置反即可。#include #include #include #define ll long longusing namespace std;int 阅读全文
posted @ 2014-03-17 11:18 KRisen 阅读(245) 评论(0) 推荐(0)
摘要:这个题目搞了我差不多一个下午,之前自己推出一个公式,即 f[n+k]=k*f[n]+f[n-1]结果发现根本不能用,无法降低复杂度。后来又个博客的做法相当叼,就按他的做法来了即 最终求得是 S(n)=f[b]+f[b+k]+f[b+2*k]....f[b+n*k] (原题的意思好像是不用加到第n项,但实测确实要加到该项)然后我们令 A={1,1}(标准的斐波那契矩阵) {1,0}发现 f[b]=A^b,f[b+k]=A^(b+k),....f[b+nk]=A^(b+nk);提取公共因子 A^b.S(n)=A^b*(E+A^K+A^K^2....A^K^n)再令K=A^K (K... 阅读全文
posted @ 2014-03-15 21:09 KRisen 阅读(383) 评论(0) 推荐(0)
摘要:这个题目上周对抗赛题目,搞了我好久 对数学这种不是很敏感其实都不是自己想出来的,看其他的资料和博客的推导 还是有点难度的,反正我是推不出来通过二项式定理的化简有两个博客写得比较好http://972169909-qq-com.iteye.com/blog/1863402http://www.cppblog.com/Yuan/archive/2010/08/13/123268.html反正构造好二项式之后,乘N次,就可以得到结果了,因为右边的式子 初始全部是x。#include #include #include #define ll __int64using namespace std;con 阅读全文
posted @ 2014-03-15 11:33 KRisen 阅读(463) 评论(0) 推荐(0)
摘要:因为最近学了Splay,刚看到这个题目总共四种操作,把某个数移到另一个数的左边 或者右边 交换两个数 翻转整个序列,马上想到用Splay,因为总点数和总操作数都为10^5,如果用Splay把操作优化到logN级别,应该是可以再1sec过得。于是我就好心急的在那里敲Splay,敲着敲着就发现不对劲了,题目要求的把x移到y的左边或者右边 或者交换x和y的值,不是指序列的第x位和y位,而是就直接指数值为x和y的那两个数。所以Splay根本就不适用所以还是回到链表来,其实用链表也挺简单的,一开始我还想复杂了,每个x和y就固定对应自己的节点x,y,进行4个操作的时候,前三个,只要把节点x和节点y连起来或 阅读全文
posted @ 2014-03-14 11:20 KRisen 阅读(530) 评论(0) 推荐(0)
摘要:必须要批评下自己了,首先就是这个题目的迟疑不定,去年做字典树的时候就碰到这个题目了,当时没什么好的想法,就暂时搁置了,其实想法应该有很多,只是居然没想到。同样都是对单词进行建树,并插入可能值,但是拨号键盘上的字母是对应多个的,给定拨号序列,有多种可能情况 输出其中最可能的一种,肯定要想到搜索啊,而且拨号数目不超过100,每个按键最多只对应4个字母,复杂度并不高,所以用dfs是可行的,对于每次递归深度,dfs找到最大的可能值的情况并输出。接下来就是要批评自己了,下午一点钟开始做这个题目,居然被一个小bug搞了一个多小时,都没过样例,就是我的dfs写挫了,而且我迟迟没找到原因。。。真的要反省自己的 阅读全文
posted @ 2014-03-13 20:25 KRisen 阅读(387) 评论(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)
摘要:题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次看下数据10的五次方,10的五次方的硬循环是避免不了了,很明显在计算被淹次数的时候要能缩到logN的复杂度才好。于是想到先对桥由低到高排一下序,然后获取前一次的落水值和这次的涨水值,只要桥高度在涨落直接的必定是又被淹了一次。要多次对序列的某个区间进行加操作,自然是线段树了,确定区间的时候,就用二分,在进行线段树的时候 用懒惰标记#include #include #include #include #define Lson (rt= 阅读全文
posted @ 2014-03-12 17:09 KRisen 阅读(384) 评论(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)
摘要:上次周赛碰到这个题目,居然都没思路,真是不应该啊,起码也应该想到枚举法。因为题目只允许每一row进行reverse操作,而每两列可以进行交换操作,所以首先把row的变化固定下来,即枚举第一列与第1-m列进行交换,之后逐个检查每一行第一列的状态 与 终态是否一致,不一致的话则该行就一定要进行reverse操作了,这样下来,每次枚举就把row的reverse变化给固定下来,接下来只要枚举 接下来的2-m行互相的列变换即可,只需一个嵌套循环即可,总的循环也只是三重 而n和m仅有100,规模承担的起一个简单的枚举暴力题 虽然说还是带有一点技巧的,怎么比赛的时候就没想出来呢!!!#include #in 阅读全文
posted @ 2014-03-11 23:40 KRisen 阅读(353) 评论(0) 推荐(0)
摘要:第一次做树状数组,这个东西还是蛮神奇的,通过一个简单的C数组就可以表示出整个序列的值,并且可以用logN的复杂度进行改值与求和。这道题目我根本不知道怎么和树状数组扯上的关系,刚开始我想直接按图来遍历来做,后来用树状数组做完都跑了600+MS,那样估计是TLE了。做法就是用DFS把整个图重建一遍,代号小的点在叶子,代号大的点为根。记录每个根的起始点号为 idl,根点号为 idh,则求某个根的苹果和就直接调用树状数组的sum即可。不过前提是要建好树,我一开始不明白为什么要建一颗标准树,即就是按1 2 3 4。。。。,每个点有一个苹果的递增的标准树,因为整个图并不是按这个标准来建得,2号点C值为1号 阅读全文
posted @ 2014-03-08 21:26 KRisen 阅读(267) 评论(0) 推荐(0)
摘要:ZJU 三月月赛题,当时见这个题目没辙,没学过splay,敲了个链表TLE了,所以回来好好学了下Splay,这道题目是伸展树的第二题,对于伸展树的各项操作有了更多的理解,这题不同于上一题的用指针表示整个树,采用纯数组表示,null节点即为0节点,这样就带来一个问题,就是有时候会有事没事就指向0节点,结果把0节点也算在结果里面,弄得我要几个地方都判断下。#include #include #include #include #define N 310000using namespace std;int tot,root,n,m;int ch[N][2],val[N],gcdst[N][2],si 阅读全文
posted @ 2014-03-07 23:26 KRisen 阅读(356) 评论(0) 推荐(0)
摘要:上次ZOJ月赛碰到一个题目要求对序列中的某个区间求gcd,并且还要随时对某位数字进行修改 插入 删除,当时马上联想到线段树,但是线段树不支持增删,明显还是不可以的,然后就敲了个链表想暴力一下,结果TLE。那天回来后搜了下题解,发现大家都在说平衡树 Splay,就好好学了下,这玩意还是挺难学的,我看了好久。最后还是从网上找了三篇论文打印了下,趁着TCG讲数据库的时候(这课真的好催眠)好好看了下,才搞清楚基本的Splay操作这是第一道Splay题目,基本上是照着模板敲出来的,没办法,第一次学,好多地方不熟练,不过整个过程我已经形成了一个条理了,这倒是一大收获由于自己的粗心,好几个细节错了,调试了好 阅读全文
posted @ 2014-03-06 20:32 KRisen 阅读(331) 评论(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)
摘要:上次的ZJU月赛题,规则比较复杂,当时就连题意都没摸清楚,只觉得非常复杂比完后敲啊敲啊敲,连续WA啊,该反思下自己,没按照题意来设置条件,题目中说了 白球入袋并且。。。 给对手加分 ,白球未入袋并且。。。给对手加分,这个白球未入袋的情况也要加在判断条件里啊啊啊啊,还有就是有个地方要排序我居然忘了,好久都没发现。#include #include #include #include using namespace std;int n,m;int a[1010];int vis[10010];int ans[2];int hit[1010],c[1010];int main(){ while... 阅读全文
posted @ 2014-03-04 20:09 KRisen 阅读(286) 评论(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)