题目

描述 :

给出强制在线参数\(k\),树的大小\(n\),和每个点的点权\(a_i\);

有\(m\)个询问,每个询问是$u ,d $ 的形式;

表示询问\(u\)为根的子树中,和\(u\)的距离不超过\(d\)的点的点权\(lcm\);

范围:

$k \in { 0,1 }  , 1 \le n  , q \le 100000  ,  a_i \le 10000000 $;

题解

  • \(lcm\)不太好合并,首先一定是找到一种合理的方式去表示\(lcm\);

  • 考虑每个因子\(p\),如果存在将\(p,p^2,p^3,\cdots\)看成不同的颜色,每种颜色存在的贡献是将答案乘以\(p\);

  • 对于每一种颜色,我们只需要维护一个树链并即可;

  • 对每个颜色维护一个\(set\),用来维护插入一个点树链并的修改;

  • 对于非强制在线的情况,只需要将询问按\(dep[u]+d\)排序,线段树维护单点修改子树查询;

  • 强制在线将线段树可持久化就好了;

  • 时间复杂度和空间复杂度:\(O(n \ log \ n \ log \ a_i)\) ;

    #include<bits/stdc++.h>
    #define pb push_back
    #define mod 998244353
    #define ll long long
    using namespace std;
    const int N=100010,M=10000010;
    int n,m,k,a[N],b[N],o=1,hd[N],idx,st[N],ed[N],id[N],dep[N];
    int f[N<<1][20],lg[N<<1],pos[N<<1],bin[20],idx2;
    int sz,rt[N],mul[N*600],ls[N*600],rs[N*600];
    int vis[M],pr[M],pt,mn[M];
    struct Edge{int v,nt;}E[N<<1];
    set<int>s[N*30];
    set<int>::iterator I,I1,I2;
    map<int,int>hsh;
    char gc(){static char*p1,*p2,s[1000000];if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);return(p1==p2)?EOF:*p1++;
    }
    int rd(){int x=0;char c=gc();while(c<'0'||c>'9')c=gc();while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();return x;
    }
    void adde(int u,int v){E[o]=(Edge){v,hd[u]};hd[u]=o++;E[o]=(Edge){u,hd[v]};hd[v]=o++;
    }
    void pre(){mn[1]=1;for(int i=2;i<=1e7;++i){if(!vis[i])mn[pr[++pt]=i]=i;for(int j=1,t;j<=pt&&i*pr[j]<=1e7;++j){vis[t=i*pr[j]]=1;mn[t]=pr[j];if(i%pr[j]==0)break;}}
    }
    void dfs(int u,int fa){f[pos[u]=++idx2][0]=u;id[st[u]=++idx]=u;dep[u]=dep[fa]+1;for(int i=hd[u];i;i=E[i].nt){int v=E[i].v;if(v==fa)continue;dfs(v,u);f[++idx2][0]=u;}ed[u]=idx;
    }
    int Min(int x,int y){return dep[x]<dep[y]?x:y;}
    void init(){lg[0]=-1;for(int i=1;i<=idx2;++i)lg[i]=lg[i>>1]+1;for(int i=bin[0]=1;i<=18;++i)bin[i]=bin[i-1]<<1;for(int i=1;i<=18;++i)for(int j=1;j+bin[i]-1<=idx2;++j){f[j][i]=Min(f[j][i-1],f[j+bin[i-1]][i-1]);}
    }
    int lca(int u,int v){int x=pos[u],y=pos[v]; if(x>y)swap(x,y);int t=lg[y-x+1];return Min(f[x][t],f[y-bin[t]+1][t]);
    }
    bool cmp(const int&x,const int&y){return dep[x]<dep[y];}
    int get(int x){if(!hsh[x])return hsh[x]=++idx;return hsh[x];
    }
    int pw(int x,int y){int re=1;while(y){if(y&1)re=(ll)re*x%mod;y>>=1;x=(ll)x*x%mod;}return re;
    }
    void ins(int&k,int lst,int l,int r,int x,int y){mul[k=++sz]=(ll)mul[lst]*y%mod;ls[k]=ls[lst],rs[k]=rs[lst];if(l==r)return; int mid=l+r>>1;if(x<=mid)ins(ls[k],ls[lst],l,mid,x,y);else ins(rs[k],rs[lst],mid+1,r,x,y);
    }
    int query(int k,int l,int r,int x,int y){if(l==x&&r==y)return mul[k];int mid=l+r>>1;if(y<=mid)return query(ls[k],l,mid,x,y);else if(x>mid)return query(rs[k],mid+1,r,x,y);else return (ll)query(ls[k],l,mid,x,mid)*query(rs[k],mid+1,r,mid+1,y)%mod;
    }
    int main(){freopen("half.in","r",stdin);freopen("half.out","w",stdout);pre();k=rd();n=rd();for(int i=1;i<=n;++i)a[i]=rd(),b[i]=i;for(int i=1;i<n;++i)adde(rd(),rd());dfs(1,0);init();sort(b+1,b+n+1,cmp);mul[0]=1;idx=0;for(int i=1;i<=n;++i){int u=b[i],d=dep[u],tmp=a[u];rt[d]=rt[dep[b[i-1]]];while(tmp!=1){int x=mn[tmp],ix=pw(x,mod-2),y,z=1;while(tmp%x==0&&(tmp/=x)){y=get(z*=x);s[y].insert(st[u]);I=s[y].lower_bound(st[u]);I1=I;if(I!=s[y].begin())--I1;I2=I;++I2;ins(rt[d],rt[d],1,n,st[u],x);int u1=0,u2=0,t;if(I!=s[y].begin()){u1=id[*I1];t=lca(u1,u); ins(rt[d],rt[d],1,n,st[t],ix);}if(I2!=s[y].end()){u2=id[*I2];t=lca(u2,u); ins(rt[d],rt[d],1,n,st[t],ix);}if(u1&&u2){t=lca(u1,u2);ins(rt[d],rt[d],1,n,st[t],x);}}}}for(int i=dep[b[n]]+1;i<=n;++i)rt[i]=rt[i-1];m=rd();int ans=0;for(int i=1,u,d;i<=m;++i){u=rd()^(k*ans);d=min(n,dep[u]+rd()^(k*ans));ans=query(rt[d],1,n,st[u],ed[u]);printf("%d\n",ans);}return 0;
    }

