[loj519]数学上来先打表
建立操作树,即1和3操作时i-1向i连边,2操作中k向i连边,然后dfs一遍
那么当我们走到一个节点,就执行该操作(修改也是操作),退出后取消该操作即可
于是相当于要维护一个东西,支持:1.加边;2.删边;3.询问联通块的第k小
容易想到按秩合并并查集,考虑询问操作:用分块,维护每一个权值块的权值数量(要离散)
然后就可以确定答案所在权值块,再依次枚举里面的权值并判断是否在联通块内即可


1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define K 1000
5 #define bl(k) ((k-1)/K)
6 struct ji{
7 int nex,to;
8 }edge[N];
9 vector<int>v[N];
10 int E,n,m,p[N],a[N],x[N],y[N],b[N],head[N],sz[N],fa[N],ans[N],f[N][105];
11 bool cmp(int x,int y){
12 return a[x]<a[y];
13 }
14 void add(int x,int y){
15 edge[E].nex=head[x];
16 edge[E].to=y;
17 head[x]=E++;
18 }
19 int find(int k){
20 if (k==fa[k])return k;
21 return find(fa[k]);
22 }
23 int query(int k){
24 x[k]=find(x[k]);
25 for(int i=0;i<=bl(n);i++)
26 if (y[k]>f[x[k]][i])y[k]-=f[x[k]][i];
27 else
28 for(int j=i*K+1;j<=(i+1)*K;j++)
29 if ((find(b[j])==x[k])&&(--y[k]==0))return a[b[j]];
30 return -1;
31 }
32 void add(int k){
33 x[k]=find(x[k]);
34 y[k]=find(y[k]);
35 if (x[k]==y[k])return;
36 if (sz[x[k]]>sz[y[k]])swap(x[k],y[k]);
37 fa[x[k]]=y[k];
38 sz[y[k]]+=sz[x[k]];
39 for(int i=0;i<=bl(n);i++)f[y[k]][i]+=f[x[k]][i];
40 }
41 void del(int k){
42 if (x[k]==y[k])return;
43 fa[x[k]]=x[k];
44 sz[y[k]]-=sz[x[k]];
45 for(int i=0;i<=bl(n);i++)f[y[k]][i]-=f[x[k]][i];
46 }
47 void dfs(int k){
48 if (p[k]==1)add(k);
49 if (p[k]==3)ans[k]=query(k);
50 for(int i=head[k];i!=-1;i=edge[i].nex)dfs(edge[i].to);
51 if (p[k]==1)del(k);
52 }
53 int main(){
54 scanf("%d%d",&n,&m);
55 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
56 memset(head,-1,sizeof(head));
57 for(int i=1;i<=n;i++)fa[i]=b[i]=i;
58 sort(b+1,b+n+1,cmp);
59 for(int i=1;i<=n;i++)sz[i]=f[b[i]][bl(i)]=1;
60 for(int i=1;i<=m;i++){
61 scanf("%d%d",&p[i],&x[i]);
62 if (p[i]==2)add(x[i],i);
63 else{
64 scanf("%d",&y[i]);
65 add(i-1,i);
66 }
67 }
68 dfs(0);
69 for(int i=1;i<=m;i++)
70 if (p[i]==3)printf("%d\n",ans[i]);
71 }
[loj519]数学上来先打表的更多相关文章
- 汕头市队赛 SRM10 T3 数学上来先打表
数学上来先打表 SRM 10 描述 给出 n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案:1.每条边连接两个不同的点,每两个点之间至多有一条边2.不存在三个点a,b,c使三个点间两两 ...
- 【STSRM10】数学上来先打表
[算法]DP+数学计数 [题意]给出n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案(对1004535809取模): 1.每条边连接两个不同的点,每两个点之间至多有一条边. 2.不存在 ...
- LibreOJ β Round #2 F. 数学上来先打表
传送门 题解 做法与题解基本无异,不过他说用vector我觉得用链表来得更好一些. #include<queue> #include<ctime> #include<bi ...
- F. 数学上来先打表
题解: 搞这题搞了一天 思维不是很难 就是暴力压位bitset 分块做法速度更快 但是stl里的不能实现这个功能 所以手动实现 64位压一位 到65535跑一下1的个数 然后(x>>16) ...
- [国家集训队]整数的lqp拆分 数学推导 打表找规律
题解: 考场上靠打表找规律切的题,不过严谨的数学推导才是本题精妙所在:求:$\sum\prod_{i=1}^{m}F_{a{i}}$ 设 $f(i)$ 为 $N=i$ 时的答案,$F_{i}$ 为斐波 ...
- 【NOIP模拟赛】 permutation 数学(打表)
biubiu~~~ 这道题卡读题卡得很死......首先他告诉我们读循环的时候要顺着圈读,然后又说这个圈在数列上要以最大数开始读,而且以这样的循环的首数排序,得到的序列与原序列一样那么他就是可行序列, ...
- Latex数学符号对应表
1. 希腊字母 字母 实现 字母 实现 $\alpha$ \alpha $\Alpha$ \Alpha $\beta$ \beta $\Beta$ \Beta $\gamma$ \gamma $\Ga ...
- Codeforces Round #304 (Div. 2) D 思维/数学/质因子/打表/前缀和/记忆化
D. Soldier and Number Game time limit per test 3 seconds memory limit per test 256 megabytes input s ...
- [日常] NOIP前集训日记
写点流水账放松身心... 10.8 前一天考完NHEEE的一调考试终于可以开始集训了Orz (然后上来考试就迟到5min, GG) T1维护队列瞎贪心, 过了大样例交上去一点也不稳...T出翔只拿了5 ...
随机推荐
- 那些我用Windows时必备的软件
那些我用Windows时必备的软件 使用Windows多年来,自己发现了许多不错的小软件,在此做一个备份清单,方便今后装新机. 起源 \(hadow\)ock$ 越过高墙的小飞机 Google Chr ...
- 题解 [HAOI2018]反色游戏
题目传送门 题目大意 给出一个 \(n\) 个点 \(m\) 条无向边的图,每个点都有一个 \(\in [0,1]\) 的权值,每次可以选择一条边,然后将该边相连两点权值异或上 \(1\).问有多少种 ...
- 用C++实现的数独解题程序 SudokuSolver 2.1 及实例分析
SudokuSolver 2.1 程序实现 在 2.0 版的基础上,2.1 版在输出信息上做了一些改进,并增加了 runtil <steps> 命令,方便做实例分析. CQuizDeale ...
- 详解python三大器——迭代器、生成器、装饰器
迭代器 聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值). 可迭代对象(i ...
- JavaScript05
显示和隐藏 元素的显示和隐藏 元素display属性可控制元素的显示和隐藏,先获取元素对象,再通过点语法调用style对象中的display属性 语法格式: 元素.style.display='non ...
- 什么是Spring,SpringMVC,SpringBoot,SpringCloud?通俗易懂
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.Spring使你能够编写更干净.更可管理.并且更易于测试的代码. Spring MVC是Spring的一个模块,一个web框 ...
- MAC 安装 apache ab 压力测试工具以及遇到的坑
ab 是apache对 http服务器进行压力测试的工具,它可以测试出服务器每秒可以处理多少请求.本文记录mac版本安装 ab 的步骤以及遇到的坑. 下载 进入 apache ab官网 下载页面. 安 ...
- airtest常用指令
airtest 操作adb命令 常用adb 1)对特定设备执行adb指令 dev = connect_device("Android:///device1") dev.shel ...
- 服务器端的GPU使用
服务器端的GPU使用 查看GPU信息 查看nvidia GPU信息: # 输入指令 lspci | grep -i nvidia # 结果如下: # 04:00.0 3D controller: NV ...
- oo第三次博客-JML规格
这三周的作业主要是围绕以JML来约束代码开发,以确保程序的正确性与鲁棒性. Part 1:三次作业的实现与bug 第一次作业没有任何算法和数据结构上的难度,对于Path和PathContainer的各 ...