自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 POJ 1019 Number Sequence(枚举)

log10(n)+1可以得到数n的长度Len[n]表示1到n这一段的总长度s[n]表示第一段到第n段的总长度先确定第n位在哪段中,然后从1开始枚举确定第n位在哪个数中。设k是这个数最后一位的位置,这个数为num,则第n位的数是num/pow(10,k-n)%10 (掐头去尾)代码://// main.cpp// 1019 Number Sequence

2015-03-31 23:46:47 418

原创 POJ 1016 Numbers That Count(string+map)

string有以下几个方便的特性:1.string重载了+号,==号等符号.2.string可以和char相加,也可以和char数组相加通过这两个特性可以很方便的构造每一个数的另一种表示形式。map 记录每个字符串首次出现的时间,判断周期的时候用。代码:#include #include #include #include using namespa

2015-03-31 16:50:16 408

原创 POJ 1011 Sticks(搜索剪枝)

有以下几个剪枝,按难度排序:下文‘部分’代表切割后的小棒子1.做假设的长度一定可以整除所有部分长度之和2.当选择一个部分刚好能把现在组合的这根棒子补全,而之后的棒子无法补全时,直接返回false,不需要试其他部分。因为如果不选这个部分,想把当前棒子补全,需要选其他几个长度和等于这个部分的小棒子,这样留下的局面比直接选初始的那个部分更差。3.当刚开始拼接一个棒子时,如果选择某个部

2015-03-31 12:21:32 601

原创 UVa 11374 Airport Express(优先队列Dijkstra)

从起点,终点分别做两次Dijkatra,算出每一点到起点的最短路程d[i]和到终点的最短路程c[i],枚举K条商业线,作为连接最短路的边,看看d[i]+c[j]+W[i][j]是不是更小了。代码:#include #include #include using namespace std;#include #include #include #define INF 1

2015-03-31 11:16:25 562

原创 UVa 10917 Walk Through the Forest(最短路+DP)

求出办公室到每一点的最短路d[i],然后记忆话搜索,dp[i]由和i点相邻且d[j]代码:#include #include #include #include #include #include #define INF 10000000using namespace std;int N,M;struct edge{ int s,t,c;};vect

2015-03-30 22:34:41 600

原创 POJ 1006 I Think I Need a Houseboat(二分)

二分满足条件的年数。代码:#include #include #include #include using namespace std;#include #define eps 1e-8#define pi acos(-1.0)int BS(double k){ int l=0,r=100000; int mid; while(l<r-1){ mid=(

2015-03-25 20:28:21 440

原创 POJ 1003 Hangover(二分搜索)

#include #include #include #include using namespace std;#define eps 1e-7int BS(double c){ int l=0,r=280,mid; double k=0; while(l<r-1){ k=0; mid=(l+r)/2; for(int i=2;i<=mid+1;i++){ k+

2015-03-25 19:26:17 754

原创 POJ 1002 487-3279(map应用)

用map+string写的,减少代码量本题有几个坑:1.输入字符串至少要开到502.要考虑电话号码中有0的情况,比如000-0000map插入后会自动按字典序排序。迭代器定义方法:map::iterator p;代码:#include #include #include using namespace std;#include #inclu

2015-03-25 19:01:19 450

原创 UVa 11624 Fire!(BFS)

首先预处理出每个位置被大火烧到的时间,这个也是用bfs计算火的路径。然后再正常对Joe逃跑路径bfs。代码:#include #include #include using namespace std;#define maxn 1005#include int R,C;int F[maxn][maxn];char M[maxn][maxn];bool vis[

2015-03-24 15:05:21 399

原创 UVa 10047 The monocycle (BFS)

bfs开标记空间时,一个状态不但要标记所在的位置,还要标记颜色,方向。因此可以开一个4维数组。每个状态可以转移到3个状态。代码:#include #include #include #include #include using namespace std;int M,N;int ox,oy;int dis[30][30][6][4];char Map[30]

2015-03-24 15:02:34 506

原创 UVa 11488 Hyper Prefix Sets(字典树)

字典树每个节点维护这个节点的深度和到达这里的字符串数量,用这两个的乘积维护答案即可。代码:#include #include #include using namespace std;int idx(char c){ return c-'0';}struct node{ int bt[2]; int num; int deep;}G[1000000];

2015-03-21 12:38:49 762

原创 UVa 11525 Permutation(二分+树状数组)

题中的展开实际就是康托展开。可以这样理解:假设确定了排列的第一位,那么还剩下K-1个数,全排列数为(K-1)!因此答案第一个数一定是S1+1以此类推,可以得知第i位的答案就是在未选的数中第Si小的。问题就转化成了如何确定未选的数中第k小的数是多少。用树状数组c,维护数i之前有多少个数被取走了。这属于单点修改,区间查询。这样如果i-c[i]>=k,那么i这个位

2015-03-21 12:13:30 575

原创 UVa 12299 RMQ with shifts(线段树单点修改 区间查询)

