自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HDU 数据结构 - 字典树 解题报告汇总

Virtual Judge 题目链接:打开链接HDU 1617 - Phone ListHDU 1251 - 统计难题HDU 1004 - Let the Balloon RiseHDU 1075 - What Are You Talking AboutHDU 4287 - Intelligent IMEHDU 1800 - Flying to the Mars HDU 1804 - Deli De

2015-07-25 14:57:23 1119

原创 Ubuntu 下 Virtual Judge 环境搭建与配置

由于学校机房每台机器都需要账号上网,而账号只有老师才有,

2014-11-20 19:08:51 4155

原创 Codeforces Round #318 (Div. 2) A、B、C

574A - Bear and Elections 题意: 输入一个数字n,接着输入n个正整数。 题目要求第一个整数要大于其余整数,其余整数每次可以减小1并增加到第一个数字中。 问至少要多少次才能满足要求。思路: 用优先队列维护一下就可以了。#include <stdio.h>#include <algorithm>#include <iostream>#include <strin

2015-08-30 11:19:20 196

原创 HDU 1277 - 全文检索

用字典树做的,要把输入的M行数据存到一个数组中即可。。 由于题目给出任何两个关键字的前4个数字是不同的,所以不会超时。#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <ctype.h>#include <iostream>#inc

2015-07-28 20:04:03 677

原创 HDU 2203 - 亲和串

可以让s1、s2互相进行KMP,看最后匹配的长度是否>= len2即可。举个例子: AABCD CDAA #include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <ctype.h>#include <iostream>#include

2015-07-25 16:01:36 612

原创 HDU 2818 - Building Block

题意: 给定一行木块,每堆一个木块,从左到右标号分别为1~300000. 针对木块可以执行以下两种操作: 1、M x y 将x所在的木块移到y所在木块的上面。 2、C x 查询x下方的木块数量。此题想了好久也没有做出来,然后看了一下别人的思路。 利用并查集 + rank数组 + under数组即可搞定。 under数组用来存储当前木块以下的木块个数。 rank数组用来存储当前集合中的总

2015-07-21 20:17:44 856

原创 Bestcoder Round #48 1001、1002

1001 - wyh2000 and a string problem思路:先把相邻超过两个的v全部改为w。 然后这个问题就转化为了一个串是否能通过删除某些字符变成另一个子串了。#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <cty

2015-07-19 11:42:03 576

原创 UVA 1149 - Bin Packing

贪心思想,排序后左右用两个变量从中间操作即可。#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <ctype.h>#include <iostream>#include <set>#include <map>#include <q

2015-06-29 20:25:07 657

原创 UVA 12627 - Erratic Expansion

一个红球可以分裂为3个红球和一个蓝球。 一个蓝球可以分裂为4个蓝球。分裂过程下图所示: 设当前状态为k1,下一状态为k2。 k1的第x行红球个数 * 2 ⇒ k2第2*x行的红球个数。 k1的第x行红球个数 ⇒ k2第2*x+1行的红球个数。特殊处理一下上下边界,递归求解就可以搞定了。#include <stdio.h>#include <string.h>#include <math.

2015-06-29 14:13:11 1073

原创 Codeforces Round #308 (Div. 2) A、B

552A - Vanya and Table 这题没什么好说的了,题目读懂了直接模拟就可以了。#include <stdio.h>#include <string.h>#include <algorithm>#include <iostream>using namespace std;int g[105][105];int gao(int x, int y, int xx, int y

2015-06-19 14:17:15 588

原创 UVA 11572 - Unique Snowflakes

输入一个长度为n(n <= 106)的序列A,找到一个尽量长的连续子序列AL~AR,使得该序列中没有相同得元素。 一开始用得map做的,用变量s存储子序列开始位置。 然后开始把map中每个出现的数字改为数字的下标。 然后从左到右枚举子序列结束位置i,当map[a[i]]的值不为零时,需要把map[s]~map[a[i]]的值改为0。然后才能继续向后扩展。 但是用map做的代码超时了,然后看了

2015-06-17 15:23:17 736

原创 UVA 11054 - Wine trading in Gergovia

