[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 ...
随机推荐
- Idea生成JavaDoc文档
什么是JavaDoc javadoc是Sun公司提供的一个技术 它从程序源代码中抽取类.方法.成员等注释形成一个和源代码配套的API帮助文档 实现方式 命令行方式 javadoc -encoding ...
- 6岁!是时候重新认识下Serverless了
一.背景 Serverless 概念从2012年开始提出,真正推出相关云产品是2014年AWS推出Lambda.如果我们将 Serverless 比作一个婴儿,那么它已经6岁了. 虽然业界对Serve ...
- Java基础之(一):JDK的安装以及Notepad++的下载
从今天开始就开始我的Java的学习了,学习Java前需要做一些前期的准备工作.好了,现在我们先一起来安装JDK. JDK的安装 JDK下载链接:JDK 下载电脑对应的版本,同意协议 双击安装JDK 将 ...
- 使用 PyTorch Lightning 将深度学习管道速度提高 10 倍
前言 本文介绍了如何使用 PyTorch Lightning 构建高效且快速的深度学习管道,主要包括有为什么优化深度学习管道很重要.使用 PyTorch Lightning 加快实验周期的六种 ...
- 从C过渡到C++需要了解的“新特性”
第一个C++程序 #include <iostream> using namespace std; //编译指令 int main() { cout << "Hell ...
- OO第二单元电梯作业总结
目录 目录一.第一次作业分析设计策略基于度量分析程序结构二.第二次作业分析设计策略基于度量分析程序结构三.第三次作业分析设计策略基于度量分析程序结构四.分析自己程序的bug五.发现别人程序bug所采用 ...
- Noip模拟79 2021.10.17(题目名字一样)
T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...
- Linux C 数据结构 ->单向链表
之前看到一篇单向链表的博文,代码也看着很舒服,于是乎记录下来,留给自己~,循序渐进,慢慢 延伸到真正的内核链表~(敢问路在何方?路在脚下~) 1. 简介 链表是Linux 内核中最简单,最普通的数据结 ...
- AOP源码解析:AspectJExpressionPointcutAdvisor类
先看看 AspectJExpressionPointcutAdvisor 的类图 再了解一下切点(Pointcut)表达式,它指定触发advice的方法,可以精确到返回参数,参数类型,方法名 1 pa ...
- HttpContext.Current.Request.Url 地址:获取域名
假设当前页完整地址是:http://www.test.com/aaa/bbb.aspx?id=5&name=kelli 协议名----http://域名 ---- www.test.com站 ...