BestCoder Round #49
呵呵哒,1001的dfs返回值写错,wa了两发就没分了,1002显然是PAM可是我没学过啊!!!压位暴力可不可以。。。看看范围貌似不行,弃疗。。。1003根本不会做,1004想了想lcc发现不可做,那就是仙人掌分治,没写完囧。。。
最后Rating+69滚粗了。。。
官方题解:
1001 Untitled
对于一组可能的答案cc,如果先对一个觉小的c_ici取模,再对一个较大的c_jcj取模,那么这个较大的c_jcj肯定是没有用的。因此最终的答案序列中的cc肯定是不增的。那么就枚举选哪些数字,并从大到小取模看看结果是否是00就可以了。时间复杂度O(2^n)O(2n).
1002 Three Palindromes
对原串前缀和后缀作一个01标记pre[i],suf[i]表示1-i和i-n能否能形成回文。记以i为中心的回文半径为r(i)。
这些都可以在O(N)时间内求出。也可以使用Hash+二分等方法O(NlogN)内求出。
我们考虑中间一个回文串的位置,不妨设它是奇数长度(偶数类似)。
那么问题变成了求一个i和d使得1<=d<=r(i)且pre[i-d]和suf[i+d]为真。
枚举i,实际上就是问pre[i-r(i)..i-1]和suf[i+1..i+r(i)]取反后 这两段有没有一个位置两者均为1,也就是and后不为0,暴力压位即可。
总时间复杂度为O(N^2/32)O(N2/32)。
1003 Gcd and Lcm
详见推导。
Ans=\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\sum_{l=1}^n [(i,j),(k,l)]Ans=∑i=1n∑j=1n∑k=1n∑l=1n[(i,j),(k,l)] 不妨先考虑下式
r(n,d)=\sum_{i=1}^n\sum_{j=1}^n [(i,j)=d]r(n,d)=∑i=1n∑j=1n[(i,j)=d]
令f(n)=r(n,1),则r(n,d)可以等价于f(n/d)。
f(n)=sum_{i=1}^{n}\sum_{j=1}^{n}f(n)=sumi=1n∑j=1n e[(i,j)] (e为单位函数) = sum_{d=1}^{n} u(d) [n/d]^{2}=sumd=1nu(d)[n/d]2
令d1=(i,j),d2=(k,l)那么不难得出
Ans=\sum_{d1=1}^n\sum_{d2=1}^n [d1,d2] f(n/d1)f(n/d2)Ans=∑d1=1n∑d2=1n[d1,d2]f(n/d1)f(n/d2)
令p=(d1,d2)则
\sum_{p=1}^n\sum_{d1=1}^{n/p}\sum_{d2=1}^{n/p} p*d1*d2*f(n/p/d1)*f(n/p/d2) e((d1,d2))∑p=1n∑d1=1n/p∑d2=1n/pp∗d1∗d2∗f(n/p/d1)∗f(n/p/d2)e((d1,d2))
\sum_{p=1}^n\sum_{q=1}^{n/p}\sum_{d1=1}^{n/p/q}\sum_{d2=1}^{n/p/q} u(q)*p*q*q*d1*d2*f(n/q/d1)*f(n/q/d2)∑p=1n∑q=1n/p∑d1=1n/p/q∑d2=1n/p/qu(q)∗p∗q∗q∗d1∗d2∗f(n/q/d1)∗f(n/q/d2)
令T=p*qT=p∗q
令g(n)=\sum_{d=1}^{n} u(d) f(n/d)^2g(n)=∑d=1nu(d)f(n/d)2
s(n)=\sum_{d|n} u(d)*d^2*(n/d)s(n)=∑d∣nu(d)∗d2∗(n/d)
则化简得Ans=\sum_{T=1}^n s(T)*g(n/T)Ans=∑T=1ns(T)∗g(n/T)
s为积性函数,可以O(N)时间内预处理出1-N的所有函数值。 可惜的是g并非积性函数,但我们亦可以在O(sqrt(N))的时间求出g(N)。 在最后的答案中我们对g(n/T)的每种取值均算一遍即可,注意多组数据时记忆化。
1004 Dynamic Cactus
考虑离线,并对仙人掌进行分治。
类似于树的点分,每次的分治中心无非是两种情况:节点或者环。
这样每次新建节点时就去更新过分治中心的答案。
为了保证更新答案的两个点分属不同子树:
对于普通节点,只要维护最大和在另一子树的次大距离即可;对于环,由于环上的距离计算存在序的问题以及两种走法,我们可以在环上任选一个开始位置,需要分前后两部分更新和询问,可以用四个BIT维护前缀后缀和正负符号。
总时间复杂度为O(NlogNlogN)O(NlogNlogN)。
1001:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=+,inf=1e9;
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
while(isdigit(ch))x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
int A[maxn],T,n,p[maxn],num;
int dfs(int now,int l,int tot){
if(l>n)return inf;
if(now%p[l]==)return tot;
return min(dfs(now%p[l],l+,tot+),dfs(now,l+,tot));
}
void init(){
T=read();
while(T--){
n=read();num=read();
for(int i=;i<=n;i++)A[i]=read();
if(num==){puts("");continue;}
sort(A+,A++n);
for(int i=;i<=n;i++)p[i]=A[n-i+];
//for(int i=1;i<=n;i++)write(p[i]),PAU;
int tmp=dfs(num,,);
if(tmp!=inf)write(tmp),ENT;
else puts("-1");
//write(dfs(num,1));ENT;
} return;
}
void work(){
return;
}
void print(){
return;
}
int main(){init();work();print();return ;}
BestCoder Round #49的更多相关文章
- Manacher BestCoder Round #49 ($) 1002 Three Palindromes
题目传送门 /* Manacher:该算法能求最长回文串,思路时依据回文半径p数组找到第一个和第三个会文串,然后暴力枚举判断是否存在中间的回文串 另外,在原字符串没啥用时可以直接覆盖,省去一个数组空间 ...
- DFS BestCoder Round #49 ($) 1001 Untitled
题目传送门 /* DFS:从大到小取模,因为对比自己大的数取模没意义,可以剪枝.但是我从小到大也过了,可能没啥大数据 */ /************************************* ...
- CodeForce Round#49 untitled (Hdu 5339)
Untitled Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]
传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131 ...
- BestCoder Round #89 02单调队列优化dp
1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...
- BestCoder Round #90 //div all 大混战 一题滚粗 阶梯博弈,树状数组,高斯消元
BestCoder Round #90 本次至少暴露出三个知识点爆炸.... A. zz题 按题意copy Init函数 然后统计就ok B. 博弈 题 不懂 推了半天的SG..... 结果这 ...
- bestcoder Round #7 前三题题解
BestCoder Round #7 Start Time : 2014-08-31 19:00:00 End Time : 2014-08-31 21:00:00Contest Type : ...
- Bestcoder round #65 && hdu 5593 ZYB's Tree 树形dp
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...
- Bestcoder round #65 && hdu 5592 ZYB's Premutation 线段树
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...
随机推荐
- [Angular 2] Passing data to components with 'properties'
Besides @Input(), we can also use properties on the @Component, to pass the data. import {Component, ...
- Android深入浅出之 AudioTrack分析
Android深入浅出之Audio 第一部分 AudioTrack分析 一 目的 本文的目的是通过从Audio系统来分析Android的代码,包括Android自定义的那套机制和一些常见类的使用,比如 ...
- The following module was built either with optimizations enabled or witherout debug information
出现这个问题的原因是这个程式有做版控,服务器上的版本比本机版本小 解决方式为:删除服务器上的版控或者本机版本改成与服务器一致即可
- <c:if>判断参数是否同时为空
<c:if test="${empty str}"> str为空</c:if> <c:if test="${not empty str}& ...
- CSS 布局Float 【0】
float是 css 样式的定位属性.我们在印刷排版中,文本可以按照需要围绕图片.一般把这种方式称为“文本环绕”.在网页设计中,应用了CSS的float属性的页面元素就像在印刷布局里面的被文字包围的图 ...
- 数据类型的转换String
x.toString(): 无法转换null和undefined 不过String()却是万能的,其中的原理如下 function String(x){ if(x===undefined){ retu ...
- 解决Eclipse中编辑xml文件的智能提示问题,最简单的是第二种方法。
Eclipse for Android xml 文件代码自动提示功能,介绍Eclipse 编辑器中实现xml 文件代码自动智能提示功能,解决eclipse 代码提示失效.eclipse 不能自动提示. ...
- Shell 脚本编程笔记(一) Hello Shell
最近不断在接触Linux操作系统,对它一个终端走天下的特性感到十分新奇和伟大.同时也被各种命令折磨的死去活来...公司的一个老同事给我讲,在公司的极品geek宅都是只用一个黑黑的框完成一切的.结果我一 ...
- javascript 计时器,消失计时器
var setId= setInterval(function () { alert('点我'); }, 1000); onload = function () { //消灭计时器 clearInte ...
- 一元云购完整源码 云购CMS系统 带安卓和ios手机客户端
看起来不错的一套一元云购CMS源码,源码包里面带了安卓和ios手机客户端,手机客户端需要自己反编译. 这里不做功能和其它更多的介绍,可以自己下载后慢慢测试了解. 下面演示图为亲测截图< ...