把k个单位的酒从一个村庄运到相邻村庄需要k个单位的劳动力。 问最少需要多少劳动力可以满足所有村庄的需求? 由于所有位置的和一定为0,令最左端的位置为a1。 1、如果a1 > 0 那么a1买的酒一定需要经过a2才能到达,a2到a1需要的劳动力也就可以求出了,即:abs(a1)。 然后就把求a1到an需要的劳动力,转换为a2到an需要的劳动力 + abs(ai) 此时a2需要更新为a1 + a

2015-06-16 15:53:08 548

原创 UVA 11134 - Fabled Rooks

由于任意两个小车不能在同一行和同一列,那可以把行和列拆成一维来处理。这样就把问题转换为:把[1,n]中的每个数字填到每个区间里。假设有[1,6] [1,5] [1,7] 三个区间。 想一想1应该优先填到哪个区间里呢? 我们一定要把1填到区间[1,5]中,因为另外两个区间已经包含区间[1,5]。不会对后面的操作造成影响。对于[1,n]中的每个数贪心的策略是,尽量拿区间右端点小的那个即可。#incl

2015-06-16 12:22:59 556

原创 UVA 1605 - Building for UN

题意:输入一个数字n代表有n个国家,输出一种楼层排布,使得任意两个不同得国家都有一对相邻的格子(同层有公共边 或 相邻层同一位置)。并且自己国家的格子都是间接连通的。 此题答案不唯一,Special Judge。 其实仔细想想2层楼就够了,一层是每一行是一种国家,另一层是每一列是一种国家。#include <stdio.h>int main(){ int n; char ch

2015-06-16 08:58:23 764

原创 UVA 120 - Stacks of Flapjacks

