洛谷 P3224 [HNOI2012]永无乡

(splay_tree_tag没有比rb_tree_tag快)

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<ext/pb_ds/assoc_container.hpp>
 4 #include<ext/pb_ds/tree_policy.hpp>
 5 using namespace std;
 6 using namespace __gnu_pbds;
 7 typedef std::pair<int,int> P;
 8 typedef tree<P,null_type,less<P>,rb_tree_tag,tree_order_statistics_node_update> S;
 9 S dat[100100];
10 int fa[100100],n,m;
11 char s[10];
12 int find(int x)
13 {
14     return fa[x]==x ? x : fa[x]=find(fa[x]);
15 }
16 int main()
17 {
18     int i,t,ta,tb,a,b,q;
19     S::iterator it;
20     scanf("%d%d",&n,&m);
21     for(i=1;i<=n;i++)    fa[i]=i;
22     for(i=1;i<=n;i++)
23     {
24         scanf("%d",&t);
25         dat[i].insert(P(t,i));
26     }
27     for(i=1;i<=m;i++)
28     {
29         scanf("%d%d",&a,&b);
30         ta=find(a);tb=find(b);
31         if(ta==tb)    continue;
32         fa[ta]=tb;
33         if(dat[ta].size()>dat[tb].size())    swap(dat[ta],dat[tb]);
34         for(it=dat[ta].begin();it!=dat[ta].end();++it)    dat[tb].insert(*it);
35     }
36     scanf("%d",&q);
37     while(q--)
38     {
39         scanf("%s%d%d",s,&a,&b);
40         if(s[0]==‘Q‘)
41         {
42             ta=find(a);
43             if(dat[ta].size()<b)    printf("-1\n");
44             else    printf("%d\n",dat[ta].find_by_order(b-1)->second);
45         }
46         else if(s[0]==‘B‘)
47         {
48             ta=find(a);tb=find(b);
49             if(ta==tb)    continue;
50             fa[ta]=tb;
51             if(dat[ta].size()>dat[tb].size())    swap(dat[ta],dat[tb]);
52             for(it=dat[ta].begin();it!=dat[ta].end();++it)    dat[tb].insert(*it);
53         }
54     }
55     return 0;
56 }

原文地址:https://www.cnblogs.com/hehe54321/p/8855024.html

时间: 2024-11-02 08:14:24

洛谷 P3224 [HNOI2012]永无乡的相关文章

bzoj2733: [HNOI2012]永无乡(splay)

2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3778  Solved: 2020 Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛.如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的.现在有两

HNOI2012永无乡

[HNOI2012]永无乡 Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛.如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的.现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥.Q x k 表示询问当前与岛 x连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x

BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)

不难...treap + 启发式合并 + 并查集 搞搞就行了 ---------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep(i, n) for(int i = 0; i &l

Bzoj 2733: [HNOI2012]永无乡 数组Splay+启发式合并

2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3955  Solved: 2112[Submit][Status][Discuss] Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛.如果从岛 a 出发经过若干座(含 0 座)桥可以到达

bzoj 2733: [HNOI2012]永无乡 离线+主席树

2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1167  Solved: 607[Submit][Status] Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛.如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a

[BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)

Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛.如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的.现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥.Q x k 表示询问当前与岛 x连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k

【bzoj2733】[HNOI2012]永无乡 线段树合并

Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛.如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的.现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥.Q x k 表示询问当前与岛 x连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k

[HNOI2012]永无乡

Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛.如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的.现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥.Q x k 表示询问当前与岛 x连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k

bzoj 2733: [HNOI2012]永无乡

23333用并查集维护联通,然后网上搞splay就行啦. %高端splay写法(2333写在struct里了,是不是叫构造函数什么的??) 1 #include<bits/stdc++.h> 2 #define N 100005 3 #define LL long long 4 #define ls tr[x][0] 5 #define rs tr[x][1] 6 using namespace std; 7 inline int ra() 8 { 9 int x=0,f=1; char ch