自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(106)
  • 收藏
  • 关注

原创 Bestcoder #89

1001#include#include#include#includeusing namespace std;const int maxn=10000+10;char s[maxn];int main(){ int t; scanf("%d",&t); while(t--) { scanf("%s",s+1);

2016-10-30 21:45:06 202

原创 UVA 11922 Permutation Transformer(splay树)

#include#include#include#includeusing namespace std;struct Node{ Node* ch[2]; int v,s; int flip; int cmp(int x) const { int d=x-ch[0]->s; if(d==1) return -1;

2016-10-30 10:14:23 192

原创 splay树

#includestruct Node{ Node* ch[2]; int s,v,r; Node(int v): v(v) {ch[0]=ch[1]=NULL;r=rand();s=1;} int cmp(int x) const { if(x==s-ch[1]->s) return -1; return xs?0:1;

2016-10-29 09:47:03 156

原创 UVA 1479 Graph and Queries(Treap树)

首先把最终图弄出来,然后逆序命令即可。#includestruct Node{ Node *ch[2]; int v,r,s; Node(int v): v(v) {ch[0]=ch[1]=NULL;r=rand();s=1;} int cmp(int x) const { if(x==v) return -1; return x<

2016-10-28 21:05:19 187

原创 Treap树

#include#include#include#includeusing namespace std;struct Node{ Node *ch[2]; int v,r,s; int cmp(int x) const { if(x==v) return -1; return x<v?0:1; } void main

2016-10-28 17:44:15 132

原创 UVA 11020 Efficient Solutions(BST multiset实现)

#include#include#include#include#includeusing namespace std;struct Point{ int a,b; bool operator < (const Point &rhs) const { return a<rhs.a||(a==rhs.a&&b<rhs.b); }};multis

2016-10-28 16:14:33 508

原创 lower_bound和upper_bound的区别

lower_bound是返回大于等于val的第一个值upper_bound是返回大于等于val的最后一个值具体参考点击打开链接

2016-10-28 15:52:13 956

原创 UVA 12206 Stammering Aliens(字符串hash)

POJ上超时,而且x选择对时间影响很大。#include#include#include#includeusing namespace std;const int maxn=40000+5;const int x=123;char s[maxn];int n,m,pos;unsigned long long H[maxn],xp[maxn];unsigned long long

2016-10-28 11:54:51 201

原创 UVA 12206 Stammering Aliens(后缀数组+二分)

这题二分搞了我两天。#include#include#include#include#includeusing namespace std;const int maxn=44000+5;struct SuffixArray{ int s[maxn]; int sa[maxn]; int rank[maxn]; int height[maxn];

2016-10-28 09:55:05 196

原创 UVA 11107 Life Forms(后缀数组)

#include#include#include#includeusing namespace std;const int maxn=100000+1000;struct SuffixArray{ int s[maxn]; int sa[maxn]; int rank[maxn]; int height[maxn]; int t[maxn],t2

2016-10-27 19:44:05 207

原创 UVA 10679 I Love Strings!!(后缀数组)

第一次做后缀数组的题,先处理文本串,整理出字典序然后对比模式串就可以了,感觉预处理对象和AC自动机换了一下。#include#include#include#includeusing namespace std;const int maxn=100000+5;struct SuffixArray{ char s[maxn]; int sa[maxn]; int

2016-10-27 14:33:05 214

原创 计数排序

#includeusing namespace std;int a[10],b[10],c[10];int main(){ for(int i=0;i>a[i]; for(int i=0;i<10;i++){ for(int j=i+1;j<10;j++){ if(a[i]>a[j]) c[i]++; else

2016-10-27 09:50:56 149

原创 UVA 1019 Matrix Matcher(AC自动机)

没想到这题有重复的行= =。#include#include#include#include#includeusing namespace std;const int maxnode=10000+5;int n,m,x,y;int tr;char T[1005][1005],P[105][105];int repr[105],Next[105];int cnt[1005][1

2016-10-27 08:52:27 193

原创 UVA 11468 Substring(AC自动机+树上的动态规划)

这题pro数组开小了,一直TLE。就是简单的记忆化搜索,走不是单词节点的点就可以,记得标出危险节点。#include#include#include#include#includeusing namespace std;const int maxnode=500;int idx[256];int k,n,L;struct DFA{ int ch[maxnode][64

2016-10-26 10:31:03 238

原创 UVA 1449 Dominating Patterns(AC自动机)

p数组少开了一个,查了一小时。#include#include#include#include#includeusing namespace std;const int maxnode=11000;struct AC{ int ch[maxnode][26]; int val[maxnode]; int last[maxnode]; int f[max

