暑假娱乐赛·题解

由于出题人的疏忽,导致T2和T3分别有一个数据造错,造成了大家不必要的麻烦,对此十分抱歉。

这里写一下三道题的题解:

A--LJJ爱数数

题目链接:https://www.luogu.org/problemnew/show/U32290

题目简述:求出有多少个正整数三元组{a,b,c},满足a,b,c<=n,a,b,c三个数的最大公约数为1,且1/a+1/b=1/c。

数据范围:n<=1e12

tag:本题原型来自中等数学2011年第1期,进行了一番改编。

20分:枚举a,b,O(1)算出c,统计答案

100分:

方法一:

化简后得到(a+b)c=ab,设g=(a,b),A=a/g,B=b/g,则g(A+B)c=ABg^2,即(A+B)c=ABg

由题目已知条件:(a,b,c)=1,即(g,c)=1,g|(A+B)c,故g|(A+B),

设(A+B)/g=AB/c= k ∈ Z,

若k>1,因为A,B互质,所以k|A或k|B,则A+B不能被k整除,矛盾。因此k=1。

故充要条件为:1<=a,b,c<=n,a+b=g^2,c=ab/g^2。

枚举g,则可得A+B=g。用莫比乌斯反演求出一定范围内与g互质的数的个数即可。

写程序的过程中,你会发现,枚举1到sqrt(2n)的g之后,只需枚举g的约数。

所以时间复杂度是O(sqrt(n)log(sqrt(n)))

方法二:(PJY提供的此方法十分巧妙)

可以化简得到:(a+b)c=ab,于是ab-bc-ac+c^2=c^2,所以(a-c)(b-c)=c^2

设a-c=km^2,b-c=kn^2,则c=kmn。

若k>1,(a,b,c)=(km^2+kmn, kn^2+kmn, kmn)≠1,矛盾。故k=1

由此我们知道a-c=m^2,b-c=n^2是完全平方数。

因为(a,b,c)=(m(m+n),n(m+n),mn)=((m+n)*(m,n),mn)=1,所以(m,n)=1

故充要条件为1<=a,b,c<=n,a-c, b-c是完全平方数,c^2=(a-c)(b-c),(a-c,b-c)=1

枚举(a-c),用莫比乌斯反演求出一定范围内与sqrt(a-c)互质的数的个数即可。时间复杂度是O(sqrt(n)log(sqrt(n)))

源码:

方法一:https://paste.ubuntu.com/p/mXF2bvXdy7/

方法二:https://paste.ubuntu.com/p/yn5NddzNjj/ (此代码没有用莫比乌斯反演,而是用容斥)

B--LJJ爱数树

题目链接:https://www.luogu.org/problemnew/show/U32382

题目简述:在一棵n个节点的树上的k个点处放k个摄像头。每个摄像头可以看到与之树上距离<=r的点。

使得被看到的点的w[i]之和最大。

数据范围:k<=n<=1000,w[i]<=1e6

tag:

乱搞做法一:如果一个一个放摄像头,每一次把当前w[i]和最大话,那样例一就过不了

乱搞做法二:如果直接假定关于摄像头个数k的函数f(k)是凸函数,那样例二就过不了(因为这个结论是错误的)

10分:枚举2^n种情况(还可以用位运算优化)。

另外20分(k<=2):做法可能有多种,可以暴力枚举两个点,然后用点分或dsu求每种情况的答案。

40分:暴力dp,定义dp数组f[i][j][k][l],

f[i][j][k1][k2]表示第i个节点的子树处理完毕,子树中放了j个摄像头。

期望被观测,但未被观测的最远的点距离ta为k1;最近的摄像头离ta距离为k2。

该dp复杂度或许是O(n^4)吧,(没实现过不清楚)

100分:接着上述40分的题解讲。

我们在dp的过程中,初始化每个节点有三种状态:什么都没发生;放有一个摄像头;虽没放摄像头,但这个点之后会被观测到。

所以dp的过程中,就决定了每个点是否计入答案。其有用的信息为:子树中离点i最近的摄像头的距离,子树中离点i最远的期望被观测的

点的距离。且信息有用当且仅当距离<=r,因为摄像头的观测范围就是r。

