自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Broken Wings

新浪微博 Geopelia 欢迎关注多多交流~

  • 博客(38)
  • 收藏
  • 关注

原创 codeforces round239 DIV2

p1 Line to Cashier超市排队结账,每扫描一件商品需要5秒,每个顾客需要15秒付钱。给出每个窗口的人数和每个人买的商品数,求排在最快的队伍时,最少要等多少时间。模拟...#include #include #include #include #include using namespace std;typedef long long ll;int n,m,ans

2014-03-30 17:37:25 609

原创 zoj3623 Battle Ships DP

N M表示N种战舰,防御塔生命值=M,接下来N行,每行两个数Ti表示建造一艘这种战舰需要的时间,Li表示这种战舰建造好后,每秒可以对塔造成Li伤害。求最少多少时间可以摧毁防御塔,同一时间只能造一艘战舰,种类任选。dp[i][j]表示第i时间,攻击力为j时,防御塔的生命值,可以得到两个转移方程dp[i][j]=dp[i-1][j]-j; dp[i][j]=dp[i-t[k]][j-a[k]]-(

2014-03-26 23:10:39 657

原创 zoj3631 Watashi's BG DFS

N个物品,M的容量。给出每个物品的体积,求最多能占用的空间。看题意就是个裸的背包,但是M很大,达到了10000000。注意到最多只有30个物品,那么直接DFS,加点剪枝就好了...#include #include #include #include #include using namespace std;typedef long long ll;bool cmp(int x,

2014-03-26 23:04:09 607

原创 zoj3267 Treasure Hunt II 模拟+枚举

N个城市,每个城市有一些金币,现在A,B两个人在同一个起点P,每人每秒可以从城市i移动到城市i+1或者i-1,并且任何时刻两人的距离不能超过M,求时间T内,两人最多能拿到多少金币。按照题意直接模拟就行,思路不难,代码挺蛋疼,好多细节的地方要考虑。考虑到每个城市的钱只能拿一次,那么两人如果往一个方向走是没意义的,所以一开始两人从起点向两侧走,直到距离为M,或者是时间耗尽了,如果时间耗尽,直接输出答案

2014-03-26 22:45:34 710

原创 SGU495 Kids and Prizes 概率

N个奖品,每个奖品包装在盒子当中,M个人一次来抽,每次抽完后不管是否抽到奖品,都把盒子包装好放回,求送出奖品的期望值。一开始以为是个概率DP的题,怎么推也没推出来公式,后来搜了下发现是个靠想法的题...对于每个盒子,考虑它不被所有人抽到的概率,就是((n-1)/n)^m再乘个m就是就是没有被抽到的奖品数的期望了...#include #include #include #include

2014-03-22 00:40:42 718

原创 hdu4336 Card Collector 状压+概率DP

N张卡片,没买一包,得到每一张卡片的概率为a1,a2...an。问平均状态下买多少包可以集齐所有卡片。就是求期望了,N=20,状态一共也就100W左右,记DP[k]为当前状态为k时,收集齐N张卡片的期望,那么可以推出状态转移方程DP[k]=1+(不增加新牌的概率)*DP[k]+sum(a[i]*dp[i]),其中状态i为状态k新添一张牌的状态,边界dp[1#include #include

2014-03-22 00:32:27 644

原创 zoj 3640 Help Me Escape 记忆化搜索

山洞有N个出口,每个出口都有一个难度c[i],如果当前的战斗力大于这条路的难度,就可以花t[i]天走出山洞,否则就会在这条路上被困1天,并且战斗力增加c[i],给出初始的战斗力求走出山洞期望的天数。dp[k]记录战斗力为k时走出山洞的概率,求期望时遍历每个山洞,如果k>c[i],那么dp[k]+=t[i]/n;否则dp[k]+=(1+dp[c[i]+k])/n。#include #inc

2014-03-21 18:18:00 627

原创 zoj3641 Information Sharing 并查集+set

一间教室,起初是空的,有三种命令1: "arrive Name m a1 a2 ..am"   名字为 Name的小朋友进来了,并且携带了m条信息,分别是a1,a2...am2: "share Name1 Name2" 名字为Name1,Name2的小朋友分享他们的信息。3: "check Name" 检查名字为Name的同学,并输出这个同学当前了解多少条不同的信息。

2014-03-20 21:13:38 621

原创 zoj3635-Cinema in Akiba 树状数组+二分

n个人去看电影,正好有n个座位,每个人手中的票上的号码为a[i],表示他进场的时候,需要做到当前从1---n中第a[i]个空位,给出m个查询,分别求出查询的人实际的座位位置。     用树状数组记录一下每个位置当前是否有人,那么对于一个位置i,就可以求出1---i当中有多少个空位,而i位置也就是当前第i-sum(i)个空位了,由于这个i-sum(i)是单调不减的,所以可以二分位置来求出当前的人

2014-03-20 19:01:40 690

原创 zoj-3633 Alice's present 离线线段树

给一列数,每次查询一个区间,求出这个区间中,从右到左第一个出现两次的数。       首先预处理一下每个数左边离他最近的相同的数的位置,读完数据后,按查询的右区间递增排个序,然后一个一个添加。添加到a[i]时,若l[i]不为0,那么对于右区间为i,左区间为1...l[i]的查询,答案就是i,这里可以用线段树成段赋值处理,要注意的一点是,每次记录一下上一次添加时的l[i]为last,如果本次

2014-03-20 03:38:15 721 1

原创 codeforces round237 DIV2

p1:Valera and X判断矩阵是否形同X,形同X就是对角线上元素相同,,其他位置上的所有元素相同并且不同于对角线上的元素。直接模拟判断...#include #include #include using namespace std;typedef long long ll;char s[440][440];int n;int main(){// freop

2014-03-20 02:15:39 572

原创 codeforces round236 DIV2

P1:Nuts直接贪心...由于数量不是很大,枚举也行..#include using namespace std;int k,a,b,v;int main(){ cin>>k>>a>>b>>v; int num=a/v; if (a%v) num++; int ans=0; int nw=0; while(b>0 && nw<n

2014-03-17 20:02:00 605

原创 UVA 11475 Extend to Palindrome KMP,后缀数组

给一个字符串,尽可能少的添加字符使他变成一个回文串,求添加之后的回文串。    这题kmp,后缀数组都能做,大体思路就是找一个最长的回文后缀,那么要添加的字符就是字符串除掉这个后缀后剩下的前缀了。找的时候可以反向拼接,构造后缀数组然后二分长度+遍历height判断;或者直接把原串接在翻转串的后面,求一下失配函数。不管是效率还是实现,感觉都是KMP好一点....KMP的代码:#inclu

2014-03-16 15:00:23 833

原创 poj1226 Substrings 后缀数组

给n个字符串,求一个最长的子串,使得这个子串或子串的‘逆’在所有的字符串中至少出现一次。直接把每一个串和它翻转后的结果串起来,并且中间用分隔符分开就行,注意同一个串和它的‘逆’编成相同的号,然后二分答案+遍历height分组判断就可以了。#include #include #include #include #include using namespace std;typedef

2014-03-16 12:20:15 594

原创 spoj220 Relevant Phrases of Annihilation

题意是给n个串,求出一个最长的子串在每个串中至少出现两次。直接二分答案来判断,因为题目里要求在一个串中,两次出现的位置不能有交叉,所以这要想办法特殊处理下,大体的思路还是循环height数组,按>=当前二分长度来分组,处理一组时,用两个数组分别记录一下本组后缀在各个串中出现的最大位置和最小位置,那么如果某一个串上他的最大位置和最小位置的差大于等于当前长度了,就是两个没有交叉的匹配了。     

2014-03-16 10:43:40 629

原创 poj 3415 Common Substrings 后缀数组

给两个字符串A,B,定义:S = {(i, j, k) | k≥K, A(i, k)=B(j, k)}.求有多少个三元组S。翻译一下就是枚举A中每一个长度大于等于k的子串在B中匹配,问全部成功匹配的次数,当然直接这么求得话肯定会T...这题之前用后缀自动机写过,感觉思路比后缀数组好想点...网上看到一个SA+单调栈的但由于智太硬了没看懂...然后又看到了一个神奇的做法..原帖:http://b

2014-03-13 21:04:56 612

原创 poj3693 ,spoj687 重复次数最多的连续重复子串 后缀数组

给一个字符串,给定一个字符串,求重复次数最多的连续重复子串。      09年罗穗骞的论文里有讲这题,先引用一下论文里的讲解:       先穷举长度L,然后求长度为L 的子串最多能连续出现几次。首先连续出现1 次是肯定可以的,所以这里只考虑至少2 次的情况。假设在原字符串中连续出现2 次,记这个子字符串为S,那么S 肯定包括了字符r[0], r[L], r[L*2],r[L*3], ……

2014-03-13 18:24:54 785

原创 HDU 3746 Cyclic Nacklace KMP

给一个字符串,给它增加x位可以变成一个由某个前缀重复2+次构成的串,求最小的x。    如果做过白书上KMP找寻环节那个题的话,这题就没难度了...n-f[n]就是最小循环节的长度,那么我们枚举一下倍数,在k*(n-f[n])刚好>n的时候,输出他们的差即可。#include #include #include #include #include using namespace

2014-03-10 21:07:13 577

原创 hdu3336 &&hdu 4552 KMP ,SAM

给一个串,求所有前缀在母串中出现的次数和。      还是利用失配函数来做,构造完失配函数,然后从末尾向前枚举,对于每个点,如果没有被访问过的话,就沿其失配路径走一遍,并且每经过一个未访问过节点,迭代层数+1(初始为0),若经过的是已经访问的节点,那么迭代层数不变;同时标记该点已访问,这个点为末尾的前缀出现的次数+当前迭代的层数,然后转移到向下一个点;对KMP的失配函数深入了解一点的话,这个思

2014-03-10 20:56:26 549

原创 codeforces 126B Password KMP

给一个串,求一个最长子串同时是母串的前缀,后缀,并且在前缀后缀之外有出现了一次。          首先构造好失配函数,从len开始沿失配路径走一遍并且标记沿途节点,为什么要标记,因为如果节点i在这条失配路径上,那么f[i]---i这个子串一定同时为母串的前缀和后缀,之后我们只要从len-1(排除后缀)到0枚举一边,在已标记的节点中找一个最大值就行。#include #include

2014-03-10 20:43:59 588

原创 poj3080,poj3450 多个字符串求最长公共子串问题 KMP,SA,SAM:

这两题都是给若干个字符串,求他们的最长公共子串,这类题可以KMP,后缀数组,后缀自动机都可以做,前两个复杂度是O(NlogN),最后一个理论上是O(N),后缀自动的做法参考spoj上这个题:http://blog.csdn.net/night_raven/article/details/12438039。     3080只有10个串,长度为60,用后缀数组的话,就把所有串串起来,求出heig

2014-03-09 22:28:23 1060

原创 poj2185 Milking Grid 二维kmp

给一个字符矩阵,求一个最小的矩阵,使得这个矩阵复制若干次可以完整包含原矩阵。首先考虑行,找出每行的最小重复单元的长度后,他们的最小公倍数就是横向上的最小单元长度;同理纵向上求出纵向上的最小单元长度,要注意的一点是如果这两个长度大于n或m得话,就取n或m,因为最长也就是他们本身的长度..那么现在的问题就是求一行(或一列)的最小重复单元了,求出该行的失配函数,len-f[len]就是这一行的最小重复单

2014-03-09 20:38:56 720 1

原创 poj2752 Seek the Name, Seek the Fame KMP

给一个字符串,求出所有前缀-后缀子串的长度,前缀-后缀子串定义为一个子串同时是母串的前缀和后缀。建好失配指针后,直接从末尾开始沿失配指针走一遍走到头就行,因为从ed转移到f[ed]得话,f[ed]---ed这段一定同时为后缀和前缀,而若i=f[ed]不为零,又有f[i]---i同时为原串的前缀和后缀,所以递归一边就能得到答案。#include #include #include #inc

2014-03-09 20:12:33 596

原创 codeforces 400e 线段树

N个数组成a[1][]这个序列,定义a[i+1][j]=a[i][j]&a[i][j+1],根据此公式可以推出一个数字三角形,现有m个操作,每次操作x,y把a[1][x]的数修改成y,并且输出修改后新的数字三角形中所有数的和。    首先要确定一点,连续k个1相连,构成的三角形中数字和(权值)是sum(1..k),那么对于原题中的三角形,我们可以按位拆分出最多17三角形(因为最大的数10W

2014-03-09 02:34:43 840

原创 bzoj1026 [SCOI2009]windy数 数位dp

定义windy数是没有前导零且相邻两位数字只差大于等于2的数,查询【A,B】之间有多少个windy数..dp的时候要特殊考虑下当前位以上全是0的情况,所以加一维状态,dp[pos][st][pre]表示第pos位,高一位的值是st,高位是否全为0时有多少个符合要求的数。#include #include #include #include #include using names

2014-03-07 20:23:15 844

原创 hdu2089 & hdu3555 基础数位DP

统计区间内有多少个符合要求的数,2089要的是不含4和62的数,3555要的是不含49的数..都是基础的数位统计问题,直接贴模板了...话说数位dp居然还有模板,果然是too young....2089#include #include #include #include #include typedef long long ll;using namespace std;in

2014-03-07 18:49:43 676

原创 ural 1996. Cipher Message 3 KMP+FFT

长度为N,M的两个字符串,每个串的单位元素是一个8位的01串,现在允许修改第二个串的每个单位元素的最后一位(0变1或者1变0),问最少要修改几个字符可以使得第二个串在第一个串中匹配,并输出最靠前的匹配位置。      首先把单位元素分成前七位和最后一位两部分,前七位可以看成一个0-127的数存起来,得到前七位组成两个串A,B和最后一位组成的两个串a,b。然后对A,B跑一边KMP,剩下的就是在匹

2014-03-07 15:20:54 904

原创 codeforces round 234 DIV2

p1:Inna and Choose Options      模拟,12张牌,每张牌上是X或O,现在可以按每行1,2,3,4,6,12张的方式摆放,若某种摆放方式使得其中任意一列全部是X这就是一种合理的方式,求所有合理的摆放方式。直接模拟...#include #include #include using namespace std;int n,m;char s[20];v

2014-03-06 02:08:12 750

原创 2013长沙网络赛G Goldbach FFT

先贴题目连接:http://acm.zju.edu.cn/changsha/showProblem.do?problemId=28       题意是给一个数n(1        首先筛素数,之后a,a*b,a*b*c,a*b+c都可以暴力求出来,那么难处理的主要就是a+b和a+b+c这两种情况,这里用两次fft来计算,第一次求出k=a+b中每个k各有多少中表示方法,这里注意判一下重,删掉

2014-03-05 18:18:36 952

原创 hdu4609 3-idiots FFT

跟n条边,求任选三条边可以组成三角形的概率。求出n条边组成三角形的方案数,再除以C(n,3)就可以了,所以这题转化成n条边求可组成的三角形数。首先用一个数组num[i]记录长度为i的边出现了几次,之后求num的卷积,即可得到n条边中任取两条边的和的长度各出现了多少次,拿第一组样例来说a[]={1 3 3 4}转化成num={0,1,0,2,1},{0,1,0,2,1}*{0,1,0,2,1

2014-03-05 15:41:44 733

原创 hdu1402 A*B 快速傅里叶变换(FFT)

两个不超过50000位的数,求乘积。高精度乘法,但是写暴力高精的话复杂度是O(n^2),不压位估计是要T掉的=,这里介绍一种新的方法,可以在O(nlogn)的复杂度内求出答案。先来说一下我对fft的理解吧,fft其实就是一个求多项式乘法的快速算法,两个n阶多项式相乘,传统的方法是循环相乘再累加,复杂度是O(n^2),而用fft去实现的话,复杂度可以降到O(nlogn)。对于n阶多项式,我们可以

2014-03-05 15:21:22 1820

原创 zoj 3762 Pan's Labyrinth 几何+贪心

跟n个点,在所有构成的三角形中,求最大的高。在网上看到了一种贪心的做法..虽然不确定对,但好像没找到什么反例...首先对每个点,求出距离他最远的点,然后枚举每个点就成了枚举线段了,在枚举第三个点,记录最大的高就好了,复杂度O(n^2);#include #include#include#include#include#include#include#include#incl

2014-03-04 23:31:44 811

原创 SPOJ 4487. Can you answer these queries VI(GSS6) splay

一个序列,四中操作,在x前插入y;删除位置x的数;把位置x的数改成y;查询区间[x,y]的最大子段和。算是维护数列的简化版吧,但时间卡的要死=...输入挂+输出挂都用上了才勉强卡过去....#include #include #include #include #include using namespace std;typedef int ll;const int maxn=2

2014-03-04 23:29:33 725

原创 poj 2761 Feed the dogs treap

N个数,M个查询,每次查询L到R区间的第k小元素。可以用treap离线做..读取所有的查询,按左区间排序,由于数据保证不存在互相包涵的查询,所以相邻的两个区间要么相离,要么部分交叉。相离就依次删除上一次的元素,再一次插入本次的元素;交叉就删除上次不重叠的部分,然后把本次不重叠的部分插入。#include #include #include #include #include usin

2014-03-04 23:24:42 852

原创 poj1442 Black Box treap

N个数,在插入第B[i]个数之后,查询当前集合中第i小的数是多少。treap模板题...#include #include #include #include #include using namespace std;typedef long long ll;const int maxn=101000;int pre[maxn];int ch[maxn][2];int si

2014-03-04 23:20:42 786

原创 zoj 3757 Alice and Bob and Cue Sports 模拟

两个人打台球,初始状态为n个编号不同的球和一个母球(编号为0),每个球的分数即它的编号,每次操作时,当前的目标球为台面上球的最小值,操作犯规的话会给对手加上若干分,犯规的情况有:1  母球没有打到任何球,对手+目标球的分数2 母球没有落袋,但是母球第一次撞击没有撞到目标球,或者是第一次撞击同时撞击了1个以上的球,对手+第一次同时撞击到的球中编号最大的分数3 母球落袋并且撞击到了至少一个

2014-03-03 00:00:22 1659 3

原创 zoj 3765 Lights splay

N个灯摆成一排,每个灯有一个权值和一个状态,现在有以下操作:Q l r sta :查询第l个到第r个中状态为sta的灯的权值的最大公约数。I i x sta : 在第i个灯后面插入一个权值为x状态为sta的灯。D i:删除第i个灯M i x :将第i个灯的权值变成xR i:改变第i个灯的状态。对每一个查询,输出一个答案。又是插入又是删除,而且key值又可以合并成一段处理

2014-03-02 23:46:32 713

原创 codeforces 396C On Changing Tree dfs序+BIT

一棵树,根节点为1,现有两种操作1 v x k :对节点v的值+x,对节点v的后继中,距离为i的节点的值+x-i*k。2 v :输出节点v现在的值。对子树进行操作的话,容易想到树状数组或者线段树,先对树做一遍dfs标上时间戳,这样节点v的子树的时间戳就是l[v]--r[v]这个区间,那么对子树的加减就可以转化成区间的加减。再来看操作,操作一v的操作可以看成+x-0*k,或者说是x+de

2014-03-01 22:13:02 1037

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除