2016-10-25 18:17:29 138

原创 KMP循环节

首先求失配函数rep(i,1,n-1){ int j=f[i]; while(j&&s[i]!=s[j]) j=f[j]; f[i+1]=(s[i]==s[j])?j+1:0; }f数组在求解的过程中,用到了KMP的思想,当前失配了,就回溯到上一个next,请见 j=f[j] ,先说个结论,如果到位

2016-10-23 10:31:18 308

原创 POJ 2406 Power Strings(KMP循环节)

#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ss(x) scanf("%d",&x)const int maxn=1000000+5;char s[maxn];int f[maxn];int n;int main(

2016-10-22 22:36:37 178

原创 UVA 1328 Period(KMP)

#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ss(x) scanf("%d",&x)const int maxn=1000000+5;char s[maxn];int n,f[maxn];int main(){

2016-10-22 22:17:57 194

原创 KMP

#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ss(x) scanf("%d",&x)const int maxn=1000+5;char s[maxn],str[maxn];int f[maxn];void getf

2016-10-22 21:49:36 127

原创 UVA 11732 "strcmp()" Anyone(字典树+左儿子-右兄弟表示法)

如果用常规发放存储字典树,那么空间需要2亿多int,肯定会爆空间,所以用左耳子-右兄弟的方法存字典树。然后当节点是叶子结点的时候那么比较次数就是tot[u]*(tot[u]-1)*dep,如果非叶子结点,那么统计他的儿子节点与兄弟节点的个数然后相乘最后除2再乘比较次数就是到目前节点的比较次数了。#include#include#include#includeusing namespac

2016-10-22 19:44:31 329

原创 UVA 1401 Remember the Word(字典树)

定义状态d[i]=sum{(d[i]+d[i+len(x)])%MOD},x是从i~L字符串的前缀字符串,那么d[i]的值代表i~L有多少种可能性,一直向前递推,知道i为0。#include#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)

2016-10-22 14:54:05 178

原创 UVA 11992 Fast Matrix Operations(线段树+延迟标记)

这里是对区间的修改,所以需要延迟标记,否则每次修改时间复杂度将会是O(n),会超时。#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ss(x) scanf("%d",&x)const int maxnode=(1<<17)

2016-10-22 09:32:12 178

原创 UVA 1400 "Ray, Pass me the dishes!"(线段树)

训练指南上的线段树写法跟平时写的不一样,写得好难受。#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<(b);i++)#define ss(x) scanf("%d",&x)typedef long long LL;typedef pair Interval;

2016-10-21 20:15:05 162

原创 UVA 11235 Frequent values(RMQ)

