题目描述



分析

这道题比较关键的一点就是要看出最终牌数的种类数不会超过 \(\sqrt{n}\) 种

知道了这个性质我们就可以用 \(vector\) 维护一个有序的序列

\(vector\) 中存放牌数的大小和有多少堆这样的牌

每次二分插入和删除即可

时间复杂度 \(O(m\sqrt{n})\)

代码

#include<cstdio>
#include<vector>
#define rg register
inline int read(){
rg int x=0,fh=1;
rg char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*fh;
}
const int maxn=1e6+5;
int n,m,tp,siz[maxn],sum[maxn],fa[maxn],sta[maxn];
int zhao(int xx){
if(xx==fa[xx]) return xx;
return fa[xx]=zhao(fa[xx]);
}
struct jie{
int val,cnt;
jie(){}
jie(int aa,int bb){
val=aa,cnt=bb;
}
};
std::vector<jie> g;
int ef(int val){
rg int l=1,r=g.size(),mids;
while(l<=r){
mids=(l+r)>>1;
if(g[mids-1].val>=val) r=mids-1;
else l=mids+1;
}
return l-1;
}
int main(){
n=read(),m=read();
for(rg int i=1;i<=n;i++){
siz[i]=1;
fa[i]=i;
}
g.insert(g.begin(),jie(1,n));
rg int aa,bb,cc,dd,ee,ff;
rg long long ans=0;
for(rg int i=1;i<=m;i++){
aa=read();
if(aa==1){
bb=read(),cc=read();
dd=zhao(bb),ee=zhao(cc);
if(dd==ee) continue;
ff=ef(siz[dd]);
g[ff].cnt--;
if(g[ff].cnt==0) g.erase(g.begin()+ff);
ff=ef(siz[ee]);
g[ff].cnt--;
if(g[ff].cnt==0) g.erase(g.begin()+ff);
siz[dd]+=siz[ee];
siz[ee]=0;
if(g[g.size()-1].val<siz[dd]){
g.push_back(jie(siz[dd],1));
} else {
ff=ef(siz[dd]);
if(g[ff].val==siz[dd]) g[ff].cnt++;
else g.insert(g.begin()+ff,jie(siz[dd],1));
}
fa[ee]=dd;
} else {
bb=read();
ans=0;
tp=g.size();
for(rg int j=1;j<=tp;j++){
sum[j]=sum[j-1]+g[j-1].cnt;
sta[j]=g[j-1].val;
}
if(bb==0){
ans+=1LL*(sum[tp]-1)*sum[tp]/2LL;
} else {
ee=1,ff=1;
while(ee<=tp){
while(sta[ff]-sta[ee]<bb && ff<=tp) ff++;
if(sta[ff]-sta[ee]<bb || ff>tp) break;
ans+=1LL*(sum[ee]-sum[ee-1])*(sum[tp]-sum[ff-1]);
ee++;
}
}
printf("%lld\n",ans);
}
}
return 0;
}

