摘要: 今天比赛的时候做的一个坑题。深坑啊。题目意思是给你一个有n个数的数字序列。要你判断对于这个序列是都满足任意一个子序列都至少含有一个只出现一次的数字。看完题目后没什么思路,一直以为要用线段树,每次删除一个点,然后更新,后来发现wa了,算法有问题。后来殷犇讲了一种水过去的方法,听完后瞬间就水过了。其实我们可以这样去做,对于数组中的每个数,我们建立一个指针指向这个数字下一次在数组中出现的位置。然后核心的水的地方来了,如果我们已知一个区间中存在某一个数字只出现一次,假设区间为[l,r],这个只出现一次的数字的位置为x,那么我们只要去验证[l,x-1]和[x+1,r]是否分别满足即可。同时为了水得更加有 阅读全文
posted @ 2013-10-03 17:07 092000 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 啦啦啦。这是杭州网赛的一个题目,当时没做出来,当然这个想法确实比较难想到。题目质量很高,这个题目也很特别,以前都没做过类似的题目。让我又一次体验了线段树的强大力量。题目的意思是给你n个数a1-an。对于任何一个区间[l,r],它所对应的值为这个区间内没有出现的最小非负整数,求所有1 2 #include 3 #include 4 #include 5 #define maxn 200200 6 #define ll long long 7 using namespace std; 8 9 int a[maxn],b[maxn],col[4*maxn],next[maxn... 阅读全文
posted @ 2013-10-02 10:17 092000 阅读(625) 评论(0) 推荐(0) 编辑
摘要: 又来一发水题。解同余方程而已,用类似于剩余定理的方法就O了。直接上代码:(注意要判断是否有解这种情况)#include #include #define ll long longusing namespace std;ll c[22],m[22],n,t,tot;void exgcd(ll A,ll B,ll& d,ll& x,ll& y){ if (B==0) { x=1,y=0,d=A; } else { exgcd(B,A%B,d,y,x); y-=A/B*x; }}ll china(){ bool ans=true; ll am=m[1],d,y0,z0; .. 阅读全文
posted @ 2013-10-01 18:28 092000 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 再来一发水体,是为了照应上一发水题。再次也特别说明一下,白书上的中国剩余定理的模板不靠谱。老子刚刚用柏树上的模板交上去,简直wa出翔啊。下面隆重推荐安叔版同余方程组的求解方法。反正这个版本十分强大,适用于各种情况。题目的意思是告诉你I和a,接下来有I个mi,它所对应的余数ai=mi-a;这里我用白书上的模板交上去就wa了哦,用这个版本吧。#include #include #define ll long longusing namespace std;ll c[11],m[11],n,t;void exgcd(ll A,ll B,ll& d,ll& x,ll& y){ 阅读全文
posted @ 2013-10-01 18:11 092000 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 好久没写什么数论,同余之类的东西了。昨天第一次用了剩余定理解题,今天上百度搜了一下hdu中国剩余定理。于是就发现了这个题目。题目的意思很简单。就是告诉你n个m[i],和n个a[i]。表示一个数对m[i]取模的值为a[i]。乍一看以为这个题目可以用中国剩余定理,但是看仔细了吗?这里的mi并没有说是互素的哦。肿么办?只能用安叔以前说的解同余方程的那种土方法了。上代码:(我稍微改进了一下,根据题目的具体情况)。#include #include #define ll long long#define maxn 10using namespace std;ll c[maxn],m[maxn],n,am 阅读全文
posted @ 2013-10-01 17:34 092000 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 昨天比赛被虐的这个题目。今天听斌牛讲过他的思路后就A掉了。题目的意思是要你求出bell数的第n项对95041567取模。首先,95041567=31*37*41*43*47;然后取模就是先分别取模,然后就用中国剩余定理合并了。现在的问题就是如何求出来B[n]对95041567分别取模的结果了哦。不错,现在你缺少的就是一个公式——B[P^m+n]==(B[n]+B[n+1])%P——P为任一个质数(来自维基百科)。这样的话我们就可以递推了哦。从大的开始往小的递推,每次减去一个最大的P^m,知道推到一个n就A掉了。代码如下:#include #include #include #include # 阅读全文
posted @ 2013-09-30 12:07 092000 阅读(402) 评论(0) 推荐(0) 编辑
摘要: 与其说这是一次重温AC自动机+dp,倒不如说这是个坑,而且把队友给深坑了。这个题目都没A得出来,我只觉得我以前的AC自动机的题目都白刷了——深坑啊。题目的意思是给你两个串,每个串只含有R或者D,要求有多少种长为(n+m)的串(其中有n个R,m个D)同时含有这两个串作为子串。(我就不说题目描述了)看完了题目我居然一开始用排列组合去做,搞了近一个小时,深坑队友啊。其实正解是用AC自动机来dp出解的。什么意思呢?把两个给定的串放到AC字典树上,并且弄好fail指针,变为tire图,构造好AC自动机,然后就是dp了!怎么dp呢?可以这样来做,f[x][y][z][k]表示在第x个点,走了y个R,z个D 阅读全文
posted @ 2013-09-23 21:04 092000 阅读(884) 评论(0) 推荐(0) 编辑
摘要: 在比赛的时候,被这个题目虐死了,这一周中每当我有空闲时间我就总是思索这个题目的解题方法。终于在自己学过了mobius反演,并且看过别人写得解题思路后自己有了思路。下面说说我的解题思路吧。首先题目的意思很简单,给你n,m,p,问你能取出多少组有序对(x,y),使得gcd(x,y)的质因子的个数不超过p个(4看成有两个质因子)。首先声明这个题目是mobius反演的内容。不会的先学会了再看下面的内容。其实最先想到的肯定是和其他gcd统计问题差不多的思路啊,那就是先求mobius函数值,在求出它的和函数,在求答案的时候进行分块求解就OK了。总的时间复杂度是(n*log(n)+t*(sqrt(n)+sq 阅读全文
posted @ 2013-09-23 00:34 092000 阅读(2009) 评论(0) 推荐(1) 编辑
摘要: 今天比赛又是做得好水的。被狂虐啊。比赛两个多小时一直没出题,遒遒最先交的若干发都wa了。T_T我独自在一遍苦思了1006这个题,还好最后把这个题目A掉了,不然又是深坑队友。题目的意思我就不多说了,直接去hdu上看题意,题意很容易懂。这里说一下我的解题思路吧。首先题目总共有24条边这是不会变得,但是每次刚开始的一些条件是作为已知条件给你的,所以你不用考虑读数时候游戏者的智商问题。对于已知的步奏,我们只要模拟,并且记录两个人的得分就可以了。关键是后面怎么去处理呢?其实这个题目有一个关键的条件,虽然总边数有24,但是未知的边数只有12,12是个很小的数字,于是总共可能的状态数只有2^12个,可以用状 阅读全文
posted @ 2013-09-21 20:59 092000 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 今天做的一个很有成就感的题目,虽然经过我一个上午的痛苦挣扎,但是我觉得这个时间还是花的挺有意义的。题目的意思是给你a和b两个数(范围是10^7),从1-a选一个数x,从1-b中间选择一个数,问你能选出来gcd(a,b)=素数 的方案数有多少?这是一类典型的gcd统计问题,也是十分有代表性的一个题目。首先看到这个题目的时候我也不知道如何入手呢,任何的想法都逃不过T的阴影。后来去网上看了各路神牛的题解我才稍稍明白了过来呢。这个题目主要用到的只是就是莫比乌斯反演(Mobius)。其本质是容斥原理。如果我们假设d是一个质数,那么题目要我们求的就是 Sigama( mobi[j]*(n/(d*j))*( 阅读全文
posted @ 2013-09-19 16:05 092000 阅读(506) 评论(0) 推荐(0) 编辑