HNOI模拟 Day3.25 By Yqc
怕老婆
【问题描述】
有一天hzy9819,来到了一座大城市拥有了属于他自己的一双滑板鞋。但是他还是不满足想要拥有属于自己的一栋楼,他来到了一条宽敞的大道上,一个一个记录着这些楼的层数以方便自己选择。
hzy9819因为欣欣的要求,所以只喜欢高度h mod p=k的房子。但hzy9819是个鬼畜boy,他总是忘记欣欣的要求,但他不知道其实不是他记错了而是每次欣欣讲的p k都不同。
假设hzy9819每次知道了欣欣要求后是从大道的li点进入,ri点出去。因为害怕老婆的hzy9819怕自己数错,所以请你帮忙统计每次满足鬼女要求的楼有多少栋。
【输入格式】
第一行两个数n,m表示大道上有n栋楼,m表示情圣回去问了鬼女m次
第二行n个数,表示从1~n房子的高度
接下来m行,每行四个数li,ri,p,k。表示询问li到ri之间满足mod p=k的房屋个数。
【输出格式】
m行,每行输出所询问的答案。
【样例输入】
5 2
1 5 2 3 7
1 3 2 1
2 5 3 0
【样例输出】
2
1
【数据说明】
30%:n<=1000,m<=2000
100%: 0<n,m<=10^5,任意1<=i<=n满足hi<=10^4,0<p<=10^4,0<=k<p。
我们首先发现只有询问操作所以我们可以直接离线操作,将询问按照端点排序
接下来我们看到数据范围hi<=10000所以我们将询问分成两种情况处理
p<=100
这时我们可以用f[i][j]表示mod i=j的数有多少个
此时我们所需要统计的就是将r时的值减去l-1时的值可以很容易求出
p>=100
我们可以用f1[i]表示为i的数有多少个
我们只需统计f1[k]+f1[k+1*p]+f1[k+2*p]。。。我们再减去l-1时所得到的值就可以了
保护家园
【问题描述】
在一次偶然的情况下,科学家知道金字塔是古人类为了保护自己抵御外星人入侵而建立的保护塔,它的保护范围为一个R半径的圆形。
因为古人类要保留尽可能多的资源来对外星人进行反扑,所以他们希望保护的范围尽量的小。又因为要为人类保留香火所以要至少保护住k个居住点,这样才能让所有人类住下。现在国王不知道最小确定的R是多少,所以他穿越了千年来找你,要你帮他计算一下。如果你找不到,他就把你“嘿嘿嘿”。
【输入格式】
程序的第一行输入数据为两个整数:N和K(2≤K≤N≤500)——N为居住点的数目,K为至少保护k个居住点。
接下来的N行中,每一行包括了一对整数:X和Y(0≤X, Y≤10,000)——(X,Y)是居住点的坐标。“居住点”的坐标不会重复。保证有合法解。
【输出格式】
仅一行,包含一个实数。推荐保留8位小数。
【样例】
Sample Input 1 |
Sample Output 1 |
10 5 1 8 2 6 4 8 2 2 9 7 8 5 5 3 3 3 4 6 4 1 |
2.23606797
|
Sample Input 2 |
Sample Output 2 |
4 3 2 2 6 2 6 5 2 8 |
|
【数据说明】
35%的数据保证N<=100
100%的数据保证N<=500
暴力:
首先我们考虑暴力怎么写,是不是枚举两个点在圆上(思考为什么不是三个或两个)
对于每两个给定点,试探所有可能的圆,分为以下两种情况:
I) 以该两点连线为圆的直径
II)这两点与其他N-2个点分别组成圆
通过解方程组得出圆心坐标及半径,并检查给定点集在圆内的点的数目
算法分析:
取任意两点,复杂度为O(N2)
求出所有可能的圆,复杂度为O(N)
对于任一个圆求在圆中的点的数目O(N)
算法的总复杂度:O(N4)
显然复杂度不正确,那么接下来怎么做?
正解:
接下来我们首先看一下题目,我们发现其实R是可以二分的,二分性显然可证。
那么我们应该怎么验证和确定的R的正确性呢?
我们可以记得在不久前有一道题是将两个圆是否相交投影到了一个半径上,那么我们这道题我们假设确定了一个点一定在圆上,那么我们将每一个圆投影到这个半径上然后扯开,就转化为了在一个线段上被多条线段最大覆盖量,显然可以(N2logn)
所以总复杂度为(N2lognlogmaxR)
其实也是到水题毕竟以前有接触过啊!
保留实力
【问题描述】
在庞大的中国有大大小小若干个军区,有无数个军人在奋斗,他们为了祖国的荣耀和尊严默默奉献着,他们用生命捍卫着人民至高无上的权益。你或许不知道他们的名字,不知道他们是谁。但是我们知道他们是中国人民解放军,是中国人民的部队,是正义的保护伞,是罪犯的天敌。
现在因为中国每个军区外围都有一个围墙(每个军区都为矩形,围墙是矩形的边缘部分),有一天因为黑客入侵,没有开启型号屏蔽。被M国的卫星不小心检测到了中国的军队部分围墙所在。因为中国军队的数量太庞大,M国联合所有国家向中国施压,要中国公布所有军区的所在地,来确保世界和平。
现在中国的白客组织在一次截取资料时,不小心看到了M国从卫星上观测到的已知的N个军区的情况。但是因为中国以前用了许多的农民来建筑围墙其中有一些是障眼法(现在已经全部拆除了),所以他们也不敢确信这些围墙所围的地方一定是军区的范围,但是他们确信这些地方有军区。
军委主席为了保护尽可能多的民族英雄,希望公开的军区领土越少越好。现在你知道了M国已知的N个军区所在的矩形,现在有一种虚以为蛇的方法,就是公开在带i个(1<=i<=n)军区内,用一个由围墙(可以是别的军区的围墙)组成的矩形来代表第i个军区。而且公开的军区矩形之间不能有重叠部分(而原本军区因为有重点保护区是有重叠部分的)。求最小公开的面积。(如果无法代表所有的军区输出-1)(注:边界可以重叠)
【输入格式】
输入文件第一行括一个数字 N,
接下来 4 行 N 列,每列依次为 4 个数字(x1,y1),(x2,y2)表示一个矩形的对顶角坐标。
【输出格式】
输出最小面积,或者-1
【样例输入1】
2
1 0
1 2
3 4
4 3
【样例输出1】
3
【样例输入 2】
2
0 1
0 1
2 3
2 3
【样例输出 2】
-1
【数据说明】
对于 30%的数据,|X|,|Y| ≤ 100
对于 100%的数据,N ≤30 , |X|,|Y|≤10000
基本上就是裸的暴力题。
将矩形扣出来的方法有太多种 最后的二分图或者费用流就是一个模板所以大家如果想练代码能力的话还是可以打的。
这道题其实只是为了补充算法的多样性其实也是一道水题。
首先我们看到一一对应关系首先就可以想到网络流和二分图。
然后我们可以发现一个性质,对于每一个可以代表军区的矩形内部是没有比他小的矩形的否则选比他小的更优。
然后我们呢可以将每一个不包含其他矩形的矩形给扣出来然后,将其对应的军区连线,然后跑一边带权二分图,或者费用流就可以完美解决这道题了。