晚间测试13 A. Dove 打扑克 vector +模拟的更多相关文章

  1. 「10.28」Dove 打扑克(链表)·Cicada 与排序(概率)·Cicada 拿衣服(各种数据结构)

    A. Dove 打扑克 考场思考半天线段树树状数组,没有什么想法 打完暴力后突然想到此题用链表实现会很快. 因为只有$n$堆,所以设最多有$x$个不同的堆数,那么$x\times (x-1)/2==n ...

  2. uva 101 POJ 1208 The Blocks Problem 木块问题 vector模拟

    挺水的模拟题,刚开始题目看错了,poj竟然过了...无奈.uva果断wa了 搞清题目意思后改了一下,过了uva. 题目要求模拟木块移动: 有n(0<n<25)快block,有5种操作: m ...

  3. UVa 12100 Printer Queue(queue或者vector模拟队列)

    The only printer in the computer science students' union is experiencing an extremely heavy workload ...

  4. hdu 4841 圆桌问题(用vector模拟约瑟夫环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4841 圆桌问题 Time Limit: 3000/1000 MS (Java/Others)    M ...

  5. 利用C++ STL的vector模拟邻接表的代码

    关于vector的介绍请看 https://www.cnblogs.com/zsq1993/p/5929806.html https://zh.cppreference.com/w/cpp/conta ...

  6. [UPC10525]:Dove打扑克(暴力+模拟)

    题目描述 $Dove$和$Cicada$是好朋友,他们经常在一起打扑克来消遣时光,但是他们打的扑克有不同的玩法. 最开始时,牌桌上会有$n$个牌堆,每个牌堆有且仅有一张牌,第$i$个牌堆里里里那个扑克 ...

  7. 2019.8.5 NOIP模拟测试13 反思总结【已更新完毕】

    还没改完题,先留个坑. 放一下AC了的代码,其他东西之后说… 改完了 快下课了先扔代码 跑了跑了 思路慢慢写 来补完了[x 刚刚才发现自己打错了标题 这次考试挺爆炸的XD除了T3老老实实打暴力拿了52 ...

  8. NOIP模拟测试13

    考得还算可以,T3还有提升空间(没看清题&&样例没过 拿了4分). 期望得分:80+40+0=120 实际得分:80+85+4=169 一脸黑线.....是数据比较水的原因,T2分都比 ...

  9. 8.5 NOIP模拟测试13 矩阵游戏+跳房子+优美序列

    T1矩阵游戏 数学题.首先这一列这一行先乘还是后乘对最后答案没有影响.a[i][j]表示矩阵中原始的值,h[i]表示i行的累乘,l[i]表示i列的累乘.易得ans=Σa[i][j]*h[i]*l[i] ...

随机推荐

  1. Oracle学习(十五)PLSQL安装

    PS:由于原来一直用的旧版本的PLSQL客户端,查看执行计划有些数据无法展示,所以今天换一波新版本的使用,记录下安装和使用流程. PLSQL(oracle数据可视化工具) 一.下载 我用的13的版本, ...

  2. Codeforces1146G. Zoning Restrictions

    Description You are planning to build housing on a street. There are n spots available on the street ...

  3. Oracle添加键值对盲注

    前言 遇到一种注入点,存在于POST参数中,却不能用sqlmap扫出: 分析 request参数格式: %24Q_value1=test1&orderCol=&order=+ASC+& ...

  4. 微服务实战系列(五)-注册中心Eureka与nacos区别

    1. 场景描述 nacos最近用的比较多,介绍下nacos及部署吧,刚看了下以前写过类似的,不过没写如何部署及与eureka区别,只展示了效果,补补吧. 2.解决方案 2.1 nacos与eureka ...

  5. ucore操作系统学习笔记(一) ucore lab1系统启动流程分析

    一.ucore操作系统介绍 操作系统作为一个基础系统软件,对下控制硬件(cpu.内存.磁盘网卡等外设),屏蔽了底层复杂多样的硬件差异:对上则提供封装良好的应用程序接口,简化应用程序开发者的使用难度.站 ...

  6. Centos-移动文件或目录-mv

    mv 移动文件或者目录,可以用重命名文件或者目录 相关选项 -i 如果文件或目录存在询问是否覆盖,输入y确认,输入n取消 -f 不提示,覆盖

  7. 机器学习可解释性系列 - 是什么&为什么&怎么做

    机器学习可解释性分析 可解释性通常是指使用人类可以理解的方式,基于当前的业务,针对模型的结果进行总结分析: 一般来说,计算机通常无法解释它自身的预测结果,此时就需要一定的人工参与来完成可解释性工作: ...

  8. 一种基于均值不等式的Listwise损失函数

    一种基于均值不等式的Listwise损失函数 1 前言 1.1 Learning to Rank 简介 Learning to Rank (LTR) , 也被叫做排序学习, 是搜索中的重要技术, 其目 ...

  9. Java 从现在到次日零时还剩余多少秒

    参考:计算从现在到凌晨00:00还剩余多少秒 应用场景:某些应用需要在特定的时间点更新数据 1 import java.text.DateFormat; 2 import java.text.Simp ...

  10. P6268 [SHOI2002]舞会

    题目描述 Link 某学校要召开一个舞会.已知学校所有 \(n\) 名学生中,有些学生曾经互相跳过舞.当然跳过舞的学生一定是一个男生和一个女生.在这个舞会上,要求被邀请的学生中的任何一对男生和女生互相 ...