【DFS序+树状数组】BNUOJ 52733 Random Numbers

http://acm.bnu.edu.cn/v3/problem_show.php?pid=52733

【题意】

  • 给定一棵树,这棵树每个点都有一个点权,标号从0开始,0是根结点
  • 修改操作:
    SEED 1 13

    把结点1的点权乘上13

  • 查询操作:
    RAND 1

    查询结点1为根的子树所有结点权的总乘积,以及这个总乘积有多少个因子

  • 题目保证结果的质因子最大为13

【思路】

  • 质因子最大为13,那么我们可以枚举质因子2 3 5 7 11 13,共6个
  • 只要我们知道子树乘积这六个质因子的个数,我们就能算出子树的总乘积为2^p1*3^p2*5^p3*7^p4*11^p5*13^p6,而且这个数共有(p1+1)*(p2+1)*(p3+1)*(p4+1)*(p5+1)*(p6+1)个因子
  • 我们可以为每个质因子维护一个树状数组,统计因子个数和

【AC】

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4
  5 const int maxn=1e5+2;;
  6 const int maxm=2*maxn;
  7 const ll mod=1e9+7;
  8 int n;
  9 struct edge
 10 {
 11     int to;
 12     int nxt;
 13 }e[maxm];
 14 int head[maxn];
 15 int tot;
 16 int l[maxn],r[maxn];
 17 int cid;
 18 ll tree[7][maxm];
 19 int p[7];
 20 ll fpow(ll x,ll n)
 21 {
 22     ll res=1;
 23     while(n)
 24     {
 25         if(n&1) res=(res*x)%mod;
 26         x=(x*x)%mod;
 27         n>>=1;
 28     }
 29     return res;
 30 }
 31 int lowbit(int x)
 32 {
 33     return x&(-x);
 34 }
 35
 36 void add(int i,int k,int cnt)
 37 {
 38     while(k<=cid)
 39     {
 40         tree[i][k]+=cnt;
 41         k+=lowbit(k);
 42     }
 43 }
 44 ll query(int i,int k)
 45 {
 46     int res=1;
 47     while(k)
 48     {
 49         res+=tree[i][k];
 50         k-=lowbit(k);
 51     }
 52     return res;
 53 }
 54 void init()
 55 {
 56     memset(head,-1,sizeof(head));
 57     tot=0;
 58     cid=0;
 59     memset(tree,0,sizeof(tree));
 60 }
 61 void addedge(int u,int v)
 62 {
 63     e[tot].to=v;
 64     e[tot].nxt=head[u];
 65     head[u]=tot++;
 66 }
 67 void dfs(int u,int pa)
 68 {
 69     l[u]=++cid;
 70     for(int i=head[u];i!=-1;i=e[i].nxt)
 71     {
 72         int v=e[i].to;
 73         if(v==pa) continue;
 74         dfs(v,u);
 75     }
 76     r[u]=++cid;
 77 }
 78
 79 void update(int i,ll x)
 80 {
 81     for(int j=1;j<=6;j++)
 82     {
 83         int cnt=0;
 84         while(x%p[j]==0)
 85         {
 86             cnt++;
 87             x/=p[j];
 88         }
 89         add(j,l[i],cnt);
 90     }
 91 }
 92 int main()
 93 {
 94     p[1]=2,p[2]=3,p[3]=5,p[4]=7,p[5]=11,p[6]=13;
 95     while(~scanf("%d",&n))
 96     {
 97         init();
 98         int u,v;
 99         for(int i=1;i<=n-1;i++)
100         {
101             scanf("%d%d",&u,&v);
102             u++;v++;
103             addedge(u,v);
104             addedge(v,u);
105         }
106         dfs(1,-1);
107         for(int i=1;i<=n;i++)
108         {
109             ll x;
110             scanf("%I64d",&x);
111             update(i,x);
112         }
113         int q;
114         scanf("%d",&q);
115         char str[10];
116         while(q--)
117         {
118             scanf("%s",str);
119             if(str[0]==‘R‘)
120             {
121                 int x;
122                 scanf("%d",&x);
123                 x++;
124                 ll cnt=1;
125                 ll ans=1;
126                 for(int i=1;i<=6;i++)
127                 {
128                     int tmp=query(i,r[x])-query(i,l[x]-1);
129                     cnt=cnt*(ll)(tmp+1)%mod;
130                     ans=(ans*fpow(p[i],tmp))%mod;
131                 }
132                 printf("%I64d %d\n",ans,cnt);
133             }
134             else
135             {
136                 int k;
137                 ll x;
138                 scanf("%d%I64d",&k,&x);
139                 k++;
140                 update(k,x);
141             }
142
143         }
144     }
145     return 0;
146 }

树状数组

时间: 2024-10-31 10:31:12

【DFS序+树状数组】BNUOJ 52733 Random Numbers的相关文章

【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高速光缆组成.每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信子网与其他部门进行通信联络.该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路径以进行通信. 高速光缆的数据传输速度非常快,以至于利用光缆传输的延迟时间可以忽略.但是由于路由器老化,在这些

BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )

一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状数组维护, DFS到的查询点就回答询问.时间复杂度O(|ACAM|+QlogQ) ------------------------------------------------------------------------------------------- #include<cstdio>

【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)

第一种做法(时间太感人): 这题我真的逗了,调了一下午,疯狂造数据,始终找不到错. 后来发现自己sb了,更新那里没有打id,直接套上u了.我.... 调了一下午啊!一下午的时光啊!本来说好中午A掉去学习第二种做法,噗 好吧,现在第一种做法是hld+seg+bst+二分,常数巨大,log^4级别,目前只会这种. 树剖后仍然用线段树维护dfs序区间,然后在每个区间建一颗平衡树,我用treap,(这题找最大啊,,,囧,并且要注意,这里的rank是比他大的数量,so,我们在二分时判断要判断一个范围,即要

[POI2007][BZOJ1103] 大都市meg|dfs序|树状数组

1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1350  Solved: 697[Submit][Status][Discuss] Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双向的土路.从每个村庄都恰好有一条路径到达

Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+树状数组

C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/problem/C Description Iahub likes trees very much. Recently he discovered an interesting tree named propagating tree. The tree consists of n nodes numb

【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询

题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作,每次为一下三种之一: RELEASE x:对x执行一次感染: RECENTER x:把根节点改为x,并对原来的根节点执行一次感染: REQUEST x:询问x子树中所有节点感染代价的平均值. 输入 输入的第一行包含两个整数n和m,分别代表局域网中计算机的数量,以及操作和询问的总数.接下来n-1行,

HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形dp, 对于每条链u,v,w,我们只在lca(u,v)的顶点上处理它 让dp[i]表示以i为根的指数的最大值,sum[i]表示dp[vi]的和(vi为i的儿子们) 则i点有两种决策,一种是不选以i为lca的链,则dp[i]=sum[i]. 另一种是选一条以i为lca的链,那么有转移方程:dp[i]=

【bzoj2819】Nim DFS序+树状数组+倍增LCA

题目描述 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略的.于是vfleaking决定写一个玩Nim游戏的平台来坑玩家.为了设计漂亮一点的初始局面,vfleaking用以下方式来找灵感:拿出很多石子,把它们聚成一堆一堆的,对每一堆编号1,2,3,4,...n,在堆与堆间连边,没有自环与重边,从任意堆到任意堆都只有唯一一条路径可到达.然后他不停地进行如下操

【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组

E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard input output:standard output The best programmers of Embezzland compete to develop a part of the project called "e-Government" — the system of automa