[jzoj 6086] [GDOI2019模拟2019.3.26] 动态半平面交 解题报告 (set+线段树)
题目链接:
https://jzoj.net/senior/#main/show/6086
题目:
题解:
- 一群数字的最小公倍数就是对它们质因数集合中的每个质因数的指数取$max$然后相乘
- 这样的子树查询一般都与$dfs$序有关
- 不妨把一个质因数$p$拆分成$p^1,p^2,p^3...$这样若干种颜色,每种颜色对答案的贡献都是$p$
- 我们从另一个角度来考虑如何处理“不同的数”。先不管深度,考虑两个点权相等的节点$u$和$v$,点权为$val$,他们自己的贡献是使得所有子树内包含他的节点答案乘以$val$,现在考虑重复了的贡献,同时包含$u$和$v$的节点答案被乘了两次,即包含$lca(u,v)$的节点答案需要被除去一个$val$。
- 多个节点的时候,只需按$dfs$序排序,相邻两个的$lca$处除即可。现在我们要考虑深度,只需要将询问离线并按深度排序,节点按深度排序后一个一个加入即可。维护点权相同的点可以用$set$,维护$dfs$序用线段树。这是一个很经典的做法
- 在线的话,把线段树可持久化即可
代码:
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<set>
#include<map>
using namespace std;
typedef long long ll; const int N=1e5+;
const int M=1e7+;
const int mo=;
int n,tot;
int a[N],head[N];
set <int> s[N*];
map<int,int>hsh;
struct EDGE
{
int to,nxt;
}edge[N<<];
inline int read()
{
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
int cnt;
int prime[M],mn[M],vis[M];
void pre()
{
mn[]=;
for (int i=;i<M;i++)
{
if (!vis[i]) prime[++cnt]=i,mn[i]=i;
for (int j=;j<=cnt&&prime[j]*i<M;j++)
{
vis[prime[j]*i]=;mn[prime[j]*i]=prime[j];
if (i%prime[j]==) break;
}
}
}
int qpow(int a,int b)
{
int re=;
for (;b;b>>=,a=1ll*a*a%mo) if (b&) re=1ll*re*a%mo;
return re;
}
void add(int u,int v)
{
edge[++tot]=(EDGE){v,head[u]};
head[u]=tot;
}
int tim;
int fa[N][],st[N],ed[N],dep[N],tid[N];
void dfs(int x,int p)
{
dep[x]=dep[p]+;
st[x]=++tim;tid[tim]=x;
fa[x][]=p;
for (int i=;i<=;i++) fa[x][i]=fa[fa[x][i-]][i-];
for (int i=head[x];i;i=edge[i].nxt)
{
int y=edge[i].to;
if (y==p) continue;
dfs(y,x);
}
ed[x]=tim;
}
int lca(int x,int y)
{
if (dep[x]<dep[y]) swap(x,y);
for (int i=;i>=;i--) if (dep[fa[x][i]]>=dep[y]) x=fa[x][i];
if (x==y) return x;
for (int i=;i>=;i--) if (fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
return fa[x][];
}
bool cmp(const int &a,const int &b) {return dep[a]<dep[b];}
int idx;
int get(int x)
{
if (!hsh[x]) hsh[x]=++idx;
return hsh[x];
}
int sz;
int rt[N],mul[N*],ls[N*],rs[N*];
void ins(int &o,int lst,int l,int r,int x,int y)
{
o=++sz;
mul[o]=1ll*mul[lst]*y%mo;
ls[o]=ls[lst];rs[o]=rs[lst];
if (l==r) return;
int mid=l+r>>;
if (x<=mid) ins(ls[o],ls[lst],l,mid,x,y);
else ins(rs[o],rs[lst],mid+,r,x,y);
}
int query(int o,int l,int r,int x,int y)
{
if (l>=x&&r<=y) return mul[o];
int mid=l+r>>,re=;
if (x<=mid) re=1ll*re*query(ls[o],l,mid,x,y)%mo;
if (y>mid) re=1ll*re*query(rs[o],mid+,r,x,y)%mo;
return re;
}
int b[N];
int main()
{
freopen("half.in","r",stdin);
freopen("half.out","w",stdout);
pre();
int k=read();n=read();
for (int i=;i<=n;i++) a[i]=read(),b[i]=i;
for (int i=;i<n;i++)
{
int u=read(),v=read();
add(u,v);add(v,u);
}
dfs(,);
mul[]=;
sort(b+,b++n,cmp);
set<int>::iterator it1,it2,it3;
for (int i=;i<=n;i++)
{
int u=b[i],d=dep[u],tmp=a[u];
rt[d]=rt[dep[b[i-]]];
while (tmp>)
{
int t=mn[tmp],it=qpow(t,mo-),z=;
while (tmp%t==)
{
tmp/=t;
z*=t;
int y=get(z);
s[y].insert(st[u]);
it2=s[y].lower_bound(st[u]);
it1=it2;
if (it1!=s[y].begin()) --it1;
it3=it2;
++it3;
ins(rt[d],rt[d],,n,st[u],t);
int u1=,u2=;
if (it2!=s[y].begin())
{
u1=tid[*it1];int L=lca(u1,u);
ins(rt[d],rt[d],,n,st[L],it);
}
if (it3!=s[y].end())
{
u2=tid[*it3];int L=lca(u2,u);
ins(rt[d],rt[d],,n,st[L],it);
}
if (u1&&u2)
{
int L=lca(u1,u2);
ins(rt[d],rt[d],,n,st[L],t);
}
}
}
}
for (int i=dep[b[n]]+;i<=n;i++) rt[i]=rt[i-];
int q=read(),ans=;
while (q--)
{
int u=read()^(k*ans),d=min(n,dep[u]+read()^(k*ans));
printf("%d\n",query(rt[d],,n,st[u],ed[u]));
}
return ;
}
[jzoj 6086] [GDOI2019模拟2019.3.26] 动态半平面交 解题报告 (set+线段树)的更多相关文章
- [jzoj 6092] [GDOI2019模拟2019.3.30] 附耳而至 解题报告 (平面图转对偶图+最小割)
题目链接: https://jzoj.net/senior/#main/show/6092 题目: 知识点--平面图转对偶图 在求最小割的时候,我们可以把平面图转为对偶图,用最短路来求最小割,这样会比 ...
- [jzoj 4528] [GDOI2019模拟2019.3.26] 要换换名字 (最大权闭合子图)
题目链接: https://jzoj.net/senior/#contest/show/2683/0 题目: 题解: 不妨枚举一个点,让两颗树都以这个点为根,求联通块要么点数为$0$,要么包括根(即联 ...
- [jzoj 6087] [GDOI2019模拟2019.3.26] 获取名额 解题报告 (泰勒展开+RMQ+精度)
题目链接: https://jzoj.net/senior/#main/show/6087 题目: 题解: 只需要统计$\prod_{i=l}^r (1-\frac{a_i}{x})$ =$exp(\ ...
- [JZOJ6075]【GDOI2019模拟2019.3.20】桥【DP】【线段树】
Description N,M<=100000,S,T<=1e9 Solution 首先可以感受一下,我们把街道看成一行,那么只有给出的2n个点的纵坐标是有用的,于是我们可以将坐标离散化至 ...
- [jzoj 6093] [GDOI2019模拟2019.3.30] 星辰大海 解题报告 (半平面交)
题目链接: https://jzoj.net/senior/#contest/show/2686/2 题目: 题解: 说实话这题调试差不多花了我十小时,不过总算借着这道题大概了解了计算几何的基础知识 ...
- [jzoj 6101] [GDOI2019模拟2019.4.2] Path 解题报告 (期望)
题目链接: https://jzoj.net/senior/#main/show/6101 题目: 题解: 设$f_i$表示从节点$i$到节点$n$的期望时间,$f_n=0$ 最优策略就是如果从$i, ...
- [jzoj 6080] [GDOI2019模拟2019.3.23] IOer 解题报告 (数学构造)
题目链接: https://jzoj.net/senior/#main/show/6080 题目: 题意: 给定$n,m,u,v$ 设$t_i=ui+v$ 求$\sum_{k_1+k_2+...+k_ ...
- [jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)
题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 注: ...
- [JZOJ 5908] [NOIP2018模拟10.16] 开荒(kaihuang)解题报告 (树状数组+思维)
题目链接: https://jzoj.net/senior/#contest/show/2529/1 题目: 题目背景:尊者神高达作为一个萌新,在升级路上死亡无数次后被一只大黄叽带回了师门.他加入师门 ...
随机推荐
- malloc和new出来的地址都是虚拟地址 你就说内存管理单元怎么可能让你直接操作硬件内存地址!
malloc的实现与物理内存自然是无关的,内核为每个进程维护一张页表,页表存储进程空间内每页的虚拟地址,页表项中有的虚拟内存页对应着某个物理内存页面,也有的虚拟内存页没有实际的物理页面对应.无论mal ...
- Redis学习笔记(七) 基本命令:Set操作
原文链接:http://doc.redisfans.com/set/index.html 虽然set和list很相似但还是有一些差别的,如set中的顺序没有先后之分,所以不像list一样可以在首尾增删 ...
- Redis学习笔记(四) 基本命令:String操作
原文链接:http://doc.redisfans.com/string/index.html append key value 将指定的值追加到key末尾,若key不存在,则创建并赋值,返回追加后的 ...
- VB.net 捕获项目全局异常
在项目中添加如下代码:新建窗口来显示异常信息. Namespace My '全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 '添加后还需要一个From用来显示 ...
- 转:Hibernate使用SQLQuery
原文:http://hi.baidu.com/luo_qing_long/blog/item/783a15eceb75abdd2f2e21b0.html 对原生SQL查询执行的控制是通过SQLQuer ...
- CentOS 7.1 下载,安装,配置
CentOS(全称 Community Enterprise Operating System)是 RHEL 源代码再编译的产物. 2014年初,CentOS 宣布加入 Red Hat. CentOS ...
- jquery.zclip.js复制到剪切板
参考http://www.cnblogs.com/PeunZhang/p/3324727.html 需要引用jquery.zclip $("#id").zclip({ path: ...
- elasticsearch集群添加节点
最简配置文件: cluster.name: your_cluster_name node.name: your_ip network.host: 0.0.0.0 http.port: your_p ...
- 搭建自己的koa+mysql后台模板
1.在vscode里面打开一个文件夹 2.cnpm init 3.导入必要的依赖项 "dependencies": { "koa": "^2.7.0& ...
- 路飞学城Python-Day36
24-记录的增删改查 1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); 语法二: INSERT I ...