转载于:https://www.cnblogs.com/Paul-Guderian/p/10602136.html

【纪中集训2019.3.26】动态半平面交相关推荐

  1. 【纪中集训2019.3.25】芬威克树

    题目 描述 ​ ​ 第一段代码正确第用\(k\)进制\(BIT\)维护了前缀和: ​ 第二段代码由于写错了\(line \ 4\),所以意义发生了改变: ​ 维护第二段代码执行\(ADD(x,v)\) ...

  2. 【纪中集训2019.3.12】Mas的仙人掌

    题意: ​ 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...

  3. 【纪中集训2019.3.20】铁路

    题意 描述 现在有一颗树形状的双向铁路,每条边的行驶时间是\(1\): 给出\(m\)条列车行驶的路径\(s_{i}\to t_{i}\),问列车相遇的对数(无序对): \(i和j\)号列车相遇当且仅 ...

  4. 【纪中集训2019.3.30】星辰大海

    题目 描述 ​ 有\(n\)个点\(p_1 ,p_2 , \cdots ,\,p_n\) : ​ 现在\(p_1\)不见了,可能的横纵坐标范围是\([-10^6,10^6]\): ​ 同时需要保证每三 ...

  5. 【纪中集训2019.3.15】恶熊咆哮

    题目 描述 有\(n\)只熊,初始时坐标为\((x_i,y_i)\): 这些熊会按照标号依次吼叫,当第\(i\)只熊吼叫,其他熊会移动: \((x_i,y_i)\)会移动到\((x_i \pm 1,y ...

  6. 2019寒假纪中集训总结学期总结(流水账)

    学期总结 这学期上了初三,学校的初.高中校区对调,我们的班主任也由一个生物老师换成了一个化学老师. 之前的班主任比较年轻,跟我们这群学生有这很好的感情,亦师亦友,陪伴我们度过了几乎没有中考压力的初一. ...

  7. [2021.8纪中集训Day14]

    文章目录 1312. 老曹的忧郁 题目 思路 代码 1313. 老曹骑士 题目 思路 代码 1314. 稳定的数字 题目 思路 代码 封锁阳光大学 题目 题目描述 输入格式 输出格式 输入输出样例 说 ...

  8. 纪中集训2020.01.13【NOIP普及组】模拟赛C组总结————My First Time Write Summary

    纪中集训2020.01.13[NOIP普及组]模拟赛C组总结 题目编号 标题 0 [NOIP普及组模拟]取值( numbers.pas/cpp) 1 [NOIP普及组模拟]数对(pairs.pas/c ...

  9. 纪中集训2020.01.16【NOIP普及组】模拟赛C组总结+【0.Matrix】分析

    纪中集训2020.01.16[NOIP普及组]模拟赛C组总结+[0.Matrix]分析 题目: 0.matrix 1.product 2.binary 3.value 巨佬估分:100+100+40+ ...

最新文章

  1. adb 输入很长的内容 (input text) 在模拟机输入框里面快速输入内容
  2. CNDO-INTGRL-SS-AINTGS-斯莱特轨道指数
  3. linux pro*c环境配置,打造ubuntu下精简版的oracle客户端及pro*c编译环境
  4. Cloud for Customer UI上点了checkbox后发送到后台的事件
  5. gson 入门_Google GSON入门
  6. SourceInsight 常用快捷键
  7. 央视消息 | 没考驾照的人可能要恭喜了!
  8. 魅族魅蓝max简单打开USB调试模式的经验
  9. ZooKeeper官方文档学习笔记04-ZooKeeper的Java实例
  10. UVA11988 Broken Keyboard (a.k.a. Beiju Text)【输入输出+水题】
  11. ijkplayer-旋转角度实现
  12. window对象小结
  13. 动态设置option标签默认选中的两种方法
  14. C++信息学奥赛一本通_2060
  15. DW_axi_dmac控制器(概述)
  16. 【火炉炼AI】机器学习031-KNN回归器模型的构建
  17. QT 屏幕旋转的两种方式
  18. Java极速入门系列:第一章Java概述、Java环境、IDEA开发工具
  19. Android王者荣耀模拟金牌,荣耀战区修改方法 轻松获得省级金牌银牌
  20. Unity MediaPlayer

热门文章

  1. SAP S/4HANA里的生产订单,标识其已经结束生产可以发货的字段
  2. 还在用SELECT COUNT统计数据库表的行数?Out了
  3. 2017年上半年全国高等学校安徽考区计算机水平考试,教务处关于2017年上半年全国高等学校(安徽考区)计算机水平考试报名的通知-教务处...
  4. android 构造xml,android 中生成xml文件
  5. 2017二级c语言成绩,2017全国计机等级考试二级C语言知识点超全整(打印版).docx
  6. 美团flutter_ggtalk 聊聊跨平台:后起之秀 Flutter
  7. java生成小图片_JAVA生成缩略小图片类
  8. python自己的模块_Python--构建发布自己的模块
  9. js打乱数组的顺序_如何用 js 实现一个类似微信红包的随机算法
  10. flutter打包的app有多大_Flutter原生混合开发