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

标程:

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+;
const int N=1e6+;
int f[N],prime[N],tot,F[N],ans,p[N],n,m,nxt,u[N],fi[N];
int ksm(int x,int y)
{
int res=;
for (;y;x=(ll)x*x%mod,y>>=)
if (y&) res=(ll)res*x%mod;
return res;
}
void pre()
{
f[]=f[]=fi[]=fi[]=;
for (int i=;i<N;i++) f[i]=((ll)f[i-]+f[i-])%mod,fi[i]=ksm(f[i],mod-);
u[]=;
for (int i=;i<N;i++)
{
if (!p[i]) prime[++tot]=i,u[i]=-;//质数的u是-1!
for (int j=;j<=tot&&(ll)prime[j]*i<N;j++)
{
p[prime[j]*i]=;
if (i%prime[j]==) break;
u[prime[j]*i]=-u[i];
}
}
for (int i=;i<N;i++) F[i]=;
for (int i=;i<N;i++)
if (u[i]!=)
for (int j=i;j<N;j+=i)
F[j]=(ll)F[j]*(u[i]==?f[j/i]:fi[j/i])%mod;//注意u有可能是-1
for (int i=;i<N;i++) F[i]=(ll)F[i]*F[i-]%mod;
}
int main()
{
pre();int T;
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);ans=;
for (int i=;i<=min(n,m);i=nxt+)
{
nxt=min(n/(n/i),m/(m/i));
ans=(ll)ans*ksm((ll)F[nxt]*ksm(F[i-],mod-)%mod,(ll)(n/i)*(m/i)%(mod-))%mod;
}
printf("%d\n",ans);
}
return ;
}

要把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))。

loj2001[SDOI2017]树点染色的更多相关文章

  1. SDOI2017 树点染色

    \[SDOI2017 树点染色\] 题目描述 Bob 有一棵 $ n $ 个点的有根树,其中 $ 1 $ 号点是根节点.Bob 在每个节点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是,这 ...

  2. bzoj4817 & loj2001 [Sdoi2017]树点涂色 LCT + 线段树

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4817 https://loj.ac/problem/2001 题解 可以发现这个题就是 bzo ...

  3. LOJ2001 SDOI2017 树点涂色 LCT、线段树

    传送门 注意到每一次\(1\ x\)操作相当于一次LCT中的access操作.由LCT复杂度证明可以知道access的总次数不会超过\(O(nlogn)\),我们只需要模拟这个access的过程并在其 ...

  4. SDOI2017树点染色

    题目链接 发现1操作很像lct中的access,然后它每次染的又是一个新颜色,因此同一个颜色就在同一颗splay里了,且一个点到根的权值val[i]也就是到根路径上虚边的个数,然后看access时会对 ...

  5. 洛谷3703 [SDOI2017] 树点染色 【LCT】【线段树】

    题目分析: 操作一很明显等价于LCT上的access操作,操作二是常识,操作三转化到dfs序上求最大值也是常识.access的时候顺便在线段树中把对应部分-1,把右子树的子树+1即可. 代码: #in ...

  6. codevs 5963 [SDOI2017]树点染色

     [题解]: #include<cstdio> #include<cstring> #include<iostream> using namespace std; ...

  7. 并不对劲的bzoj4817:loj2001:p3703:[SDOI2017]树点涂色

    题目大意 有一棵\(n\)(\(n\leq10^5\))个节点的树,每个点有颜色\(c\),一开始所有颜色互不相同 要进行\(m\)(\(m\leq10^5\))次操作,每次操作是以下三种中的一种: ...

  8. [Sdoi2017]树点涂色 [lct 线段树]

    [Sdoi2017]树点涂色 题意:一棵有根树,支持x到根染成新颜色,求x到y颜色数,求x子树里点到根颜色数最大值 考场发现这个信息是可减的,但是没想到lct 特意设计成lct的形式! 如何求颜色数? ...

  9. P3703 [SDOI2017]树点涂色

    P3703 [SDOI2017]树点涂色 链接 分析: 首先对于询问,感觉是线段树维护dfs序,每个点记录到根的颜色个数.第二问差分,第三问区间取max. 那么考虑修改,每次将一个点的颜色变成和父节点 ...

随机推荐

  1. HTML + CSS (上)

    HTML 概念: 超文本标记语言. 核心: 语义. 主体结构: <!doctype html> //告诉浏览器这是什么语言 html //主体 head //头文件 body //页面主体 ...

  2. ICPC2008哈尔滨-A-Array Without Local Maximums

    题目描述 Ivan unexpectedly saw a present from one of his previous birthdays. It is array of n numbers fr ...

  3. std::wcout输出1遍不输出

    std::wcout输出1遍不输出 程序明明在执行地方执行 wcout无法输出到控制台 cout就可以 添加中文支持即可

  4. logo的普遍写法

    h1为了搜索引擎优化<div class="logo"> <h1> <a href="#">XX</a> < ...

  5. vue 学习八 自定义指令

    vue指令注册有两种方式 1 全局注册 在main.js中 使用vue.directive Vue.directive('alert_w', { inserted(el,bin,vn) { conso ...

  6. 【记坑】Oracle数据库Date类型查询结果多出".0"的解决方法

    oracle设置数据库某张表的字段类型为date,数据库存值为 2019-11-25 18:51:47 格式,但是从数据库查询出来之后格式为 String stopTime = map.get(&qu ...

  7. Laravel5.5添加新路由文件并制定规则

    Laravel5.5里面有4个默认的路由文件,其中web.php是默认路由文件,如果需要添加其他路由文件,按照以下步骤进行. 此处以添加网站home前端路由举例,我已经先在/app/Http/Cont ...

  8. NLP(一) Python常用开发工具

    一.Numpy NumPy系统是Python的一种开源的数值计算包. 包括: 1.一个强大的N维数组对象Array: 2.比较成熟的(广播)函数 库: 3.用于整合C/C++和Fortran代码的工具 ...

  9. 【转】SpringMVC整合websocket实现消息推送及触发

    1.创建websocket握手协议的后台 (1)HandShake的实现类 /** *Project Name: price *File Name:    HandShake.java *Packag ...

  10. [Android开发] 代码code设置9.png/9-patch 图片背景后,此view中的TextView等控件显示不正常(常见于listview中)

    == 0) { convertView.setBackgroundResource(R.drawable.list_gray_9); } else { convertView.setBackgroun ...