如果两个信息同时存在,那么可以忽略摄像头的信息。

这里证明一下:

设最远的期望被观测的点为a点。最近的摄像头为b点。所以dis(a,b)>r。

之后一定有一个摄像头c点,使得dis(a,c)<=r。那么显然dis(c,i)<dis(b,i)。显然,摄像头b能观测到的在 i 子树外的点,c都能观测到。

所以可以忽略b的信息。

所以理所当然地,可以把dp数组写成f[i][j][k](原先第三维和第四维压缩成一维)

之后的dp,可能细节有些繁琐。导致标程可读性差。所以题解里就不阐述了。

这样还不够,因为n<=1000。

我们还需要证明一下:当k*r>=n时,所有的点都能够被观测到。

随便选一个点提根。取深度最深的点,如果深度<=r,直接选择根节点放摄像头。

若深度dep>r,选择与该点距离r的祖先,选择该祖先放摄像头,这样相当于花费一个摄像头砍去了点数>=r的一个子树。

故容易证明k*r>=n时,所有点都能观测到。

所以,k*r<n时,枚举点i,依次把它的儿子所代表的子树合并起来,复杂度是min(k,size[a])*min(k,size[b])*r。

总复杂度可以证明是n*k*r<n^2。(不详细讲证明了)

源码:由于一些原因,晚一点发源码,请见谅。

C--LJJ爱数书

题目链接:https://www.luogu.org/problemnew/show/U32672

题目简述:

一个序列A,每次操作可以使一段连续的区间加1或减1并对K取模,定义F(A,K)表示最少的操作次数使得序列的所有元素都变为0。

输入长度为n的序列A,m次询问F(A[x][y],K)的值。

数据范围:

n<=200000, m<=100000, k<=1e9

tag:

唯一一道数据结构题,所以思路不是那么难。只要你会50分,就可以轻松优化到100分。

10分:搜索+剪枝

30分:先考虑单组询问求F(A,K)。为了方便之后处理,首尾加 0 。

设长度变为N=n+2

我们先考虑如果操作中每次加一、减一后不取模。若A[i]∈Z(可能是负数)。

先对A差分 -> 设B[i]=A[i]-A[i-1](对于1<i<=n),显然B[2]+B[3]+...+B[N]=0

每次操作等同于,B[i]加一,B[j]减一( 1<i,j<=N ),目标是将所有的B[i]变为0。

若未达到目标,因为所有的B[i]之和为0。一定存在B[i]>0,B[j]<0。

所以一定存在一次操作,使得B[i]的绝对值的和减2。

由此我们知道,此时最小操作次数是[abs(B[2])+abs(B[3])+...+abs(B[N])] / 2。(此处abs表示绝对值)

现在题中操作为每次加一、减一后对K取模。所以等同于,先将A数组的某些元素加或减K的倍数。

等同于我们先对差分数组B中某些元素加或减K(根据之前最小操作次数的公式,显然加减范围不会超过K),并维持B[2]+B[3]+...+B[N]=0。

求这样的情况下,[abs(B[2])+abs(B[3])+...+abs(B[N])]/2 的最小值。

容易实现单次询问O(n^2) dp。

50分:接着30分的题解讲,我们要对差分数组的某些数值加K或减K,并维持B[2]+B[3]+...+B[n]=0。

设在S个位置加K,在S个位置减K。(这2S个位置不重复)

显然,我们只会在小于0的位置加K,在大于0的位置减K。所以前者和后者一定不重复。

对于小于0的数 (-a),对其加K可以使代价减少 (2a-K)。

对于大于0的数(a),对其减K可以使代价减少 (2a-K)。

所以,对要加K和要减K的位置,选2a-K前S大的位置,(a是其绝对值)

容易做到单次询问O(n),总复杂度O(mn)。

100分:接着50分的题解讲,显然,我们可以二分这个K,求区间第K大和前K大和即可。(这里不再赘述)

使用主席树或划分树可做到复杂度O(mlog^2n)。

 源码:https://paste.ubuntu.com/p/mYvBWMJ5vx/

原文地址:https://www.cnblogs.com/Blog-of-Eden/p/9367521.html

时间: 2024-11-14 11:59:35

暑假娱乐赛·题解的相关文章