因为是非递减的,所以相同的是连在一起的。那么只要用用两个数组value[i],count[i]把连续的去掉,value放的是不同的数组元素,count放的是该数的数量,用num[p],left[p],right[p],分别记录当前位置在去重后的位置,该段的左端点,右端点。如果l,r在同一段里那么就是r-l+1,否则max(RMQ(num[l]+1,num[r]-1),max(right[l

2016-10-21 12:26:37 177

原创 UVA 1428 Ping Pong(树状数组)

取low=min(a[i]|1#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ret(i,a,b) for(int i=(a);i>=(b);i--)#define ss(x) scanf("%d",&x)const int

2016-10-21 08:08:20 183

原创 UVA 1329 Corporative Network(并查集)

#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ss(x) scanf("%d",&x)const int maxn=20000+10;int d[maxn],pa[maxn];int n;int getroot(int

2016-10-20 21:17:07 188

原创 UVA 1160 X-Plosives(并查集)

可以把一个化合物看成一条边,那么两端点就是化合物的两个元素,如果k个化合物,k个元素,那么代表这k条边练成了一个环,所以用并查集来判断就可以了。#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ss(x) scanf("%d"

2016-10-20 19:46:38 182

原创 UVA 11997 K Smallest Sums(多路合并)

这里先把每个序列排序,然后依次和a[1]这个序列合并,那么a[1]这个序列中放的就是最终的结果了。#include#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ss(x) scanf("%d",&x)const int m

2016-10-20 18:36:33 164

原创 UVA 1203 Argus(优先队列)

如果枚举全部放进队列,空间会爆,所以出一个进一个。#include#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ss(x) scanf("%d",&x)const int maxn=1000+10;int k,len;

2016-10-20 15:12:51 210

原创 UVA 11991 Easy Problem from Rujia Liu?(map,vector)

#include#include#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ss(x) scanf("%d",&x)map > ha;int main(){ int n,m; while(scanf

2016-10-20 14:38:38 159

原创 UVA 11995 I Can Guess the Data Structure!(水题)

自己写了个超烂的代码,虽然AC了,但是太丑了,把刘如家的写了一遍。#include#include#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ss(x) scanf("%d",&x)const int maxn=100

2016-10-20 14:11:17 150

原创 关于训练指南的第一章总结

1.1主要是思维上的训练,并且也学习了一些贪心的常用姿势,二分与贪心的结合(二分难点主要在判断二分结果上),以及一些常用的编程技巧,如放缩数据范围(例题4),还有数形结合(如例题3),例题4蚂蚁可以看出是一题非常好的思维锻炼题,之前在蓝桥杯上碰到过类似题目,没有解决,当看完了例题5之后,蓝桥杯上的题也被解决掉了。1.3之前在紫书的第八章没有仔细看,在这章中主要知识点有前缀和,IO优化,

2016-10-20 10:16:58 151

原创 UVA 1427 Parade(dp)

这题poj上时限卡得太紧了,IO不优化超市,优化IO313ms。定义状态为f[i][j]代表走到第i行第j个点的最大高兴值,那么f[i][j]可以由两个状态转移过来,f[i][j]=max(f[i+1][k]-sum[i][k]+sum[i][j],f[i+1][k]+sum[i][k]-sum[i][j]),那么只需要计算出左边过来的最大值和右边过来的最大值即可,从上面的式子中可以发现,这是

2016-10-20 09:48:55 217

原创 UVA 1474 Evacuation Plan(dp)

这题一开始状态想对了,但是因为是n^2,所以直接被否定了,但是最后居然看到时间20000ms= =。定义状态f[i][j]代表处理完了前i个队,分配到j个避难处的最短路径和,那么不难想到状态转移是f[i][j]=min(f[i-1][j],f[i-1][j-1])+abs(d[i]-d[j]),f[i][j]只能由两种状态转移过来,处理完i-1个队,分配了j-1个避难处,当处理i时,可能i会被

2016-10-19 20:44:49 195

原创 UVA 12105 Bigger is Better(数位dp)

f[i][j]表示用i根棍子余数为j可以组成的最大数。但是最长可能有55位,所以用字符串来保存这个数,所以定义f[i][j][k];每次先枚举火柴棍的根数,再枚举余数,最后枚举最新加进去的数字,每次把火柴棍为i时,余数为0的最大组成数字记下来即可。#include#include#include#includeusing namespace std;char f[105][300

2016-10-19 18:08:44 209

原创 UVA 1437 String painter(区间dp)

先把A串当成一个空串,然后f[i][j]表示区间[i,j]的一个空串刷成B串最少需要多少个步骤。在转移的过程中,f[i][j]的初值赋f[i][j]=f[i+1][j]+f[i][i],然后从枚举k=i+1开始到r,如果B[i]==B[k],那么f[i][r]=min(f[i][r],f[i+1][k]+f[k+1][r]),因为这样刷会使步骤尽可能的减少。最后再根据s1,求出最少步骤即可

2016-10-19 16:04:56 367

原创 UVA 12235 Help Bubu(状压dp)***

这是目前碰到最难的dp题之一,看题解都看得迷迷糊糊的。现在是定义状态dp[i][j][s][x],代表前i本书,拿走了j本书,s是剩下书的集合,x是最后一本书的高度的混乱度。为了省空间,第一维可以用滚动数组。然后依次枚举第二三四维,如果目前的高度h与x相同,那直接从i-1继承过来即可,如果不相同,那就有两种选择,一种选择是拿走这本书,另一种选择是把这本书放进去。#include#

2016-10-18 22:52:00 213

原创 UVA 10559 Blocks(记忆化dp)

这题在poj上做过,之前的博客已经有详细解释了。#include#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ss(x) scanf("%d",&x)const int maxn=200+10;struct bloc

2016-10-18 18:28:55 234

原创 UVA 1407 Caves(树形dp)

这题定义状态f[i][j][0]和f[i][j][1]。f[i][j][0]表示遍历以i为根节点的子树的j个节点并且不回到节点i,那么状态方程为f[i][j][0]=min(f[i][j][0],min(f[i][j-k][1]+f[v][k][0]+w,f[i][j-k][0]+f[v][k][1]+2*w);f[i][j][1]表示遍历以i为根节点的子树的j个节点并且回到节点i,那么状

2016-10-18 16:48:34 240

原创 UVA 1456 Cellular Network(dp)

这题一开始看到什么数学期望,没敢做,放倒最后才做,没想到这么水= =。#include#include#include#includeusing namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define ss(x) scanf("%d",&x)const int maxn=100+10;int u[max

2016-10-17 22:06:37 214

空空如也

空空如也

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

TA关注的人

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