题解 \(by\;zj\varphi\)

引理

对于一个和为 \(n\) 的数列,不同的数的个数最多为 \(\sqrt n\)

证明:

一个有 \(n\) 个不同的数的数列,和最小就是 \(n\) 的排列时 \(\frac{n(n+1)}{2}\),是 \(\sqrt n\) 级别的。

那么,直接用 \(set\) 维护一下有多少不同的堆数,再记一个桶维护每种数的堆有多少个,询问时直接二分查找即可。

复杂度 \(\mathcal O\rm(q\sqrt nlogn)\)

Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++
struct nanfeng_stream{
template<typename T>inline nanfeng_stream operator>>(T &x) {
ri f=0;x=0;register char ch=gc();
while(!isdigit(ch)) f|=ch=='-',ch=gc();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=gc();
return x=f?-x:x,*this;
}
}cin;
}
using IO::cin;
namespace nanfeng{
#define pb push_back
#define FI FILE *IN
#define FO FILE *OUT
template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
typedef long long ll;
static const int N=1e5+7,M=3e5+7;
std::set<int> st;
int tmp[N];
int fa[N],siz[N],T[N],sum[N],cnt,n,m;
ll ans;
int find(ri x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
inline int main() {
//FI=freopen("nanfeng.in","r",stdin);
//FO=freopen("nanfeng.out","w",stdout);
cin >> n >> m;
for (ri i(1);i<=n;p(i)) siz[fa[i]=i]=1;
st.insert(1);
T[1]=n;
for (ri z(1),opt,x,y,c;z<=m;p(z)) {
cin >> opt;
if (opt==1) {
cin >> x >> y;
//printf("x=%d y=%d\n",x,y);
int k1=find(x),k2=find(y);
//puts("tst");
if (k1==k2) continue;
fa[k2]=k1;
--T[siz[k1]];
--T[siz[k2]];
if (!T[siz[k1]]) st.erase(siz[k1]);
if (!T[siz[k2]]) st.erase(siz[k2]);
siz[k1]+=siz[k2];
if (!T[siz[k1]]) st.insert(siz[k1]);
++T[siz[k1]];
} else {
cin >> c;
cnt=ans=0;
for (auto x:st) tmp[++cnt]=x;
sum[cnt+1]=0;
for (ri i(cnt);i;--i) sum[i]=sum[i+1]+T[tmp[i]];
if (!st.size()) {printf("0\n");continue;}
if (!c) {printf("%lld\n",(ll)sum[1]*(sum[1]-1)>>1ll);continue;}
for (ri i(1);i<=cnt;p(i)) {
ri x=tmp[i];
ri k=std::lower_bound(tmp+i,tmp+cnt+1,x+c)-tmp;
if (k==cnt+1) break;
ans+=(ll)sum[k]*T[x];
}
printf("%lld\n",ans);
}
}
return 0;
}
}
int main() {return nanfeng::main();}

NOIP 模拟 $36\; \rm Dove 打扑克$的更多相关文章

  1. NOIP 模拟 $36\; \rm Cicada 拿衣服$

    题解 \(by\;zj\varphi\) 发现右端点固定时,左端点的 \(min-max\) 单调递减,且对于 \(or\) 和 \(and\) 相减,最多有 \(\rm2logn\)个不同的值,且相 ...

  2. NOIP 模拟 $36\; \rm Cicada 与排序$

    题解 \(by\;zj\varphi\) 设 \(rk_{i,j}\) 表示第 \(i\) 个数最后在相同的数里排第 \(j\) 位的概率. 转移时用一个 \(dp\),\(dp_{i,j,0/1}\ ...

  3. 20190902+0903合集-NOIP模拟

    一直没时间写QwQ 于是补一下. Day 1 晚饭吃的有点恶心…… $1s\,2s\,5s$ 还开 -O2 ?? 有点恐怖. T1 猛的一想: 把外面设成一个点, 向入口连一条权为排队时间的边 从出口 ...

  4. 2021.5.22 noip模拟1

    这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...

  5. Noip模拟36 2021.8.11

    刚题的习惯还是改不了,怎么办??? T1 Dove打扑克 考场上打的动态开点线段树+并查集,考后发现自己像一个傻子,并查集就行.. 这几天恶补数据结构疯了 用树状数组维护后缀和,$siz_i$表示编号 ...

  6. 2021.8.11考试总结[NOIP模拟36]

    T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...

  7. NOIP模拟

    1.要选一个{1,2,...n}的子集使得假如a和b在所选集合里且(a+b)/2∈{1,2,...n}那么(a+b)/2也在所选集合里 f[i]=2*f[i-1]-f[i-2]+g[i] g[n]:选 ...

  8. NOIP模拟3

    期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...

  9. 9.18[XJOI] NOIP训练36

    ***在休息了周末两天(好吧其实只有半天),又一次投入了学车的怀抱,重新窝在这个熟悉的机房 今日9.18(今天以后决定不写打卡了) 日常一日总结 一个昏昏欲睡的早晨 打了一套不知道是谁出的题目,空间限 ...

随机推荐

  1. Git远程操作详解(clone、remote、fetch、pull、push)

    https://blog.csdn.net/u013374164/article/details/79091677 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多 ...

  2. XDFZOI 月赛 201905 Sliver

    组题人自己组完过后,才发现自己还是太弱了... T1 简单模拟. 按照游戏规则直接模拟显然是不明智的,所以我们可以像石头剪刀布一样,将判断改变为检验. 同时,我们发现,一共只有48种牌,所以我们可以直 ...

  3. EXCEL:宏 考场考号打印

    Sub addwork() Rem 当前宏是根据学生数量 .每考场人数计算工作表数Dim i As IntegerRem xx为每个考场的人数Rem yy为当前专业标记Rem mm为当前专业考生人数R ...

  4. [刘阳Java]_InternalResourceViewResolver视图解析器_第6讲

    SpringMVC在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器 InternalResourceViewResolver是SpringMVC中比较常用视图解析器. 网 ...

  5. File类与常用IO流第十章——序列化流

    第十章.序列化流 序列化流和反序列化流概述 序列化:用一个字节序列表示一个对象,该字节序列包含该对象的数据.对象的类型和对象中存储的属性等等信息.字节序列写出到文件后,相当于文件中持久保存了一个对象的 ...

  6. 前端开发入门到进阶附录一【JQuery中parent(),parents(),parentsUntil()区别和使用技巧】

    JQuery中parent(),parents(),parentsUntil()区别和使用技巧:https://blog.csdn.net/china1223/article/details/5193 ...

  7. odoo中接口开发

    文章参考:https://blog.csdn.net/qq_33472765/article/details/81913627案例0000001接口调用请求说明:https请求方式:GET(请使用ht ...

  8. 第十二篇 -- 如何向MFC对话框添加菜单

    1.如何在基于对话框的MFC中添加菜单:https://blog.csdn.net/u012273127/article/details/71293088 步骤: 资源文件处右击Add Resourc ...

  9. HashSet 的实现原理

    HashSet 概述 对于 HashSet 而言,它是基于 HashMap 实现的,底层采用 HashMap 来保存元素,所以如果对 HashMap 比较熟悉了,那么学习 HashSet 也是很轻松的 ...

  10. Super-Mario-Host(超级玛丽)靶机

    仅供个人娱乐 靶机百度云下载  链接:https://pan.baidu.com/s/13l1FUgJjXArfoTOfcmPsbA 提取码:a8ox 一.主机发现 arp-scan -l 二.漏洞扫 ...