周一训练赛题解

这次完全是水题大集合啊,希望大家A的开心: 前两个题是我找的,后两个是陶叔找的,另外因为我的偷懒,下面所有的代码都是陶叔亲自写的,十分感谢陶叔: 陶叔暑假为了大家的集训,牺牲了很多自己宝贵的时间,大家接下来要好好训练啊!!!! 废话少说,进入正题: Problem A      SPOJ QUEST5 签到题: 将所有的边按照右端点排个序,然后每次选择没有钉住的点,然后把这之后的所有与它相交的边全去掉: 代码: #include <cstdio> #include <cstring>

暑假集训练习赛题解

比赛链接:http://acm.nyist.net/JudgeOnline/problemset.php?cid=205 对于第一道题 UFS(Union  Find  Set) ,请参见http://blog.csdn.net/u011632342/article/details/37814289,题目大意一样,解法一样,不过后台测试数据还没整太多,数据比较弱... 对于第二道题STR(STRing),本来是想着给大家"送福利"呢,可能由于我的题目表述能力不太好或者样例数据的特殊性或

2016 年宁波工程学院第七届ACM校赛题解报告

2016 年宁波工程学院第七届ACM校赛题解报告 本题解代码直接为比赛代码,仅供参考. A,B,C,D,G,H,J,K,L,M 来自 Ticsmtc 同学. F 来自 Gealo 同学. E,I 来自Alex 学长. Promblem A :    Two Sum 时间限制: 1 Sec  内存限制: 64 MB 题目描述: 给出n个数,另外给出?个整数S,判断是否可以从中取出2个数,使得这两个数的和是S. 输入: 第?行有个整数T(1 <= T <= 10),代表数据组数. 对于每组数据,第

20180909徐州网络赛题解

目录 20180909徐州网络赛题解 A. Hard to prepare MEANING SOLUTION CODE B. BE, GE or NE MEANING SOLUTION CODE F. Features Track CODE G. Trace MENING SOLUTION CODE H. Ryuji doesn't want to study MEANING CODE I. Characters with Hash CODE J. Maze Designer MEANING S

10-4国庆节第七场模拟赛题解

10-4 国庆节第七场模拟赛题解 T1工厂 (factory) 水 #include<iostream> #include<cstdio> #define int long long using namespace std; inline int read(){ int sum=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); } while(ch>='0

10月15日模拟赛题解

10月15日模拟赛题解 A 树 Description 给定一棵 \(n\) 个节点的树,每个节点有两个参数 \(a,~b\),对于每个节点,求子树中参数为 \(b\) 的所有节点的 \(a\) 之和 Limitations \(100\%\) \(1 \leq b \leq n \leq 10^5,~a \leq 1000\) \(60\%\) \(1 \leq b,n\leq 1000\) \(30\%\) \(1 \leq b, n \leq 10\) Solution 对于 \(30\%

2020.2.8铁一寒假收官赛题解

2020.2.8铁一寒假收官赛题解 题目均为原题或改编,已得到题主许可 出题人:Memoryヾノ战心 BigYellowDog选手写了份题解,得到出题人许可 T1 这道题是一道很经典的简单dp模型(不会dp的可以先去自学简单入个门 有O(n方)或者O(nlogn)的做法,数据范围n最大不超200,显然O(n方)算法足矣 题目要求最少抽出几本书,可以转化为求最长"舒服样子"序列的元素个数w.答案即为:n-w 具体思路就是定义数组dp1[], dp2[] dp1[i]表示从左到右看,以第i

无聊测试赛题解

无聊测试赛题解 首先膜拜_Zhumingrui大佬获得1000分的好成绩 T1 凯撒密码 T2 积木城堡 T3 出租车拼车 T4 汽车拉力比赛 T5 最佳课题选择 T6 排行榜 T7 豪华游轮 T8 佳佳的魔法药水 T9 矩阵覆盖 待填充 T10 所陀门王的宝藏 T11 老C的键盘 待填充 T12 道路 待填充 原文地址:https://www.cnblogs.com/DannyXu/p/12536283.html

2016ACM青岛区域赛题解

A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 57    Accepted Submission(s): 49 Problem Description Recently, paleoanthropologists have found historical remains on an