[HDU5799]This world need more Zhu
题面戳我
题意:
给定一棵树,m次操作,每次询问某一棵子树中,或者是某一条路径上,出现次数为a的所有数字之和与出现次数为b的所有数字之和的gcd
原题表述:the \(\gcd\) of the sum of numbers that appears \(a\) times and the sum of numbers that appears \(b\) times in subtree \(u\) or on the path from \(u\) to \(v\) .
sol
你把题目看懂了就会发现这是一道莫队傻逼题
首先输入的数据需要离散化
把子树的询问和路径的询问分开处理,然后子树询问可以直接转化为序列莫队。
路径询问就树上莫队即可。
code
记得多组数据初始化
树链剖分中只有son数组要初始化
莫队需要用到的所有数组都要初始化
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define ll long long
const int N = 100005;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
struct edge{int to,next;}a[N<<1];
int T,n,len,block,BL,m,col[N],o[N],head[N],cnt;
int fa[N],dep[N],sz[N],son[N],top[N],dfn[N],low[N],ref[N];
int ccnt,bl[N],s[N],tp;
int cnt1,cnt2,vis[N],tot[N];ll sum[N],ans[N];
struct query1{
int l,r,a,b,id;
bool operator < (const query1 &b) const
{
if (l/BL==b.l/BL) return r<b.r;
return l/BL<b.l/BL;
}
}q1[N];
struct query2{
int u,v,a,b,id;
bool operator < (const query2 &b) const
{
if (bl[u]==bl[b.u]) return bl[v]<bl[b.v];
return bl[u]<bl[b.u];
}
}q2[N];
void dfs1(int u,int f)
{
fa[u]=f;dep[u]=dep[f]+1;sz[u]=1;
for (int e=head[u];e;e=a[e].next)
{
int v=a[e].to;if (v==f) continue;
dfs1(v,u);
sz[u]+=sz[v];if (sz[v]>sz[son[u]]) son[u]=v;
}
}
void dfs2(int u,int up)
{
top[u]=up;dfn[u]=++cnt;ref[cnt]=u;int ttp=tp;
if (son[u]) dfs2(son[u],up);
if (tp-ttp>=block) {++ccnt;while (tp>ttp) bl[s[tp--]]=ccnt;}
for (int e=head[u];e;e=a[e].next)
{
int v=a[e].to;if (v==fa[u]||v==son[u]) continue;
dfs2(v,v);
if (tp-ttp>=block) {++ccnt;while (tp>ttp) bl[s[tp--]]=ccnt;}
}
low[u]=cnt;s[++tp]=u;
}
int lca(int u,int v)
{
while (top[u]^top[v])
{
if (dep[top[u]]<dep[top[v]]) swap(u,v);
u=fa[top[u]];
}
return dep[u]<dep[v]?u:v;
}
void update(int x)
{
if (!vis[x])
{
vis[x]=1;
sum[tot[col[x]]]-=o[col[x]];
tot[col[x]]++;
sum[tot[col[x]]]+=o[col[x]];
}
else
{
vis[x]=0;
sum[tot[col[x]]]-=o[col[x]];
tot[col[x]]--;
sum[tot[col[x]]]+=o[col[x]];
}
}
void change(int u,int v)
{
while (u^v)
if (dep[u]>dep[v]) update(u),u=fa[u];
else update(v),v=fa[v];
}
ll Gcd(ll A,ll B){return B?Gcd(B,A%B):A;}
int main()
{
T=gi();
for (int zsy=1;zsy<=T;zsy++)
{
printf("Case #%d:\n",zsy);
n=gi();m=gi();block=pow(n,0.6);BL=pow(n,0.5);
for (int i=1;i<=n;i++) col[i]=o[i]=gi();
sort(o+1,o+n+1);len=unique(o+1,o+n+1)-o-1;
for (int i=1;i<=n;i++) col[i]=lower_bound(o+1,o+len+1,col[i])-o;
memset(head,0,sizeof(head));cnt=ccnt=0;
memset(son,0,sizeof(son));
for (int i=1,u,v;i<n;i++)
{
u=gi();v=gi();
a[++cnt]=(edge){v,head[u]};head[u]=cnt;
a[++cnt]=(edge){u,head[v]};head[v]=cnt;
}
dfs1(1,0);cnt=0;dfs2(1,1);
while (tp) bl[s[tp--]]=ccnt;
cnt1=cnt2=0;
for (int i=1,opt,u,v,A,B;i<=m;i++)
{
opt=gi();u=gi();v=gi();A=gi();B=gi();
if (dfn[u]>dfn[v]) swap(u,v);
if (opt==1) q1[++cnt1]=(query1){dfn[u],low[u],A,B,i};
else q2[++cnt2]=(query2){u,v,A,B,i};
}
sort(q1+1,q1+cnt1+1);sort(q2+1,q2+cnt2+1);
int L=1,R=0;
memset(tot,0,sizeof(tot));
memset(sum,0,sizeof(sum));
memset(vis,0,sizeof(vis));
for (int i=1;i<=cnt1;i++)
{
while (L>q1[i].l) L--,update(ref[L]);
while (R<q1[i].r) R++,update(ref[R]);
while (L<q1[i].l) update(ref[L]),L++;
while (R>q1[i].r) update(ref[R]),R--;
ans[q1[i].id]=Gcd(sum[q1[i].a],sum[q1[i].b]);
}
memset(tot,0,sizeof(tot));
memset(sum,0,sizeof(sum));
memset(vis,0,sizeof(vis));
change(q2[1].u,q2[1].v);
int gg=lca(q2[1].u,q2[1].v);
update(gg);ans[q2[1].id]=Gcd(sum[q2[1].a],sum[q2[1].b]);update(gg);
for (int i=2;i<=cnt2;i++)
{
change(q2[i].u,q2[i-1].u);change(q2[i].v,q2[i-1].v);
gg=lca(q2[i].u,q2[i].v);
update(gg);ans[q2[i].id]=Gcd(sum[q2[i].a],sum[q2[i].b]);update(gg);
}
for (int i=1;i<=m;i++) printf("%lld\n",ans[i]);
}
return 0;
}
[HDU5799]This world need more Zhu的更多相关文章
- 2016中国大学生程序设计竞赛 网络选拔赛 I This world need more Zhu
This world need more Zhu Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- hdu 5833 Zhu and 772002 高斯消元
Zhu and 772002 Problem Description Zhu and 772002 are both good at math. One day, Zhu wants to test ...
- hdu 5833 Zhu and 772002 ccpc网络赛 高斯消元法
传送门:hdu 5833 Zhu and 772002 题意:给n个数,每个数的素数因子不大于2000,让你从其中选则大于等于1个数相乘之后的结果为完全平方数 思路: 小于等于2000的素数一共也只有 ...
- HDU 5833 Zhu and 772002
HDU 5833 Zhu and 772002 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- CWNP宣布中国首位CWNE获得者——朱志立(Kevin Zhu)
CWNP宣布中国首位CWNE获得者——朱志立(Kevin Zhu) Kevin Zhu获得了全球CWNE认证无线网络专家的第134号,CWNE被公认为IT行业最难获取的10大认证之一. [ ...
- HDU 5833 Zhu and 772002 (高斯消元)
Zhu and 772002 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5833 Description Zhu and 772002 are b ...
- HDU 5840 This world need more Zhu 树链剖分+暴力
This world need more Zhu 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5840 Description As we all ...
- 魏汝盼医学博士 - Judy Zhu Wei, M.D., F.A.C.O.G.
魏汝盼医学博士 - Judy Zhu Wei, M.D., F.A.C.O.G. 医院(诊所)名称:CAPRI妇产科诊所 妇产科,华人医生,微创妇科手术专科医生,女医生,fountai ...
- HDU 5833 Zhu and 772002(高斯消元)
题意:给n个数,从n个数中抽取x(x>=1)个数,这x个数相乘为完全平方数,求一共有多少种取法,结果模1000000007. 思路:每个数可以拆成素数相乘的形式,例如: x1 2=2^1 * 3 ...
随机推荐
- JS声明对象时属性名加引号与不加引号的问题
般情况下属性名加引号和不加引号是都可以的,效果是一样的. var obj = { name : '你好', 'age' : 1, }; document.write( obj['name'] + '& ...
- EL表达式多条件判断方式
<td> <c:forEach items="${cityMap}" var="entry"> <hr> <input ...
- Vue站点的搭建之旅
背景 很久没写博客了,这次博客分享一下最近上班空闲时间做的两个业余Demo.分别是V电影App的移动端站点[一直很喜欢用这个APP可是他们没有出对应的mobile端,所以自己开发一个, ...
- DOM备忘录
nodeName和nodeValue属性 对于element节点而言,nodeName是标签名,nodeValue是null:而对于textNode节点而言,nodeName是#Text,nodeVl ...
- PHP系统左侧菜单栏的管理与实现
在日常的开发工作中,面对后台的日益增长的业务,以及后期业务的迭代开发,通常会选择添加菜单栏的形式来扩充业务功能,同样日益增长的后台菜单选项也为我们后期的维护,产生了一定的困难性.为此我总结出自己关于左 ...
- 让Python输出更漂亮
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end="": student_age = 18 print("学生的年龄为:", stude ...
- Pycharm常用的使用方法
PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提示.自动完成.单元测试.版本控制. ...
- springboot入门_data-jpa
今天学习了在springboot项目中访问数据库,做下笔记,以备后期查看. Spring Data JPA 是 Spring 基于 ORM 框架和JPA 规范 封装的一套应用框架,包含了增删改查等常用 ...
- 常见JedisConnectionException异常分析
异常内容:我看了很多人的博客,千篇一律都是说redis.conf文件的配置问题,发现并不能解决我的问题,今天写这个博客讲解一下我的解决办法: 遇到这个问题第一步:查看虚拟机的防火墙是否关闭,测试方法就 ...
- nyoj358 取石子(五) 斐波那契博弈
我写代码找的规律:如果这个n是斐波那契数,那么它是P态,如2,3,5,8..... 找规律的代码: #include <cstdio> #include <cmath> #in ...