loj2001[SDOI2017]树点染色
题意:给你一棵树,一开始每个点上的颜色互不相同。三种操作: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]树点染色的更多相关文章
- SDOI2017 树点染色
\[SDOI2017 树点染色\] 题目描述 Bob 有一棵 $ n $ 个点的有根树,其中 $ 1 $ 号点是根节点.Bob 在每个节点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是,这 ...
- bzoj4817 & loj2001 [Sdoi2017]树点涂色 LCT + 线段树
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4817 https://loj.ac/problem/2001 题解 可以发现这个题就是 bzo ...
- LOJ2001 SDOI2017 树点涂色 LCT、线段树
传送门 注意到每一次\(1\ x\)操作相当于一次LCT中的access操作.由LCT复杂度证明可以知道access的总次数不会超过\(O(nlogn)\),我们只需要模拟这个access的过程并在其 ...
- SDOI2017树点染色
题目链接 发现1操作很像lct中的access,然后它每次染的又是一个新颜色,因此同一个颜色就在同一颗splay里了,且一个点到根的权值val[i]也就是到根路径上虚边的个数,然后看access时会对 ...
- 洛谷3703 [SDOI2017] 树点染色 【LCT】【线段树】
题目分析: 操作一很明显等价于LCT上的access操作,操作二是常识,操作三转化到dfs序上求最大值也是常识.access的时候顺便在线段树中把对应部分-1,把右子树的子树+1即可. 代码: #in ...
- codevs 5963 [SDOI2017]树点染色
[题解]: #include<cstdio> #include<cstring> #include<iostream> using namespace std; ...
- 并不对劲的bzoj4817:loj2001:p3703:[SDOI2017]树点涂色
题目大意 有一棵\(n\)(\(n\leq10^5\))个节点的树,每个点有颜色\(c\),一开始所有颜色互不相同 要进行\(m\)(\(m\leq10^5\))次操作,每次操作是以下三种中的一种: ...
- [Sdoi2017]树点涂色 [lct 线段树]
[Sdoi2017]树点涂色 题意:一棵有根树,支持x到根染成新颜色,求x到y颜色数,求x子树里点到根颜色数最大值 考场发现这个信息是可减的,但是没想到lct 特意设计成lct的形式! 如何求颜色数? ...
- P3703 [SDOI2017]树点涂色
P3703 [SDOI2017]树点涂色 链接 分析: 首先对于询问,感觉是线段树维护dfs序,每个点记录到根的颜色个数.第二问差分,第三问区间取max. 那么考虑修改,每次将一个点的颜色变成和父节点 ...
随机推荐
- vue $attrs 父组件和孙子组件的传值,传函数
上一篇我们说到provide/inject的依赖注入的传值方法,今天我们来说一下另一个父组件给孙子组件的传值方式$attrs 我们接着上一个例子继续来写 parent父组件 我们给child子组件穿了 ...
- 事件循环--eventloop
一.什么是事件循环? 事件循环是 JS 实现异步的具体解决方案,同步代码直接执行,异步函数或代码块先放在异步队列中,待同步函数执行完毕,轮询执行异步队列的函数. 事件循环 二.node.js中的事件循 ...
- Shell 脚本的建立与执行
- hbase报错: hbase.PleaseHoldException: Master is initializing
查看hbase服务状态报错: hbase(main)::> status ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master ...
- VUE.JS 环境配置
首先安装 node.js 网址 https://nodejs.org/en/ 选择版本 点击直接安装OK (不用安装到系统盘) 然后cmd 命令框 输入 npm -version (查看安装版本 ...
- CFgym100020 Problem J. Uprtof
题意:给你n个点m无向条边.每个点是黑色或者白色的.m条边第一条边边权为2^m,第二条边边权为2^(m-1)....... .在这个图上选择一些边连起来,使得满足:每个黑点连奇数条边,每个白点连偶数条 ...
- 【JS学习】慕课网2-7 练习题:制作新按钮,“新窗口打开网站” ,点击打开新窗口。
要求: 1.新窗口打开时弹出确认框,是否打开 提示: 使用 if 判断确认框是否点击了确定,如点击弹出输入对话框,否则没有任何操作. 2.通过输入对话框,确定打开的网址,默认为 http://www. ...
- Zookeeper用作注册中心的原理
RPC框架中有3个重要的角色: 注册中心 :保存所有服务的名字,服务提供者的ip列表,服务消费者的IP列表: 服务提供者: 提供跨进程服务: 服务消费者: 寻找到指定命名的服务并消费. 一:Zooke ...
- SQL的多表查询(Navicat)
-- 部门表 CREATE TABLE dept ( id INT PRIMARY KEY PRIMARY KEY, -- 部门id dname VARCHAR(50), -- 部门名称 loc VA ...
- XML解析方式有哪些?
1.DOM:要求解析器吧整个XML文档装载到内存,并解析成一个Document对象. (1).优点:元素与元素之间保留结构关系,故可以进行增删改查操作. (2).缺点:XML文档过大,可能出现内存溢出 ...