洛谷 P2441 角色属性树

题目描述

绪萌同人社是一个有趣的组织,该组织结构是一个树形结构。有一个社长,直接下属一些副社长。每个副社长又直接下属一些部长……。

每个成员都有一个萌点的属性,萌点属性是由一些质数的萌元素乘积构成(例如,猫耳的值是2,弱气的值是3,黄毛的值是5,病娇的值是7,双马尾的值是11等等)

举个例子,正妹是双份的猫耳,而且有一份弱气,她的属性值为2*2*3=12。

现在组员关心一个问题,希望知道离自己最近且有相同萌元素上司是谁,例如,属性值为2、4、6、45这样的属性值都算是和正妹有相同的属性。

然而,组员可能会随时变化自己的属性。啊。。感觉好麻烦啊。。

输入输出格式

输入格式:

第一行,n,k 表示成员数与询问的次数

第二行,n个数,分别是1~n号成员的属性值

接下来n-1行,x_i,y_i 表示x_i是y_i的上司。

接下来来k行,有两种情况

1 u_i 询问离u_i成员最近且有相同萌元素上司。

2 u_i a 更改u_i的属性值为a

输出格式:

对于每个1类型的询问,输出符合要求的编号。如果没有符合要求的编号,输出-1。

输入输出样例

输入样例:
4 6
10 8 4 3
1 2
2 3
3 4
1 1
1 2
 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 #define inf 0x3f3f3f3f
 5 #define M 200200
 6 int next[M],pre[M],last[M],n,query,meng[M],tot=0,father[M];
 7 bool vis[M];
 8 int gcd (int a,int b){return b==0?a:gcd(b,a%b);}//1行代码gcd
 9 void addedge (int u,int v)
10 {
11     tot++;
12     next[tot]=v;//next数组存的是点
13     pre[tot]=last[u];//pre和last存的是边的编号
14     last[u]=tot;
15 }
16 void dfs (int x)
17 {
18     for (int i=last[x];i;i=pre[i])
19 father[next[i]]=x,dfs(next[i]);//每个点找上司
20 //因为树是按顺序建的,所以直接无脑搜索就行了,不用vis,因为不可能走重
21 }
22 int main()
23 
24 {
25     //freopen("de.txt","r",stdin);
26     scanf("%d%d",&n,&query);
27     memset(vis,false,sizeof vis);
28     for (int i=1;i<=n;++i)
29     scanf("%d",&meng[i]);
30     for (int i=1;i<n;++i)
31     {
32         int x,y;
33         scanf("%d%d",&x,&y);
34         addedge(x,y);
35     }
36     dfs(1);
37     for (int i=0;i<query;++i)
38     {
39         int x,y,z,ans=-1;
40         scanf("%d%d",&x,&y);
41         if (x==2)
42         scanf("%d",&z),meng[y]=z;
43         else
44         {
45             for (int j=father[y];j;j=father[j])
46             {
47                 int a=meng[y],b=meng[j];
48                 if (a>b) swap(a,b);
49                 if (gcd(a,b)!=1)
50                 {
51                     ans=j;
52                     break;
53                 }
54             }
55             printf("%d\n",ans);
56         }
57     }
58     return 0;
59 }

 

1 3
1 4
2 1 9
1 4
输出样例:
-1
1
2
-1
1

这道题看评论很水...反正就是练一下树状的结构。顺便学会了1行gcd。
代码如下:

转载于:https://www.cnblogs.com/agenthtb/p/5866530.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
洛谷P1168题目是关于中位数线段解法的问题。中位数线段解法可以通过维护两个堆来实现。一个是大根堆,一个是小根堆。每次插入元素时,根据一定的规则来维护这两个堆,使得大根堆的个数在一定情况下比小根堆多1或者相等。大根堆的最后一个元素即为中位数。具体的规则如下: 1. 如果大根堆和小根堆的个数相等,下一次插入的元素一定插入到大根堆。此时判断小根堆的堆顶是否大于当前元素x,如果是,则将小根堆的堆顶元素插入到大根堆,然后将x压入小根堆;否则直接将x压入大根堆。 2. 如果大根堆和小根堆的个数不相等,按照类似的规则进行操作。 通过以上规则,可以实现在每次插入元素时,维护两个堆的平衡,并且保证大根堆的最后一个元素即为中位数。 这种解法的时间复杂度为O(logN),其中N为序列的长度。 #### 引用[.reference_title] - *1* *2* [中位数(洛谷p1168)(堆/状数组+二分/线段+二分)](https://blog.csdn.net/qq_45604735/article/details/114382762)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [洛谷 P1168 中位数(权值线段,离散化)](https://blog.csdn.net/qq_38232157/article/details/127594230)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值