NOIP 模拟 $36\; \rm Dove 打扑克$
题解 \(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 打扑克$的更多相关文章
- NOIP 模拟 $36\; \rm Cicada 拿衣服$
		
题解 \(by\;zj\varphi\) 发现右端点固定时,左端点的 \(min-max\) 单调递减,且对于 \(or\) 和 \(and\) 相减,最多有 \(\rm2logn\)个不同的值,且相 ...
 - NOIP 模拟 $36\; \rm Cicada 与排序$
		
题解 \(by\;zj\varphi\) 设 \(rk_{i,j}\) 表示第 \(i\) 个数最后在相同的数里排第 \(j\) 位的概率. 转移时用一个 \(dp\),\(dp_{i,j,0/1}\ ...
 - 20190902+0903合集-NOIP模拟
		
一直没时间写QwQ 于是补一下. Day 1 晚饭吃的有点恶心…… $1s\,2s\,5s$ 还开 -O2 ?? 有点恐怖. T1 猛的一想: 把外面设成一个点, 向入口连一条权为排队时间的边 从出口 ...
 - 2021.5.22 noip模拟1
		
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...
 - Noip模拟36 2021.8.11
		
刚题的习惯还是改不了,怎么办??? T1 Dove打扑克 考场上打的动态开点线段树+并查集,考后发现自己像一个傻子,并查集就行.. 这几天恶补数据结构疯了 用树状数组维护后缀和,$siz_i$表示编号 ...
 - 2021.8.11考试总结[NOIP模拟36]
		
T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...
 - 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]:选 ...
 - NOIP模拟3
		
期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...
 - 9.18[XJOI] NOIP训练36
		
***在休息了周末两天(好吧其实只有半天),又一次投入了学车的怀抱,重新窝在这个熟悉的机房 今日9.18(今天以后决定不写打卡了) 日常一日总结 一个昏昏欲睡的早晨 打了一套不知道是谁出的题目,空间限 ...
 
随机推荐
- WPF使用Microsoft.VisualBasic创建单例模式引起的权限降低问题
			
在进行WPF开发时,总是在找更加优雅去写单例模式的代码. 很多人都喜欢用Mutex,一个App.cs下很多的Mutex,我也喜欢用. 看完<WPF编程宝典>的第七章Applicaton类后 ...
 - 重学 Spring Boot
			
什么是Spring Boot Spring Boot 是 Spring 开源组织下的一个子项目,也是 Spring 组件一站式解决方案,主要是为了简化使用 Spring 框架的难度和简化 Spring ...
 - Vue权限路由实现总结
			
前言 年前完工了做了半年的铁路后台管理系统,系统整体业务比较复杂,这也是我到公司从 0 到 1 的 一个完整系统实践,做这个系统过程中踩了不少坑,也学到了很多. 做完这个系统没多久,紧接着又一个系统来 ...
 - adb bat
			
@REM 生成随机数@echo off@REM 设置延迟变量setlocal enabledelayedexpansionset min=9set max=21set /a mod=!max!-!mi ...
 - SpringBoot中时间格式化的5种方法!
			
在我们日常工作中,时间格式化是一件经常遇到的事儿,所以本文我们就来盘点一下 Spring Boot 中时间格式化的几种方法.  时间问题演示 为了方便演示,我写了一个简单 Spring Boot 项 ...
 - Qt开源作品38-无边框窗体方案(无抖动,支持win、linux、mac等系统,侧边半屏顶部全屏)
			
一 前言 不知道各位程序员有没有遇到过这样一种困惑,好不容易在开源网站找到了类似的想要的项目代码,结果down下来一编译,我勒个去,几百个错误,根本没法用,熟悉的人还好可以直接阅读代码进行修改(有些只 ...
 - POJ1723,1050,HDU4864题解(贪心)
			
POJ1723 Soldiers 思维题. 考虑y坐标,简单的货舱选址问题,选择中位数即可. 再考虑x坐标,由于直接研究布置方法非常困难,可以倒着想:不管如何移动,最后的坐标总是相邻的,且根据贪心的思 ...
 - odoo14开发之脚本自动生成代码
			
通过解析excel,自动生成odoo代码实现 一.首先做一个字段配置的excel模板 第二步.读取excel里面的模板,并写入到txt文件里 逻辑代码: # -*- coding: utf-8 -*- ...
 - 构建前端第5篇之---修改css样式的思路
			
张艳涛写于2020-1-20 在页面元素布局的时候,在知道应该如何设置元素的属性的时候,可以依照如下思路,使用chrome浏览器,打开f12,找到对应的最近元素,看右侧对于的css样式窗口,调整修改数 ...
 - 声明提前(hoist)
			
程序执行前,都会先找到var声明的变量和function声明的函数. 一.var声明的变量 程序 结果 console.log(a); var a=10; console.log(a); //unde ...