CodeChef题面

  • Time limit
    210 ms

  • Code length Limit //内存限制也不说一下,真是的……
    50000 B

  • OS
    Linux

  • Language limit
    C, CPP14, JAVA, PYTH, PYTH 3.6, CS2, PAS fpc, PAS gpc, RUBY, PHP, GO, NODEJS, HASK, SCALA, D, PERL, FORT, WSPC, ADA, CAML, ICK, BF, ASM, CLPS, PRLG, ICON, SCM qobi, PIKE, ST, NICE, LUA, BASH, NEM, LISP sbcl, LISP clisp, SCM guile, JS, ERL, TCL, PERL6, TEXT, PYP3, CLOJ, FS

  • Author
    yellow_agony

  • Tester
    laycurse

  • Tags
    hard, heavy-light, july12, number-theory, yellow_agony

  • Editorial
    http://discuss.codechef.com/problems/DGCD

感想

树上动态gcd的第三题也好了。

  • [x] BZOJ 2257 [JSOI2009]瓶子和燃料
  • [x] BZOJ 5028 小z的加油站
  • [x] CodeChef DGCD Dynamic GCD

解题思路

树剖套线段树。线段树维护区间gcd见 小z的加油站 。

另外,注意这题所有点的下标从0开始。

源代码

#include<stdio.h>
#include<algorithm>const int MAXN=5e5+5;
int n,m;struct Edge{int nxt,to;
}e[MAXN<<1];
int cnt=1,head[MAXN];
inline void add(int u,int v)
{e[cnt]={head[u],v};head[u]=cnt++;e[cnt]={head[v],u};head[v]=cnt++;
}struct Tree{int w;int fa,dep,sz,wson;int top,id;
}t[MAXN];
void dfs1(int u,int fa)
{t[u].fa=fa;t[u].dep=t[fa].dep+1;t[u].sz=1;int maxn=0;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==fa) continue;dfs1(v,u);int temp=t[v].sz;t[u].sz+=temp;if(temp>maxn){t[u].wson=v;maxn=temp;}}
}
int id=1;
int a[MAXN];
void dfs2(int u,int top)
{t[u].top=top;t[u].id=id;a[id]=t[u].w;id++;if(t[u].sz==1) return;dfs2(t[u].wson,top);for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==t[u].fa||v==t[u].wson) continue;dfs2(v,v);}
}int gcd(int a,int b)
{if(a<0) a=-a;if(b<0) b=-b;return b?gcd(b,a%b):a;
}struct Segtree{int sum,g;//差分后的sum和gcd
}s[MAXN<<2];
inline void pushup(int x)
{s[x]={s[x<<1].sum+s[x<<1|1].sum,gcd(s[x<<1].g,s[x<<1|1].g)};
}
void build(int x,int l,int r)//建树前的差分交给主函数
{if(l==r){s[x]={a[l],a[l]};return;}int mid=l+r>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);pushup(x);
}
void update(int x,int l,int r,int pos,int k)//单点修改,增加k
{if(l==r){s[x].sum+=k;s[x].g+=k;return;}int mid=l+r>>1;if(pos<=mid) update(x<<1,l,mid,pos,k);else update(x<<1|1,mid+1,r,pos,k);pushup(x);
}
int quegcd(int x,int l,int r,int ql,int qr)
{if(ql<=l&&r<=qr)return s[x].g;int mid=l+r>>1;if(qr<=mid)return quegcd(x<<1,l,mid,ql,qr);else if(ql>mid) return quegcd(x<<1|1,mid+1,r,ql,qr);else return gcd(quegcd(x<<1,l,mid,ql,qr) , quegcd(x<<1|1,mid+1,r,ql,qr));
}
int quesum(int x,int l,int r,int ql,int qr)
{if(ql<=l&&r<=qr)return s[x].sum;int mid=l+r>>1;if(qr<=mid)return quesum(x<<1,l,mid,ql,qr);else if(ql>mid) return quesum(x<<1|1,mid+1,r,ql,qr);else return quesum(x<<1,l,mid,ql,qr) + quesum(x<<1|1,mid+1,r,ql,qr);
}int optf(int u,int v)
{int ans=0,l,r,temp;while(t[u].top!=t[v].top){if(t[t[u].top].dep<t[t[v].top].dep) std::swap(u,v);l=t[t[u].top].id;r=t[u].id;temp=quesum(1,1,n,1,l);if(l!=r) temp=gcd(quegcd(1,1,n,l+1,r),temp);if(!ans) ans=temp;else ans=gcd(temp,ans);u=t[t[u].top].fa;}if(t[u].id>t[v].id) std::swap(u,v);l=t[u].id,r=t[v].id;temp=quesum(1,1,n,1,l);if(l!=r) temp=gcd(quegcd(1,1,n,l+1,r),temp);if(!ans) ans=temp;else ans=gcd(temp,ans);return ans;
}void optc(int u,int v,int d)
{int l,r;while(t[u].top!=t[v].top){if(t[t[u].top].dep<t[t[v].top].dep) std::swap(u,v);l=t[t[u].top].id;r=t[u].id;update(1,1,n,l,d);if(r<n) update(1,1,n,r+1,-d);u=t[t[u].top].fa;}if(t[u].id>t[v].id) std::swap(u,v);l=t[u].id,r=t[v].id;update(1,1,n,l,d);if(r<n) update(1,1,n,r+1,-d);
}int main()
{freopen("test.in","r",stdin);scanf("%d",&n);for(int i=1,u,v;i<n;i++){scanf("%d%d",&u,&v);u++,v++;//下标全部增加1add(u,v);}for(int i=1;i<=n;i++)scanf("%d",&t[i].w);dfs1(1,0);dfs2(1,1);for(int i=n;i>1;i--) a[i]-=a[i-1];build(1,1,n);scanf("%d",&m);while(m--){char opt[3];int u,v,d;scanf("%s%d%d",opt,&u,&v);u++,v++;//下标全部增加1if(opt[0]=='F'){printf("%d\n",optf(u,v));}else{scanf("%d",&d);optc(u,v,d);}}return 0;
}

转载于:https://www.cnblogs.com/wawcac-blog/p/11321076.html

CodeChef DGCD Dynamic GCD相关推荐

  1. CodeChef - DGCD——树链剖分+差分

    [题目描述] You're given a tree on N vertices. Each vertex has a positive integer written on it, number o ...

  2. 暑假训练-义乌(7.8-7.15)

    暑假训练 模拟赛 图表 数据 7.8(lxl) 7.9(lxl) 7.10(lxl) 7.11(lxl) 7.12(wls) 7.13(wls) 7.14(wls) 7.15(lfds) 训练 数据结 ...

  3. GCD or LCM ---- 处理gcd和lcm同时出现的情况 1499D - The Number of Pairs

    题目链接 题目大意: 给你c,d,xc,d,xc,d,x求有多少对a,ba,ba,b,满足下面的式子? c×lcm(a,b)−d×gcd(a,b)=xc \times lcm(a,b)-d\times ...

  4. P4450-双亲数,P5221-Product,P6055-[RC-02]GCD【莫比乌斯反演,杜教筛】

    除了最后一题都比较简单就写一起了 P4450-双亲数 题目链接:https://www.luogu.com.cn/problem/P4450 题目大意 给出A,B,dA,B,dA,B,d求有多少对(a ...

  5. acm -(并查集、启发式合并、gcd、枚举因子)2020 China Collegiate Programming Contest Changchun Onsite K. Ragdoll

    传送门 本题考虑直接对每个iii求出所有满足ij=gcd(i,j)i^j=gcd(i,j)ij=gcd(i,j)的jjj,然后存在ggg数组中,对于查询修改操作维护一个并查集即可,合并的时候采用启发式 ...

  6. ideal如何创建dynamic web project

    步骤如下 ① file -> new -> project ② 选择 Java Enterprise -> next ③ create project from template - ...

  7. CF803C Maximal GCD

    洛谷 CF 分析 考虑从 \(k\) 个数的 \(gcd\) 入手. 设他们的 \(gcd\) 为 \(d\) .则有 \(d|n\) ,那么这 \(k\) 个数都除以 \(d\) 剩下的和即为 \( ...

  8. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

  9. 数论(一)——素数,GCD,LCM

    这是一个数论系列:) 一.素数 ×费马小定理 Theorem: 设 p 是一个素数,a 是一个整数且不是 p 的倍数,那么 很遗憾,费马小定理的逆定理是不成立的.对 a = 2,满足的非素数 n 是存 ...

最新文章

  1. 大数据WEB阶段Spring框架(二)简化配置的操作
  2. POJ 3233 Matrix Power Series (矩阵分块,递推)
  3. 如何查看某个employee被assign到了哪个sales organization上
  4. Oracle数据库基本概念理解(2)
  5. mysql字符串和数字的互相转换
  6. 导航菜单UI设计中的作用,优秀案例临摹起来!
  7. anaconda安装pytorch1.7.1和torchvision0.8.2的方法,亲测可用
  8. Openlayer通过wms请求geoserver加载慢
  9. wxPython多个窗口的基本结构
  10. mysql 10张表左关联查询_mysql left join 左连接查询关联n多张表
  11. mysql error1205 博客_MySQL的ERROR 1205错误分析
  12. 关于react hook视频讲解笔记
  13. MobaXterm连接虚拟机Ubuntu
  14. 数据分析为什么要学Excel
  15. java并发编程2-一起看Happens-Before 规则的前因后果
  16. 通过frp代理配合teamview使用局域网远程桌面
  17. 第十四届全国大学生电工数学建模竞赛A题-高比例风电电力系统储能运行及配置分析
  18. Excel文件加解密-POI
  19. 柔性电路板FPC 及 连接器 介绍
  20. 关于cmakelist随笔

热门文章

  1. 【渝粤教育】电大中专电子商务网站建设与维护 (23)作业 题库
  2. 怎样读一本书V5.0 ?(译)
  3. Drony 定向抓指定app的http,https包
  4. RemoteViews的作用和工作原理
  5. [mysql][ MySQL字符集设置及字符转换]
  6. 扩容U盘(缩水U盘)量产恢复方法——以CBM2099E主控为例
  7. apfs扩容_老Macbookpro扩容记
  8. 10_MOV、ADD、SUB、AND、OR、XOR、NOT指令
  9. 解密多旋翼发展进程【北京航空航天大学:全权】
  10. 【已解决】Failed to connect to github.com port 443 : Timed out