人们说当你遇上你的挚爱时,时间会暂停。真的是这样。但人们没有告诉你,当时针再度恢复转动,它会无比飞快,让人无法赶上。
[2009国家集训队]小Z的袜子(hose)
Description
作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……
具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬。
你的任务便是告诉小Z,他有多大的概率抽到两只颜色相同的袜子。当然,小Z希望这个概率尽量高,所以他可能会询问多个(L,R)以方便自己选择。
Input
输入文件第一行包含两个正整数N和M。N为袜子的数量,M为小Z所提的询问的数量。接下来一行包含N个正整数Ci,其中Ci表示第i只袜子的颜色,相同的颜色用相同的数字表示。再接下来M行,每行两个正整数L,R表示一个询问。
Output
包含M行,对于每个询问在一行中输出分数A/B表示从该询问的区间[L,R]中随机抽出两只袜子颜色相同的概率。若该概率为0则输出0/1,否则输出的A/B必须为最简分数。(详见样例)
Sample Input
6 4
1 2 3 3 3 2
2 6
1 3
3 5
1 6
Sample Output
2/5
0/1
1/1
4/15
【数据规模和约定】
$100\%$的数据中 $N,M ≤ 50000,1 ≤ L < R ≤ N,Ci ≤ N$。
题解
又是一个很裸的莫队,做完这道就开始练习带修莫队啦(HH的项链,[C. color][http://noi.ac/contest/15/problem/44]等等)
这道题只需要说下$O(1)$修改(其他好像很模板,怪不得很多人都背板子),对于每个加入的颜色。
对$curans$的贡献:$2c(v(x))$
但是减少一个的贡献可不是把它反过来,一定要自己推一下是:
$-2c(v(x))+2$
然后就没有然后了,以后莫队都写左闭右开了。
Code:
1 |
|
[国家集训队]数颜色 / 维护队列
题目描述
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:
1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。
2、 R P Col 把第P支画笔替换为颜色Col。
为了满足墨墨的要求,你知道你需要干什么了吗?
输入输出格式
输入格式:
第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。
第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。
第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。
输出格式:
对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。
输入输出样例
输入样例#1:
1 | 6 5 |
输出样例#1:
1 | 4 |
说明
对于$100\%$的数据,$N≤50000,M≤50000$,所有的输入数据中出现的所有整数均大于等于1且不超过$10^6$。
题解
调出第一道带修莫队。
话说有个滑稽的错误让我正好一眼看出来了,然后就过了,如下:
原来的时候我把这两个写反了可还行。。。
然后就很简单了,显然理解这个算法后基本上都是一样的东西了。
虽然号称解决一切序列问题,但是带修莫队真!的!很!慢!
我们在之前已经推导过带修莫队的各种理论了,最优块大小是$n^{\frac{2}{3}}$
但是据说小一点会更快。。
我们按照三元组排序然后暴力就行了。
Code:
1 |
|
今天莫队就做到这里吧,看道POI思维题。
[POI2005]DWU-Double-row
Description
2n 个士兵站成两排. 他们必须重新排列使得任意一排都没有两个相同高度的士兵. 只可以进行一种操作即交换一列中的两个士兵. 你的任务是确定最少要进行多少次操作才能达到要求. Example: 图中所示的是18 个士兵站成了2排. 按图中的方式进行操作.
Input
第一行一个数n, 1 <= n <= 50 000. 接下来两行每行n个数表示对应列的士兵的高度x1, x2,…, xn, 1 <= xi <= 100 000; y1, y2,…, yn, 1 <= y <= i100 000. 数据保证一定存在一组方案使得可以达到目标.
Output
一行输出一个数字表示最少操作数.
题解
太失败了,最后也只得到了40分。。
确实联想到了二分图,但是考虑的情况不够全面。
我是这么想的,假如我们把上下都是有同行重复的元素连边,然后求每个联通块size,然后统计答案。
这样显然是错误的,因为有可能把本来相同的不在同一行的给交换过来然后就错了,所以答案会比实际答案更优。
所以我们应该这么建二分图:还是只考虑相同元素,不过相同元素在同一行的话向另一行对应下标的元素连边权为1的边,在不同的行连边权为0的边,对每个联通块(必定二分图)BFS,每次过边权为1的边需要换颜色,边权为0的不换颜色,这样就让不同行的要么同时换要么同时不换,就正确了。
恩就这样,不想Code.
#1468. Tree
Description
给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K
Input
N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是k
Output
一行,有多少对点之间的距离小于等于k
Sample Input
7
1 6 13
6 3 9
3 5 7
4 1 3
2 4 20
4 7 2
10
Sample Output
5
题解
这题挺好写啊。。。简单容斥原理就行了,不知道进阶指南上的扫描数组是个什么鬼。。。
还是自己想的写的好。
思路的话在我的Post 26中写了,所以我还是要复制一遍233
假如了解过点分治不难想到做法。
对于这种统计路径并且对于一个点p能分治成过p和不过p的,可以很容易联想到点分治做法。
- 求出当前树的重心
- dfs求出每个点到当前重心的距离,排序后用双指针扫描统计,注意容斥,把重心每个子树在这样做一遍即可
- 递归每个子树重心(注意,如果递归的点已经被访问,代表已经被处理,返回即可。)
整个做法的时间复杂度是$O(nlog^2n)$
第二步的容斥网上都讲的繁琐玄学。。。然后我就想到这个方法,可能慢一点但很好理解,就代表去掉相同子树里的点对(不属于简单路径)。
还有就是为什么递归重心最多只需要$logn$次,给出证明:
这个命题等价于将重心删除后,最大联通块小于等于树大小的一半,这里我们可以反证。
如果最大联通块的大小超过一半,那么其它的加起来小于一半,此时重心取那个最大联通块与当前重心相连的点时比当前重心优,即当前重心不满足重心定义,与初始条件矛盾。所以
最大联通块小于等于树大小的一半。
然后就没什么了。
考虑点分治奇多无比的细节与今天阴暗的内心世界,我决定咕掉代码。
然后现在补上了代码,调试代码见证我的努力
Code:
1 |
|