BZOJ 1303: [CQOI2009]中位数图(前缀/后缀和乱搞)

1303: [CQOI2009]中位数图

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 2480  Solved: 1529
[Submit][Status][Discuss]

Description

给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。

Input

第一行为两个正整数n和b ,第二行为1~n 的排列。

Output

输出一个整数,即中位数为b的连续子序列个数。

Sample Input

7 4
5 7 2 4 3 1 6

Sample Output

4

HINT

第三个样例解释:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6}
N<=100000

思路:这道题的思路还是比较经典的…把大于b的数看成1,小于b的数看成-1..于是一段以b为中位数的连续的长度为奇数的数列的和为0.

那么从b往前做一个后缀和,往后做一个前缀和…然后统计每个前缀和/后缀和的值的个数..

然后枚举前缀和/后缀和可能的值(-n..n,由于负数不好处理,整体+n,变成0..2n)

具体见代码

 

 

BZOJ 1800: [Ahoi2009]fly 飞行棋 (尺取+数学)

 

1800: [Ahoi2009]fly 飞行棋

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1530  Solved: 1220
[Submit][Status][Discuss]

Description

给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。

Input

第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各个圆弧长度

Output

所构成不重复矩形的个数

Sample Input

8
1
2
2
3
1
1
3
3
 

Sample Output

3

HINT

N<= 20

思路:一开始的想法是枚举四条边,如果a==c&&b==d,就认为是找到了一个矩形。

重点在于判重,非常不好判断。一开始想要根绝四条边的长度hash一下,但是设想一个所有弧长都相等,且弧长较多的情况。

此时所有矩形的边长长度都相同,但是显然是不同的矩形,因此这种判断方法是错误的。

比较棒的思路是:矩形的对角线一定是外接圆的直径。

因此只需要找有多少条执行,假设为c,那么答案就是c*(c-1)/2(因为任意两条对角线就可以构成一个矩形)

这种做法的好处很明显,不需要判重。

至于如何找直径,直径是把圆周等分的弦,所以尺取找一下就好了。

复杂度O(n)

 

BZOJ 1207: [HNOI2004]打鼹鼠 (LIS)

1207: [HNOI2004]打鼹鼠

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2854  Solved: 1390
[Submit][Status][Discuss]

Description

鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的。根据这个特点阿Q编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格探出头来透透气。你可以控制一个机器人来打鼹鼠,如果i时刻鼹鼠在某个网格中出现,而机器人也处于同一网格的话,那么这个鼹鼠就会被机器人打死。而机器人每一时刻只能够移动一格或停留在原地不动。机器人的移动是指从当前所处的网格移向相邻的网格,即从坐标为(i,j)的网格移向(i-1, j),(i+1, j),(i,j-1),(i,j+1)四个网格,机器人不能走出整个n*n的网格。游戏开始时,你可以自由选定机器人的初始位置。现在你知道在一段时间内,鼹鼠出现的时间和地点,希望你编写一个程序使机器人在这一段时间内打死尽可能多的鼹鼠。

Input

第一行为n(n<=1000), m(m<=10000),其中m表示在这一段时间内出现的鼹鼠的个数,接下来的m行每行有三个数据time,x,y表示有一只鼹鼠在游戏开始后time个时刻,在第x行第y个网格里出现了一只鼹鼠。Time按递增的顺序给出。注意同一时刻可能出现多只鼹鼠,但同一时刻同一地点只可能出现一只鼹鼠。

Output

仅包含一个正整数,表示被打死鼹鼠的最大数目

Sample Input

2 2
1 1 1
2 2 2

Sample Output

1

HINT

Source

 

思路:很巧妙的题目。类比LIS,如果两只仓鼠的曼哈顿距离小于等于两只仓鼠出现的时间,那么就可以从一只仓鼠转移到另一只仓鼠。利用这个条件,做二维的LIS即可。

 

软件体系结构复习笔记