由于命令长度最大才30,shift操作包含位置的数量不超过12,可以视为常数。把每一个shift操作当成N个单点修改即可。对命令字符串解析,使用:for(int j=0;j    if(isdigit(s[j])){     sscanf(&s[j],"%d",&pos[p++]);    }    while(isdigit(s[j])){     j++; 

2015-03-20 12:10:20 591

原创 UVa 11987 Almost Union-Find(带权并查集)

本题难点就是第二个操作。如果可以保证移动的节点一定是叶子节点,那就可以直接修改fa数组了。为了实现这点,可以开2×n个节点,初始时i的父节点是i+n,这样在合并时可以保证前n个节点一定一直都是叶子节点,问题就变成简单并查集了。代码:#include #include #include #include using namespace std;#define maxn

2015-03-20 10:49:14 594

原创 UVa 11136 Hoax or what(multiset 应用)

multiset和set用法基本一样,区别是相同键值可以存在多个元素。代码:#include #include #include #include using namespace std;#include #define LL long longmultiset G;int main(){ int N; while(~scanf("%d",&N)){ if

2015-03-18 21:12:51 534

原创 UVa 11988 Broken Keyboard (a.k.a. Beiju Text) (模拟链表)

把原字符串从'[',']'处分隔成小字符串,然后维护每个字符串右边的字符串标号,已经第一个字符串head,最后一个字符串tail。读到一个'['表示把接下来的字符串放到最前面。']‘表示把下个字符串放到最后面,维护模拟指针即可。代码:#include #include #include #include using namespace std;#include s

2015-03-18 20:33:49 550

原创 Uva 11732 "strcmp()" Anyone? (字典树)

两个字符串匹配时,如果对应位置相同,则需要比较两次(第二次判断是否为'\0') ,若失败只需比较一次。因此,把所有字符串建成一个字典树,每个节点用num记录有多少个字符串经过这里。那么对于这个位置,考虑匹配成功的情况,共发生num×(num-1)/2×2次比较。对于这个节点的每一个后继结点,设该节点的num值为tnum,那么在前驱节点上有num-tnum个和该节点字符不相同的字符,比较

2015-03-18 19:31:54 719

原创 UVa 11992 Fast Matrix Operations(两种标记的线段树)

本题涉及到了线段数大多数基本操作。因为只有20行,所以可以建20个线段树。线段树最重要的两个函数:pushdown 下移标记,并更新子节点数据。pushup  由2个子节点数据更新父节点数据。写法有很多,介绍一种不容易错的:保证在设置标记的同时更新节点信息。即:在update给某节点打标记,以及pushdown下发标记时,都马上更新节点信息。这样写的效果是pus

2015-03-14 19:20:49 478

原创 UVa 11235 Frequent Values(RMQ,ST算法)

注意到数列是非递减的,这代表相等的数字一定是挨在一起的。用a[i]表示数字i所在的段的长度。用left,right数组维护每个数字所在段左右边界位置。这样对于查询s~t,right[s]+1~left[t]-1这个子区间全都是完整的段,对这个子区间做RMQ,得到最长的段长度。然后再考虑这个子区间两个边界到s,t的距离。这两个距离也可能是答案。这三个答案的最大值就是最终答案。要特判s

2015-03-13 19:09:49 939

原创 UVa 11991 I Can Guess The Data Structure(STL基础)

用stl中的3种数据结构依次去试,注意取之前要判断容器内是否是空的。代码:#include #include #include using namespace std;#include #include queue Q;stack S;priority_queue P;void init(){ while(!Q.empty()) Q.pop(); wh

2015-03-10 13:12:37 673

原创 UVa 11892 ENimEn(博弈推理)

把所有数分为是1的和不是1的,当把所有不是1的数取完后,显然如果1的数量为奇数则先取的赢,否则后取的赢。因此先手有如下必胜策略:若1的数量为奇数:依次把每个不是1的数取成1,这样对手只能把这堆取完,这样两人合作把所有不是1的数取完,先手胜。若1的数量为偶数:同上,强迫对手与自己合作取完不是1的数直到最后一个不是1的数,先手直接取完这个数,这样后手先取是1的那些数,先手胜。因此,

2015-03-10 12:31:51 896

原创 UVa 12293 Box Game(博弈,SG函数)

用当前人可以分配的球数就可以代表一个状态,开始Alice拿掉那个1个球的箱子后,剩下n个球由他来分配,分配为一多一少后,Bob所分配的球数是多的箱子中的数量。即,球数n可以转化为(n+1)/2~n-1间的一个数。用这个规律递推SG值。SG(n)=除所有n能到达的状态的SG值以外,最小的非负整数。必败状态SG值为0,显然1是一个必败状态。SG值用记忆化搜索求出。对前1000个数测试后发现SG

2015-03-10 10:46:45 648

原创 Codeforces Round #294 (Div. 2) D. A and B and Interesting Substrings(前缀和+map)

sum数组表示区间前缀和。如果位置i+1到位置j-1的和为零,那么sum[i]=sum[j-1],既sum[i]+a[k]=sum[j] (i和j位置字母为k)这样的话对每个字母枚举所有位置做起终点是可以的,但是时间复杂度为N^2。考虑用一个map维护前缀和中每个值出现的次数,这样可以用log时间查看某个值的前缀和存不存在。代码://// main.cpp//

2015-03-05 23:16:42 425

原创 Codeforces Round #295 (Div. 2) C. DNA Alignment(数学水题)

实际上t串的每个位置,都和s串的每个位置匹配了3次。那么t串最优情况自然是全部取s串中最多的字母,若最多的字母有k个,答案就是k^len代码://// main.cpp// 295A. DNA Alignment//// Created by Baoli1100 on 15/3/2.// Copyright (c) 2015年 Baoli1100. All r

2015-03-05 22:49:05 520

原创 Codeforces Round #295 (Div. 2) D.Cubes(STL SET应用)

STL中的SET是一个可以自动去重,排序的集合,底层为红黑树。遍历SET语法:set iterator p;for(p=S.begin();p!=S.end();p++){.....}删除元素 erase():参数即可以是key值也可以是迭代器地址。用两个Set数组Below和Top标记每个格子上面三格和下面三格分别有几个格子及序号。Rem也是一个Set,

2015-03-05 22:35:58 476

空空如也

空空如也

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

TA关注的人

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