- 博客(85)
- 收藏
- 关注
原创 7.23
今天本打算搞带通配符的KMP,按照自己的想法写了一下,死活不对,后来发现带"?"时,next是不对的,kmp应该解不了。 性质类似的AC自动机应许能解。又重温了一遍,将动态写成静态,过了hdu两道题(2222,2896)。感触:AC自动机的Fail比kmp的next直观多了。 最后,弄了弄昨天多校没过的DEQUE,现在思路就清晰多了,可能当时对自己想的算法的正确性始终保
2013-07-24 21:47:10 709
原创 poj4047 线段树
//poj4047 #include using namespace std;#define maxn 200100#define LL(x) (x<<1)#define RR(x) (x<<1|1)struct Seg { int l,r,v,c; int len() {return (r-l+1);}}a[maxn*3];void buildtree
2012-05-27 09:23:37 946
原创 poj4044 白开水~
好久没刷题了,也好久没更新了。碰巧A了到新出的水题,便把题解放这吧。题意很简单,因此代码也很渣的= =#include #include using namespace std;int n,m,p1,p2,t,tmp,l,maxl,a[110],b[110],c[110];bool v[110];bool cmp1(int a,int b) { return a>b;}
2012-05-13 20:12:36 879
原创 poj2034 dfs
冯如杯完了,有时间可以惬意的刷几道了。这题是求n到m的一个排列,满足相邻的2个,3个……d个数的和都不为素数(都要满足)。然后上代码,挺简单,是所以发代码,是觉得自己写得比较漂亮。(呵呵,不要喷我)#include using namespace std;bool ans,p[10010],h[1010];int n,m,d,a[1010],sum[11];void dfs(i
2012-04-18 21:50:50 1680
原创 poj3026 bfs mst
挺综合的一题,就是空格有些无语,多亏discuss前辈们的指点。渣代码抛砖引玉。#include #include using namespace std;#define maxn 1010#define maxm 100010#define INF 100000000int cas,n,m;char s[110][110];struct edge { int
2012-03-13 20:54:50 1029
原创 poj3682 概率
几何分布:在第n次伯努利试验,才得到第一次成功的机率。详细的说,是:n次伯努利试验,前n-1次皆失败,第n次才成功的概率。P(X=k)=p*(1-p)^(k-1)EX=1/pDX=(1-p)/(p^2)巴斯卡分布可视作k个几何分布,如题意。EX=k/pDX=k*(1-p)/(p^2)
2012-03-06 16:07:07 1055
原创 poj2002 数正方形 hash
直接上渣代码了#include using namespace std;struct gtype { int x,y,next;}g[3000];int first[1000100],tot,n,x[3010],y[3010],ans,h,tx,ty;int hash(int x,int y) { return (40000*x+y+800040000)%999
2012-03-04 10:38:02 890
原创 poj3003&2397 DP 记录路径
这两题是一模一样的最近做了好多这种背包的题,但是这题需弄清的地方还是不少,有些绕f[][]数组其实是可以省的#include #define oo 10000000using namespace std;int cas,n,a[1010],p,q,dp[2][1010],pre[41][1010];bool f[2][1010],ans[41];int main() {
2012-03-02 11:01:43 1102
原创 poj1717 DP
A得很艰辛啊,虽然看上去很简单,但还是要整理好思路,而且有很多地方要注意细节!#include #include using namespace std;#define oo 10000000int gap,x,y,a[1010],dp[12010][2],p,q,j,jl,n;int main() { while (~scanf("%d",&n)) {
2012-02-27 19:31:04 1403 1
原创 poj 1570 floyd
这题过的人很少,却意外的很水呢#include #include #include using namespace std;char ch;int k1,k2,a[201][201][2],tot,g;string s,ss;map ma;int gcd(int a,int b) { if (b==0) return a; else return gcd(b,a
2012-02-25 20:38:46 669
原创 poj1293 DP背包
两种物品,放到n个盒子,要求所有盒子放满,且每个盒子只有一种物品,物品可以有剩余解法:将盒子视为物品,第一种物品为背包大小,进行DP并且记录路径,回溯可得放第一种物品的最优方案(目的是为了是放第二种物品的盒子总容积尽可能小),最后在判断一下就行了。#include using namespace std;int M,L,c[1010],dp[1010],n,pre[1010],sum,
2012-02-25 16:41:57 834
原创 poj3314 堆木块 模拟
往箱子里堆木块,放满一个箱子(比它的高度高),则接着从一个新箱子开始放,求每个箱子木块的高度。#include using namespace std;struct data { int up[11],down[11],h;}a[101];int n,w,b,t,now,tot,tmp,ans[101];bool empty;char s[101][11];int
2012-02-21 09:44:41 779
原创 poj3311 状态压缩
和2817很像虽然短小,但是很典型,故作文以记之。求全排列后的最优值。dp[i][j]表示状态为j时,第i个为最后添加的 时的最优值#include using namespace std;#define oo 10000000int p[11]={1,2,4,8,16,32,64,128,256,512,1024};int g[11][11],dp[11][1026],n
2012-02-19 20:04:37 1069
原创 poj1703 并查集
我真的是太弱了,想得很复杂,最后网上一看,原来这么简单的想法就搞定了……#include using namespace std;int f[200001],n,m,x,y,cas;char c;int find(int x) { if (x!=f[x]) f[x] = find(f[x]); return f[x]; }void Union(int x,int y
2012-01-31 11:15:25 936
原创 poj1042 贪心
整个一挫题。我用优先队列贪心,需注意的是排序,以及湖的鱼数小于等于零时为零。#include #include using namespace std;struct data { int f,d,id;}a[30],b;int n,t,tran[30],x,ans,maxi,save[30],tmp[30],tt;priority_queue q;bool o
2012-01-21 16:06:09 3355
转载 poj1037 DP
转载:http://archive.cnblogs.com/a/2122079/up[n][k] 长度为n以k开始的,前两个数呈上升趋势的数列的个数down[n][k] 长度为n以k开始的,前两个数呈下降趋势的数列的个数up[n][k] = sigma(down[n-1][i]) kdown[n][k]= sigma(up[n-1][i])
2012-01-20 11:14:28 1939
原创 poj1033 磁盘碎片
模拟磁盘碎片整理,写的晕了~方法:能移就移,不然处理其所在链或环#include using namespace std;int v[10010],id[10010],m,n,k,tot,x,r;bool loop,f;int main() { while (~scanf("%d%d",&m,&n)) { tot = 0; memse
2012-01-18 11:00:34 1480
原创 poj1027 模拟
虽然不长,但仍写了很长时间……#include #include using namespace std;int cas,tmp,ans,tot,sum,k,x,y;bool v[11][16];string a[11];char c;int dx[4] = {0,1,0,-1};int dy[4] = {1,0,-1,0};void clear(int x,int y) {
2012-01-17 21:51:12 1526 2
原创 poj1021 概率,最小表示
这个真的很强!网上找的:唯一的难点是,怎么判断连成一片的棋子形状相同? 一个基于概率的算法是:给每一颗棋子计算一个值,根据这个值是否相等来推测它所在的一片棋子的形状是否相等。计算出每颗棋子的值后对其进行排序,若两副棋盘生成的序列完全相等则推测其等价。 至于这个值如何定,我的设计为:每颗棋子在其水平方向和垂直方向与其相连的棋子总数+1(自己)。比如左图的C,这个值为水平相连2颗(AB
2012-01-16 23:59:53 2211 1
原创 poj1024 bfs
这题写的很苦手啊,详解见poj discuss.#include #include #include using namespace std;struct point{ int x,y;};int g[101][101][5],cas,n,m,k,x1[1010],x2[1010],y1[1010],y2[1010];int a[101][101],b[101][1
2012-01-16 21:50:45 1836
原创 poj1059 模拟
细心即可#include using namespace std;int p[7],dice[101],a[101],x,y,k,num,ans,mark[7],turn,player;void ex(int pp,int x) { if (a[x]==-2) mark[pp] = 1; else if (a[x]==-3) mark[pp] = 2; el
2012-01-07 16:10:16 977
原创 poj2362 dfs
给一些棍子,问能否围成一个正方形(必须全部用上)。这么写的DFS就TLE了:void dfs(int k,int id,int res) { if (k==5) { g = true; return; } for (int i=id;i<=n;i++) { if (!v[i] && res>=a[i]) {
2011-12-25 12:55:56 833
原创 poj1568 极大极小搜索
问题:给出一个4x4 tic-tac-toe 的棋局的局面,问先手 "x" 是不是能找在接下来的一步中找到一个必胜局面,如果有,输出第一个落子位置(按顺序)。极大极小搜索策略一般都是使用在一些博弈类的游戏之中: 这样策略本质上使用的是深度搜索策略,所以一般可以使用递归的方法来实现。在搜索过程中,对本方有利的搜索点上应该取极大值,而对本方不利的搜索点上应该取极小值。 极小值和
2011-12-20 15:32:41 3021 2
原创 poj 4020 逆序对
问了jx,才看懂了题意。 给定100000个二元组(x,y),找到一个排列,使得这个排列下x的逆序对数和y的逆序对数之和最小只要是相同颜色的就算一个 (1,2)(2,1)这种情况算一个。不知道我说没说清楚,嘴笨= =#include #include using namespace std;struct data { int a,b;}a[10
2011-12-14 22:00:23 857
原创 poj2993 与2996相反的模拟
#include #include #include #include using namespace std;struct data { int r,l; char ch;}chess[65];string s;char ch,ch1,ch2;int tot,p,w;bool cmp(data a,data b) { if (a.r>b.
2011-12-13 10:20:59 849
原创 poj2996 模拟
#include #include #include #include using namespace std;struct data { int r,l; char ch;}chessw[65],chessb[65];string s;char ch,ch1;int totw,totb;map ma;void print1(data chess)
2011-12-13 09:53:22 1119
原创 poj4003 树形dp, rmq_st
很综合的题目,出得非常好第一个问题是求以树中的每个节点为起点所能走的最长路:首先,求出各个点的最长路,次长路,以及最长路的后继节点,再据此得到答案第二个问题,需要rmq,并且维护一个队列,只要满足条件,队尾添加新元素,不然同时弹出队头注意!dfs函数中tmp2为根走另一分支所得次长路,与最长路无公共路径!#include using namespace std
2011-12-08 20:26:42 941
原创 poj2502 最短路
好久没做图论了,没想到感觉还是一级棒啊!现在觉得自己的状态太好了,希望能保持到下个ACM赛季。#include #include #include using namespace std;#define maxn 1010#define maxm 100010#define INF 100000000struct edge { int y,next;
2011-12-05 22:12:22 1454
转载 poj4001 象棋判断死局
福州第一题,模拟题,判断是否将死,都是最简单的情形。主要看细节,但是只要想清楚了,什么都是浮云。网上一位哥们写的比我清楚多了,分享一下。#include#include#includeusing namespace std;int ff[11][11];char map[11][11];bool inside(int x,int y)//判断坐标是否在棋局内{ i
2011-12-04 17:50:59 2597 1
原创 poj1020 暴搜暴的很有水平~
问题:几个小正方形是否能拼成一个大正方形(全部用上) discuss上写的那个果然经典。借鉴学习之。具体见注释。#include using namespace std;int state[41],x,cake[20],s,n,cas,sum;bool ans;void dfs(int dep) { if (dep==n) {
2011-11-30 21:50:11 2663
原创 poj1010 暴搜
四重循环爆菊之!#include #include using namespace std;int x,num,tot,kind,kk,kmax,hmax,n,stamp[110],best[5];bool tie,ans,v[110],hash[110];int cmp() { if (kind>kk) return 1; else if (kind==kk &
2011-11-29 17:31:54 1507
原创 poj3460 ida*
估价函数很经典,每个值的后继值错误的个数除以3。因为一次操作最多改变3个值的后继值。1A,IDA*已经写得很纯熟了。#include #include using namespace std;int a[25],n,bound,cas;int ans;int h(int *a) { int hv = 0; if (a[1]!=1) hv++; for (i
2011-11-28 21:08:12 1591
原创 poj1190 神剪枝啊
又见神剪枝啊,不加2*v/R+tmp>=ans这句话的话,是无法避免超时的它的意思是:当前解+剩余资源的最优解>=最优解时,剪枝,有点像a*的估价函数#include #include using namespace std;int R,H,n,m,ans,mv[21],tmp;void dfs(int v,int dep,int R,int H) { if (d
2011-11-27 10:29:09 3483
原创 poj2331 ida*
用最少的管子数,连接平面上的两点,只允许横放或竖放,允许交叉或重叠方法:先搜x轴,再搜y轴预处理估价函数还是觉得很唯美~#include #include #include using namespace std;struct data { int l,num;}a[10];int n,sx,sy,tx,ty,h1[1010],h2[1010],total
2011-11-26 10:36:03 1378
原创 poj2286 唯美的IDA*(80行)
ida*果然比a*强太多了,少了hash判重和堆维护,是估价函数和DFS的完美结合啊!嗯,主要是DFS函数中第二行的那个强剪枝太给力了!IDA*的灵魂啊!基本的架构就是如此了,可以任意套。//poj2286#include #include using namespace std;const int b[5][8] = { 7,8,9,12,13,16,17,18,
2011-11-24 22:13:39 2550 1
原创 poj1945 A*,hash,heap,gcd剪枝
一道搜索好题,但是我写的太弱了,tle,比如跑17530这几个数据有问题。最终交表0ms。作文以记之。希望大家多多指教。#include #include #include using namespace std;struct data { int a,b,c,v;}k,heap[1000000];int tot,first[1000000],x,nu
2011-11-23 20:15:08 1794
原创 spoj9952
输入n,求n个连续的1的平方的各位数之和,例,s(9)^2=(111111111)^2=12345678987654321,各位的和是81。找规律,A之。#include #include using namespace std;long long n;int main() { while (~scanf("%lld",&n)) printf("%ll
2011-11-15 15:58:24 662
原创 2011ACM成都赛区现场赛H题 (非递归dfs) (hdu4118)
这题我在现场的时候用图论做超时,需要非递归dfs。我维护了一个a数组记录结点的儿子数。#include #include #include using namespace std;struct gtype { int y,d,next;}g[200010];int first[100100],tot,a[100100],tt,x,y,d,n;bool v[100
2011-11-10 20:48:02 4019 1
原创 ACM数论札记
随本人的学习进度,不断更新完善~一. 数的可约性1. 当a与b互质时,C(a,b)能被b整除。2. 数m=(p^a)*(q^b)*(r^c)……所有约数的和是S(m)=((p^(a+1)-1)/p-1)*((q^(b+1)-1)/q-1)*((r^(c+1)-1)/r-1)……3. m!中所含作为因数的素数p的最大方次数是【m/p】+【m/p^2】+【m/p^3】+……+【m/p^
2011-11-09 22:32:02 728
原创 2011ACM成都赛区现场赛E题 (2-sat) (SPOJ9939)
这是我最痛心的一道题,就是少了四句话,忘了加上矛盾而已,导致了我们队的滑铁卢。想想我还是算擅长图论的,这么典型的2-sat题还不过,真的很不应该,面壁……#include #include using namespace std;struct gtype { int y,next;}g[1000100];int first[20010],tt,n,m,tot,a[1
2011-11-08 23:24:14 1636
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人