输入一行数字,代表从上到下的饼的编号,现可以对第k张饼以上的编号整体翻转。问要如何操作使饼的编号为非递减序列。 此题是Special Judge,答案不唯一。 我的思路就是用两个数组,一个数组存读入的顺序编号,另一个存排序后的编号。 然后从后往前处理,当a[i] 不等于 b[i]的时候,有两种操作方式: 1、a[0] 等于 b[i],这种直接执行整体翻转第k张饼以上的编号即可。 2、a[0

2015-06-15 23:11:22 567

原创 读入一行由空格隔开的数字

当给你一行未知个数的数字时,需要读字符来处理,比较麻烦。 可以用C++封装的stringstream来处理的。#include <stdio.h>#include <iostream>#include <sstream>using namespace std;int main(){ int a[1005], cnt; string s; while(getline

2015-06-15 21:31:07 6195

原创 棋盘覆盖问题

#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <ctype.h>#include <iostream>#include <set>#include <map>#include <queue>#include <stack>

2015-06-15 20:48:06 564

原创 ACdream 1099 - 瑶瑶的第K大

快速排序思想,加一个优化就过了。#include <stdio.h>#include <algorithm>using namespace std;int a[1000005*5];int n, k;int ans = 0;void quicksort(int l, int r, int val){ if(l >= r) return ; int left = l, r

2015-06-13 16:36:40 663

原创 快速排序

每次选定轴值为区间第一个元素,最坏时间复杂度为O(N2)。#include <stdio.h>#include <algorithm>using namespace std;int a[10000];void quicksort(int l, int r){ if(l >= r) return; int left = l, right = r; int mid =

2015-06-13 15:26:03 482

原创 Codeforces Round #307 (Div. 2) A、B

551A - GukiZ and Contest 直接结构体排序即可,不多说了。#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <ctype.h>#include <iostream>#include <set>#include

2015-06-13 14:47:22 537

原创 UVA 12325 - Zombie's Treasure Chest

紫书P210 例题7-11。 此题分3种情况讨论: 1、S1很小,S2很大 直接枚举宝物2的个数0~N/S2。 2、S1很大,S2很小 直接枚举宝物1的个数0~N/S1。 3、S1很小,S2很小 当两种宝物体积相同时,比较S2*V1与S1*V2的大小,如果前者大,那应该优先拿前者。由此可得后者最多拿S1-1个。反之,前者最多拿S2-1个。#include <stdio.h>#incl

2015-06-01 20:47:16 568

原创 输出变量的字节表示形式

深入理解计算机系统P28提到了输出变量的字节表示形式。 不同的处理器,有两种排列表示规则,一种是小端法,另一种是大端法。书中图2-4提供的程序使用的是unsigned char 类型的指针变量。 然后我试着输出了16(int)的字节表示形式,如下图: 随后我有一个想法,输出字节表示形式能否用char类型的指针变量呢? 经过实验发现16(int)的字节表示形式与之前的结果是完全相同的。 但-

2015-05-22 14:42:57 936

原创 POJ 2528 - Mayor's posters

本题每次的更新区间为[1,10000000],区间较大,但是由于更新操作最多为10000条。从中可知数据的区间结点最多有20000个。将结点离散化后,可以节省很多空间。 离散化:把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。 离散化之前: 离散化之后: #include <stdio.h>#include <string.h>#incl

2015-03-25 18:36:11 578

原创 POJ 3468 - A Simple Problem with Integers

线段树成段更新,更新和查询利用延迟操作,不需要更新到叶子结点。 当要更新或查询的路径上遇到了延迟标记,则需要将此标记更新到子结点即可。#include <stdio.h>#include <string.h>#define lson rt << 1#define rson rt << 1 | 1long long maxn[100002 << 2], lazy[100002 << 2

2015-03-23 09:03:15 430

原创 HDU 1698 - Just a Hook

线段树成段更新第一题。 主要就是lazy操作,只有这需要查询的时候才去更新,节省很多时间。#include <stdio.h>#include <iostream>using namespace std;#define lson rt << 1#define rson rt << 1 | 1int T, N, Q, maxn[100005 << 2];pair<int, int>

2015-03-22 20:48:33 408

原创 POJ 2886 - Who Gets the Most Candies?

由于模拟约瑟夫环比较费时,可以利用线段树的查询功能来优化。 如下图,把一个环拆开变成一条直线,就可以查询某段区间有多少个空位置了。 反素数经典博文:打开连接#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>#include <map>#define lson rt <

2015-03-20 16:49:23 599

原创 Codeforces 27E - Number With The Given Amount Of Divisors

深搜枚举即可。#include <stdio.h>int a[100] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};typedef unsigned long long ULL;int n;ULL ans;void dfs(int step, ULL tmp, int num){ if(num >

2015-03-20 14:35:59 671

原创 [线段树] POJ 2828 - Buy Tickets

题意: 输入一个整数n。接下来n行分别输入两个整数Posi , Vali.。分别代表要插入的位置 和 插入的值。 本题思路比较难想,倒着插入会避免移动操作,只需要用线段树查询空着的个数即可。#include <stdio.h>#include <iostream>using namespace std;#define lson rt << 1#define rson rt

2015-03-17 17:40:06 517

原创 [线段树] HDU 2795 - Billboard

输入三个整数,h, w, n。代表h x w 的公告板和接下来有n个公告。 接下来输入n个公告的宽度Ki。高度都为1。 公告的规则是尽量往最上面放置。 问这n个公告分别放置的位置是第几行。 如果不能放置,输出-1。 第一眼看h,w的范围比较大,10^9,但是n最大才200000。 当h > n的时候,超出的部分是一定不会有公告放置的。 所以就可以用线段树来做

2015-03-13 17:05:24 512

原创 [线段树] HDU 1394 - Minimum Inversion Number

求题中n种序列的最小逆序数。 首先求出给定序列的逆序数,可以通过线段树来求。 逆序数的概念是:满足< ai, aj > (i < j 并且 ai > aj) 的组数。 利用线段树来查询[当前元素+1, n-1]。 然后使当前元素所在的所有区间的结点+1。 最后通过当前状态的序列递推其他状态的序列即可。#include <stdio.h>#include <strin

2015-03-08 23:06:37 512

原创 [线段树] HDU 1754 - I Hate It

#include <stdio.h>#include <algorithm>using namespace std;#define lson rt << 1#define rson rt << 1 | 1int maxn[200000 << 2];void build(int l, int r, int rt){ if(l == r) { scanf("

2015-03-06 23:44:34 482

原创 [线段树] HDU 1166 - 敌兵布阵

线段树第一题~#include <stdio.h>#define lson rt << 1#define rson rt << 1 | 1int maxn[50005 << 2], N;void build(int l, int r, int rt){ if(l == r) { scanf("%d", &maxn[rt]); return ;

2015-03-04 21:23:08 464

原创 [Codeforces] Round #292 (Div. 2) A、B、C

515 A - Drazil and Date 输入一个坐标(a, b), 接着输入一个整数s. 问:从(0, 0)能否正好s步走到坐标(a, b)? 思考后可以发现,两点之间的最少步数等于横坐标的差+纵坐标的差。 想要凑出s,必然每次要增加偶数步。#include <stdio.h>using namespace std;int abs(int x){ if(

2015-02-18 04:45:49 527

原创 [最短路径] HDU 1690 - Bus System

给定车辆的收费标准与路程区间的关系如下: 路程区间 花费 (0, L1] C1 (L1, L2] C2 (L2, L3] C3 (L3, L4] C4 (L4, +∞] 没票 接着输入两个整数N, M。 接着输入N个车站所在的横坐标,这N个车站是在一条直线上的。 接下来有M个询问,Si, Ei分别代表起点和终

2015-02-15 14:42:35 655

原创 [Bestcoder] Valentine's Day Round 1001 - Ferries Wheel | HDU 5174

本题比赛时被hack的人好多 - -。 注意坑点: 3 2147483645 2147483646 2147483644 Answer : 1#include <stdio.h>#include <string.h>#include <map>#include <algorithm>#define INT_MAX 2147483647using namespace

2015-02-14 21:32:29 707

原创 [最短路径] HDU 1596 - find the safest road

此题可以利用求最短路径的思想来解决,贪心的过程每次找最大值即可。#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <iostream>#include <set>#include <map>#incl

2015-02-13 23:21:13 512

原创 [最短路径、BFS] HDU 1548 - A strange lift

题意简述: 第一行输入三个整数N、A、B,分别代表楼的层数,开始楼层和结束楼层。 第二行输入N个整数,代表在当前楼层只能向上或向下移动的层数。 问从楼层A到楼层B至少需要按几次?如果不能到达,输出”-1”。 题目分析: 由题意可知,从楼层A开始,可以向上到达A+Ki(A+ki <= N)楼层,向下到达A-Ki楼层(A-Ki >= 1)。 并且每个楼层向上或向下到达

2015-02-11 23:29:56 573

原创 [最短路径] POJ 1062 - 昂贵的聘礼

本题题意比较难懂,说白了就是兑换的过程中,最高等级-最低等级<=M,否则不能进行兑换。由于M范围较小,可以枚举等级的区间。 举个例子:假设主人等级为3,M为2。 那兑换的过程中每个人的等级一定在[1,3] 或 [2,4] 或 [3,5]中的某个区间中。 枚举这个区间,然后倒着求最短路即可。注意本题是有向图。#include <stdio.h>#include <string.h>

2015-02-05 23:17:09 644

原创 [Codeforces] 465B - Inbox (100500)

题意:输入一个数字n,代表邮箱里有n封邮件,接下来跟着n个数字0或1,0代表邮件已阅读,1代表未阅读。现有3种操作:1、进入某封邮件2、退出某封邮件3、进入某封邮件的时候,除了第一封邮件内都会有一个阅读前一封的按钮,除了最后一封都会有一个阅读后一封的按钮。问把n封邮件中未阅读的邮件都阅读完,至少需要操作多少次?通过思考可以发现,进入未阅读的邮件后,如果当前邮件下一封

2015-01-25 22:03:37 887

原创 [Codeforces] 474B - Worms

题意:输入一个数字n,接着输入n个数字ai,分别代表区间[1, a1],[a1+1, a2],[a2+1, a3]……[an-1+1, an]。接着输入一个数字m,随后m条询问,询问某个数字在第几段区间内。由于Sigma(ai) 6,此题两种做法,一种做法是读入后二分查找,另一种做法是定义一个106的数组,每次读入一个ai的时候,将这段区间的下标初始化为区间段号即可。#includ

2015-01-25 17:50:01 997

空空如也

空空如也

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

TA关注的人

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