• loj2001[SDOI2017]树点染色


    题意:给你一棵树,一开始每个点上的颜色互不相同。三种操作:op1:x到根的路径上的点都染上一种新的颜色。op2:设一条路径的权值为val(x,y),求x到y路径的val。op3:询问x的子树中最大的到根路径val。n<=1e5。

    标程:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int mod=1e9+7;
     5 const int N=1e6+1;
     6 int f[N],prime[N],tot,F[N],ans,p[N],n,m,nxt,u[N],fi[N];
     7 int ksm(int x,int y)
     8 {
     9   int res=1;
    10   for (;y;x=(ll)x*x%mod,y>>=1) 
    11     if (y&1) res=(ll)res*x%mod;
    12   return res;
    13 }
    14 void pre()
    15 {
    16   f[1]=f[2]=fi[1]=fi[2]=1;
    17   for (int i=3;i<N;i++) f[i]=((ll)f[i-1]+f[i-2])%mod,fi[i]=ksm(f[i],mod-2);
    18   u[1]=1;
    19   for (int i=2;i<N;i++)
    20   {
    21     if (!p[i]) prime[++tot]=i,u[i]=-1;//质数的u是-1!
    22     for (int j=1;j<=tot&&(ll)prime[j]*i<N;j++)
    23     {
    24       p[prime[j]*i]=1;
    25       if (i%prime[j]==0) break;
    26       u[prime[j]*i]=-u[i];
    27     }
    28   }
    29   for (int i=0;i<N;i++) F[i]=1; 
    30   for (int i=1;i<N;i++)
    31     if (u[i]!=0)
    32     for (int j=i;j<N;j+=i)
    33       F[j]=(ll)F[j]*(u[i]==1?f[j/i]:fi[j/i])%mod;//注意u有可能是-1
    34   for (int i=1;i<N;i++) F[i]=(ll)F[i]*F[i-1]%mod;
    35 }
    36 int main()
    37 {
    38   pre();int T;
    39   scanf("%d",&T);
    40   while (T--) 
    41   {
    42     scanf("%d%d",&n,&m);ans=1;
    43     for (int i=1;i<=min(n,m);i=nxt+1)
    44     {
    45       nxt=min(n/(n/i),m/(m/i));
    46       ans=(ll)ans*ksm((ll)F[nxt]*ksm(F[i-1],mod-2)%mod,(ll)(n/i)*(m/i)%(mod-1))%mod;
    47     } 
    48     printf("%d
    ",ans);
    49   }
    50   return 0;
    51 }
    View Code

    要把lct上和原树上的father区分开啊!

    题解:lct+dfs序线段树

    op1一看就是lct维护access。将A颜色splay连到B颜色splay上时,A颜色splay上深度最小点(原树上的根)的子树val都-1,B颜色断开的右子树(即不在改色链上的那段)val都+1。

    op2 设val[x]表示x到根的路径权值。相当于要求val[x]+val[y]-2*val[lca(x,y)]+1。线段树单点求值,注意要用dfs序查。

    op3 询问子树最大值val,线段树区间Max。

    时间复杂度O(nlog^2(n))。

  • 相关阅读:
    php类型运算符
    今天我开始写自己的东西
    挑选简历
    SQL Server和Oracle数据库索引介绍
    排序算法分析与设计实验
    软件框架 转
    【转】Ajax的原理和应用
    Web Service
    [转]异地分布式敏捷软件开发(Distributed Agile Software Development)
    [转]如何有效的使用C#读取文件
  • 原文地址:https://www.cnblogs.com/Scx117/p/9172621.html
Copyright © 2020-2023  润新知