ZLXSC2015Day1题解
比赛情况:
总共9人参加,衡中还是没来几个人
frontier 200
Zayin 170
Changke 120
另外4个人100+
比我预期的要低,估计是题太恶心没人做吧......
最小距离和的暴力只有一个人写出来,我题目中把暴力做法都给了......,暴力64分啊
PERICA倒是有很多人A
刺杀特朗普题目太难理解.....
有丝分裂也有人A,100分的是扩展大步小步,70分的是普通大步小步
PERICA
Perica 开始弹奏钢琴了。他的钢琴由N个琴键组成,每个键有一个权值ai,当Perica开始弹琴时,他同时按K个不同的键。但是这个钢琴十分古怪,在他同时按了 K个键之后,我们只能听到具有最大权值的那个键。现在Perica准备试试这个钢琴K个键的所有组合,他想要知道将要听到琴声的权值和。因为结果会很大, 所以输出mod 1000000007之后的结果。
关键词:水题,排序,统治,组合数
这道题不是我出的,是raywzy出的
我们对所有权值从小到大排序后可见A[m]的统治范围为A[1]-A[m-1](即A[m]>=A[1]…..A[m-1])于是我们从前m-1个数中挑出k-1个,即,就可以和A[m]组成以A[m]为最大值的组合
直接用乘法逆元求组合数会T(好像也不会?),所以还是先递推筛出来一个组合数表即可
有一道利用单调栈求统治范围的题,即COGS2065“学数数”,是一道经典好题,比这道题难很多,建议做一做。
sort(A+1,A+n+1);
ans=0;
· for(i=n;i>=k;i--)
· {
· ans+=A[i]*C[i-1][k-1];//C为组合数
· ans%=mod;
· }
这样做的复杂度为
开头水一水,要不没人做
刺杀特朗普
本题其实是一道大水题,常可神牛就一眼看透了本题的水题性质。
关键词:中等题,分类讨论,开区间的处理方法,带权区间求最大点权覆盖,离散化,差分数列/树状数组/线段树
所谓化学理论的内容其实一直在吓你,真正有用的是:
G=H-TS,G<0
所以H-TS<0
移项得TS>H
对S的正负进行讨论,当S>0时,T>H/S,当S<0时,T<H/S
例如样例第三行H,S的处理
2 4 -3 -12 3 1
H1=2,S1=4
得T>2
H2=-3,S2=-12
得0<=T<4
两个求交,即产生带权区间2<T<4,权值为3
如果是
2 4 -3 -12 3 0
两个求并,即产生带权区间0<=T<INF,权值为3
当G=0时反应不发生,我们通常处理的都是闭区间,如何处理开区间呢?
我们一定要注意开区间和闭区间是不一样的,比如我们得到了(1,3),(3,5)两个区间,3是一个没有覆盖到的点。
我的数据比较水,也许你按闭区间处理也能过
我们可以把开区间转化为闭区间,如
(2,4)我们转化成[2.00000000001,3.99999999999]不就可以了?
即(x,y)我们转化为[x+eps,y-eps]
所谓“与”和“或”也是吓你的,你对得出的区间求交或者求并即可(如果只有一个不等式得出来的是射线而不是区间我觉得不优美)
剩下的就是经典套路了,显然可以得出,最优解一定在区间端点处取得,如果我们直接枚举每个区间端点(即温度)然后判断是否满足不等式,
那么时间复杂度为,我也不知道能过几个点。
于是我们把区间离散化,然后用差分数列/树状数组/线段树把这些区间的权值强行加到数轴上,然后枚举取最大的即可。
(类似于月亮中学dashgua COGS比赛的第一题)。时间复杂度(排序+离散化)
多-有丝分裂
首先细菌的增长模型为a^T
我们不管有多少个“吃饱了”的吞噬细菌,只关心剩下的细菌是否有b个.
这题的区分度最大,前几道题我都不知道怎么给部分分。
于是这题就显而易见了:
求的最小正整数解x
关键词:难题,同余方程,分块,哈希表,扩展大步小步算法,最大公约数,离散对数。
所谓夹心数就是质数,因为phi(n)=n-1……
COGS貌似连普通大步小步算法的模板题都没有,所以我先出个扩展的
首先给出定理:
a^x mod c = b的最小正整数解x0<=c,
这个定理我不会证明,貌似是x>c时一定会出现重复情况
对于20%的数据,暴力枚举即可,复杂度
对于另外10%的数据,由于b=1,c为质数
根据费马小定理:
那么如果d为p-1的约数,即
那么,因为一堆1相乘结果还是1
所以我们枚举p-1的约数即可,复杂度为
对于另外20%的数据,由于b=1
根据欧拉定理:
.
所以我们可以算出,然后跟上面一样,枚举的约数即可
对于70%的数据,普通大步小步算法
对于100%的数据,扩展大步小步算法
详情请见下面的链接,这个人讲的比较清楚,比许多人的意识流讲解不知道高到哪里去了,
(里面还有一些多项式求逆、多项式除法、多项式开方、多项式的扩展欧几里得算法......)
http://blog.miskcoo.com/2015/05/discrete-logarithm-problem
但是有一些东西我还是要讲讲(我认为很重要):
Q:大步小步算法是什么思想?
A:首先根据上面的定理a^x mod c = b的解x<=c,定义X为sqrt(c)向下取整的数即,如c=51时,X=7
我们把它转化为一个一次函数解转化为另一个形式x=AX+B,我们要保证这个一次函数要能表示1<=c的所有整数。
定理一:如果A取[1,X+1],B取[0,X-1]则AX+B能表示所有1<=c的整数
我们可以这样理解:A决定大方向,B决定小步数
如果c=51,X=7时,AX就是7,14,21,28,35,42,49,56,B就是0,1,2,3,4,5,6
任意1<=c都可以由一对(A,B)->c=AX+B表示
如果我们枚举A,B复杂度仍然是O(sqrt(c)*sqrt(c))=
但是,我们可以把B移到方程的右边,然后两边各自枚举A,B然后开一个map或者哈希表判断是否相等即可,
我认为这是利用了分块+哈希的思想(如果错了请指出)
哈希表最终的复杂度为
如果用map的还要乘一个log2(c)
我们还要注意无论B移到左边还是右边,都至少有一个出现负号,于是,我们必须保证a存在逆元,即gcd(a,c)=1,所以如果c不是质数,只要a,c互质也可以。(这是普通情况)
扩展的情况:即gcd(a,c)不保证为1
利用了同余方程的一个性质:
什么情况下会无解?
b不整除gcd(a,c)
为什么?
如果b不整除gcd(a,c),那么 (即ax+cy=b)无解
又因为a^x都可以由ax表示,即a^x的正整数解一定属于ax的正整数解的子集,如果ax mod c= b无解,那么a^x mod c=b一定更无解
总算有一道达到了VFK的好题标准之一-至少四档部分分,整整有5档!
最小距离和
关键词:地狱难度!这题能做?计算几何题都是坑题,出题人傻逼,出题人智障,出题人脑残,搞OI的妹子少,卡常数。
哈哈哈出题人不是ZLX,是国家集训队的金恺
真关键词:几何证明,暴力法,关于极限的导数证明,随机化,爬山,
模拟退火,模拟退火,模拟退火
这题是一道挑战题,首先题目已经直接说明了枚举每一个点对,然后计算所有距离的方法,总时间的暴力算法,能得64分,当然如果你还是不会算点到直线的距离的话,我就没办法了。
这是金恺2004年论文的链接:
http://wenku.baidu.com/link?url=OM2oeYT6GKd8sRwnbZQCnpWBt5qmm8cWt8NE2AdQ5az3oFIbdmgtO13X2uCuOgs892MqCQyVZg1_4uG9dY8ns9EjPd_tQHhY1LAYJppdWBu
而这道题是2003年金恺的集训队作业,我只能找到他2004年的论文,他的论文中有一种的做法,然后还没有将具体实现,所以我还不会。然后根据2003年的情况,出题人的最大数据要跑55秒…….
可能现在评测机快一点?
我显然不知道正解,我也是一套骗分的套路,没想到竟然能A哈哈哈
你看像最小圆覆盖,帝国反击战这样的题,我们模拟退火点的位置就可以啦,
那么问题来了,这题是一条直线,除了极角,还有一个平移量c,根本没法搞啊?
兵来将挡,水来土掩……
二维模拟退火!
前无古人,后无来者!
第一维模拟退火直线极角,随机一个初始角度然后第二维
第二维模拟退火直线的平移量,于是我们就这样得到了一条直线
我的直线是用两点式表示的,如果要使用y=kx+b的话,一是距离不好求,二是要考虑k=INF(即直线与y轴平行)的情况。
计算点到直线的距离先使用叉乘算出这两个点和所求点所围成的平行四边形的面积,然后除以这两点的所组成的线段,即面积/底=高
但是我交了几次,发现还有精度问题……..,因为是二维的模拟退火,根据《误差分析》,误差会大大增大。
怎么办?怎么办?
我做了3个小时,交了20多遍,就这样前功尽弃了吗?
不!
再暴力即可!由于我们暴力所用到的定理,此直线必过原图的两个点。
我们得到的近似直线已经很优了,几乎与真正过原图两个点的直线重合。于是我机智的想出,让所有的点对这个直线求距离,从小到大排序,对距离最近的100个点进行n^3的暴力枚举(使用那个64分的做法)。于是就得到了精确解!
至于模拟退火算法我这里就不多讲了,可以看一看相关的论文
时间复杂度,step为模拟退火的步长,最大数据只跑了4秒。
ZLX大法好!
总结
这次比赛能做到100+就已经很不错了,总共4道题,分别考的是:组合数,区间处理,数论,计算几何。第一道题和第四道题是别人出的题,第二道和第三道是我自己出的,基本上是一个数学专题。这次比赛内容总体来讲不太正常,不过没有关系我们还有Day2,如果有可能的话还有Day3,ZLX为了弘扬我大中华优秀传统文化,提高广大OIER的语文水平,特地准备了高级阅读理解模块。
另外如果还不理解可以在COGS用户群或者此评论区求代码,由于篇幅太长我就先不粘代码了,有疑问可以评论指出.
2016年3月19日