zoukankan      html  css  js  c++  java
  • 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}^nsum_{j=1}^nsum_{k=1}^nsum_{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}^nsum_{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=1n​​u(d)[n/d]2​​

    令d1=(i,j),d2=(k,l)那么不难得出

    Ans=sum_{d1=1}^nsum_{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}^nsum_{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/p​​pd1d2f(n/p/d1)f(n/p/d2)e((d1,d2))

    sum_{p=1}^nsum_{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/q​​u(q)pqqd1d2f(n/q/d1)f(n/q/d2)

    T=p*qT=pq

    g(n)=sum_{d=1}^{n} u(d) f(n/d)^2g(n)=d=1n​​u(d)f(n/d)2​​

    s(n)=sum_{d|n} u(d)*d^2*(n/d)s(n)=dn​​u(d)d2​​(n/d)

    则化简得Ans=sum_{T=1}^n s(T)*g(n/T)Ans=T=1n​​s(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:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<cstring>
     7 #define PAU putchar(' ')
     8 #define ENT putchar('
    ')
     9 using namespace std;
    10 const int maxn=20+5,inf=1e9;
    11 inline int read(){
    12     int x=0,sig=1;char ch=getchar();
    13     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
    14     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
    15     return x*=sig;
    16 }
    17 inline void write(int x){
    18     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    19     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    20     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    21 }
    22 int A[maxn],T,n,p[maxn],num;
    23 int dfs(int now,int l,int tot){
    24     if(l>n)return inf;
    25     if(now%p[l]==0)return tot;
    26     return min(dfs(now%p[l],l+1,tot+1),dfs(now,l+1,tot));
    27 }
    28 void init(){
    29     T=read();
    30     while(T--){
    31         n=read();num=read();
    32         for(int i=1;i<=n;i++)A[i]=read();
    33         if(num==0){puts("0");continue;}
    34         sort(A+1,A+1+n);
    35         for(int i=1;i<=n;i++)p[i]=A[n-i+1];
    36         //for(int i=1;i<=n;i++)write(p[i]),PAU;
    37         int tmp=dfs(num,1,1);
    38         if(tmp!=inf)write(tmp),ENT;
    39         else puts("-1");
    40         //write(dfs(num,1));ENT;
    41     }
    42     
    43     return;
    44 }
    45 void work(){
    46     return;
    47 }
    48 void print(){
    49     return;
    50 }
    51 int main(){init();work();print();return 0;}
  • 相关阅读:
    bzoj4236JOIOJI
    bzoj1002[FJOI2007]轮状病毒
    bzoj4563[Haoi2016]放棋子
    前端框架——Bootstrap
    jQuery三——筛选方法、事件
    jQuery二——属性操作、文档操作、位置属性
    jQuery基础——选择器、效果
    JavaScirpt(JS)——BOM浏览器对象模型
    JavaScirpt(JS)——DOM文档对象模型
    JavaScirpt(JS)——js介绍及ECMAScript
  • 原文地址:https://www.cnblogs.com/chxer/p/4694684.html
Copyright © 2011-2022 走看看