日度归档:25 2 月, 2017

THU2017spring 1-2 Company 题解

THU2017spring 1-2 Company


描述

公司有n个员工,编号1 ~ n。员工数量众多,需要你为他们编写一个管理系统。

员工上班时都要登录管理系统登记一个code,离开要从管理系统上注销,员工也可以随时更新自己的code。到了下班时间,所有员工都会自动注销。公司管理人员随时都可能想要知道有多少员工上班,以及任一员工登记的code。

输入

第一行两个整数n、m。接下来m行,每行都是以下内容之一:

I a c	//Log In:员工a登录,code为c。若a已登录,则将code更新为c
O a		//Log Out:编号为a的员工注销。若a未登录,则注销无效
C			//Close:到下班时间,所有员工注销
N			//Number:询问有多少员工正在上班
Q a		//Query:询问员工a的code(若未登录或已注销,视为-1)

输出

一个整数,是所有询问(N、Q)的答案之和(int表示,自动溢出,不用管溢出部分)

输入样例

10 8
I 1 2
I 1 4
Q 1
C
I 2 4
O 2
Q 2
N

输出样例

3
//“Q 1”答案是4,“Q 2”答案是-1,“N”答案是0,所有答案之和为3

限制

n <= 10,000,000

m <= 1,000,000

1<=a<=n

code为[0, 2^31)的整数

空间限制:256 MB

时间限制:2 sec

提示

一级提示

测试数据中,每种操作都可能频繁出现,或很少出现。因此,你的算法需要应对所有可能的情况。

● Bitmap / 常数时间初始化的数组

● Bitmap: 习题解析[2-34],实例参考[2-35],[2-36]

二级提示

● 避免频繁初始化整个数组。

● 可以借助Bitmap记录数组的各元素是否已被初始化。将一个(或所有)元素置为未初始化状态,实质上只需要打破“校验环”两个验证条件中的任何一个,考虑如何打破校验条件的复杂度最低。

● 还可以使用“懒删除”策略。

● 参考习题[2-34]。

用scanf(“%c”, …)或getchar()读入一个字符时,可能会读到空格、制表符、回车符或换行符,尽量避免使用这个方法。使用scanf(“%s”, …)会自动过滤空白字符。

继续阅读

THU2017spring 1-1 Team 题解

Xuetangx:Data Structure and Algorithm of Tsinghua University 晋级全校公选课 PA1 THU2017spring 1-1 Team

THU2017spring 1-1 Team


描述

教练员A、B和C将要从编号为1到n的队员中挑选自己的队员。为公平起见,每个教练都根据自己的喜好程度将队员排序;你负责根据以下规则为他们分配队员。

你拿到的数据是a、b、c三个数组,表示三个教练对队员的喜好程度排序,每个数组都是数字1到n的一个排列,下标越小表示教练越喜欢该队员。你的分组规则是,从还未被分配的队员中找一个教练A最喜欢的队员分到A组;然后,在未分配的队员中分配教练B最喜欢的队员到B组;然后是教练C;再是教练A、B……依次类推直到所有队员分配完毕。

现在队员k希望知道自己被分配给哪位教练,请你来告诉他。

输入

共5行。

第1行包含一个整数n。

第2至4行依次是数组a、b和c,每行都是整数[1, n]的一个排列。

第5行包含一个整数k。

输出

仅一个字符,A、B或C,表示队员k被分配给哪位教练。

输入样例1

3
1 2 3 
1 2 3 
1 2 3 
3

输出样例1

C

输入样例2

5
1 2 3 4 5 
1 3 5 4 2 
5 4 3 2 1 
4

输出样例2

B

限制

1 <= n <= 500,000

1 <= k <= n

时间:1 sec

空间:256 MB

提示

● 大体上,1 sec内,O(n)的算法可以通过n = 10,000,000规模的数据,O(nlogn)通过500,000规模,O(n^2)通过5,000规模。

● 本题等一些复杂度是O(n)的题目受限于scanf(“%d”, …)的读入速度,但又不希望通过读取二进制文件等不直观的方式增加同学们的负担。

● “懒删除”策略:从序列中移除一个元素时,可以只标记它,下次读取时跳过它,而不需要将它后面的元素都向前挪一位。思考如何做标记,能在每个教练员选队员时,快速地知道该队员是否已被选走。

Tips:清零或赋值时,memset比手动赋值快几倍。输入数据时,有时scanf比cin快一些。关于读写速度,请参考Tutorial Collection #1 5.大数据(Big)。

继续阅读

Openjudge 最佳加法表达式 题解

最佳加法表达式

总时间限制:
1000ms
内存限制:
65536kB
描述
给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值。例如,在1234中摆放1个加号,最好的摆法就是12+34,和为36
输入
有不超过15组数据
每组数据两行。第一行是整数m,表示有m个加号要放( 0<=m<=50)
第二行是若干个数字。数字总数n不超过50,且 m <= n-1
输出
对每组数据,输出最小加法表达式的值
样例输入
2
123456
1
123456
4
12345
样例输出
102
579
15
提示
要用到高精度计算,即用数组来存放long long 都装不下的大整数,并用模拟列竖式的办法进行大整数的加法。
来源
Guo Wei

极其坑爹的一道题!要写高精度!坑人!
继续阅读