CF 题目集锦 PART 7 #264 div 2 E_html/css_WEB-ITnose

php中文网
发布: 2016-06-24 11:57:54
原创
1407人浏览过

【原题】

E. Caisa and Tree

time limit per test

10 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Caisa is now at home and his son has a simple task for him.

Given a rooted tree with n vertices, numbered from 1 to n (vertex 1 is the root). Each vertex of the tree has a value. You should answer q queries. Each query is one of the following:

  • Format of the query is "1 v". Let's write out the sequence of vertices along the path from the root to vertex v: u1,?u2,?...,?uk (u1?=?1; uk?=?v). You need to output such a vertex ui that gcd(value of ui,?value of v)?>?1 and i?
  • Format of the query is "2 v w". You must change the value of vertex v to w.
  • You are given all the queries, help Caisa to solve the problem.

    立即学习前端免费学习笔记(深入)”;

    Input

    The first line contains two space-separated integers n, q (1?≤?n,?q?≤?105).

    The second line contains n integers a1,?a2,?...,?an (1?≤?ai?≤?2·106), where ai represent the value of node i.

    Each of the next n?-?1 lines contains two integers xi and yi (1?≤?xi,?yi?≤?n; xi?≠?yi), denoting the edge of the tree between vertices xi and yi.

    Each of the next q lines contains a query in the format that is given above. For each query the following inequalities hold: 1?≤?v?≤?n and 1?≤?w?≤?2·106. Note that: there are no more than 50 queries that changes the value of a vertex.

    Output

    For each query of the first type output the result of the query.

    集简云
    集简云

    软件集成平台,快速建立企业自动化与智能化

    集简云 22
    查看详情 集简云

    Sample test(s)

    input

    4 610 8 4 31 22 33 41 11 21 31 42 1 91 4
    登录后复制

    output

    -112-11
    登录后复制

    Note

    gcd(x,?y) is greatest common divisor of two integers x and y.


    【分析】这道题是做现场赛的。本来能A的,但是太紧张了=而且也不会用vector,边表搞的麻烦死了。

    开始看到修改操作才50次、时间又松,真是爽!估计每次可以暴力重构这颗树,然后对于每个质因子记录最优值。

    首先每次不能sqrt的效率枚举一个数的因子,我们可以预处理出每个数的所有质因子。(其实有更省空间的)

    剩下来要解决的问题是:因为我是用dfs的,怎么把某个子树的信息在搜完后再去掉?(以免影响其他子树)HHD表示用vector一点也不虚。其实应该也可以用边表类似的思路,但是麻烦= =

    【代码】

    #include<cstdio>#include<algorithm>#include<cstring>#include<vector>#define N 100005#define S 2000005#define push push_back#define pop pop_backusing namespace std;vector<int>fac[S],f[S];int data[N],ans[N],end[N],pf[S],deep[N];int C,cnt,n,Q,i,x,y,opt;struct arr{int go,next;}a[N*2];inline void add(int u,int v){a[++cnt].go=v;a[cnt].next=end[u];end[u]=cnt;}inline void init(){  int H=2000000;  for (int i=2;i<=H;i++)    if (!pf[i])    {      for (int j=i;j<=H;j+=i)        fac[j].push(i),pf[j]=1;    }}void dfs(int k,int fa){  int P=data[k];  for (int i=0;i<fac[P].size();i++)  {    int go=fac[P][i],temp=f[go].size();    if (temp&&deep[f[go][temp-1]]>deep[ans[k]]) ans[k]=f[go][temp-1];    f[go].push(k);  }  for (int i=end[k];i;i=a[i].next)    if (a[i].go!=fa)      dfs(a[i].go,k);  for (int i=0;i<fac[P].size();i++)    f[fac[P][i]].pop();}inline void get_deep(int k,int fa){  for (int i=end[k];i;i=a[i].next)    if (a[i].go!=fa) deep[a[i].go]=deep[k]+1,get_deep(a[i].go,k);}int main(){  scanf("%d%d",&n,&Q);  for (i=1;i<=n;i++)    scanf("%d",&data[i]);  for (i=1;i<n;i++)    scanf("%d%d",&x,&y),add(x,y),add(y,x);  init();deep[0]=-1;get_deep(1,0);  memset(ans,0,sizeof(ans));dfs(1,0);  while (Q--)  {    scanf("%d%d",&opt,&x);    if (opt==1) {printf("%d\n",ans[x]?ans[x]:-1);continue;}    memset(ans,0,sizeof(ans));    scanf("%d",&y);data[x]=y;dfs(1,0);  }  return 0;}
    登录后复制

    HTML速学教程(入门课程)
    HTML速学教程(入门课程)

    HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

    下载
    来源:php中文网
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    最新问题
    开源免费商场系统广告
    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送
    PHP中文网APP
    随时随地碎片化学习

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号