晚间测试13 A. Dove 打扑克 vector +模拟
题目描述
分析
这道题比较关键的一点就是要看出最终牌数的种类数不会超过 \(\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 +模拟的更多相关文章
- 「10.28」Dove 打扑克(链表)·Cicada 与排序(概率)·Cicada 拿衣服(各种数据结构)
A. Dove 打扑克 考场思考半天线段树树状数组,没有什么想法 打完暴力后突然想到此题用链表实现会很快. 因为只有$n$堆,所以设最多有$x$个不同的堆数,那么$x\times (x-1)/2==n ...
- uva 101 POJ 1208 The Blocks Problem 木块问题 vector模拟
挺水的模拟题,刚开始题目看错了,poj竟然过了...无奈.uva果断wa了 搞清题目意思后改了一下,过了uva. 题目要求模拟木块移动: 有n(0<n<25)快block,有5种操作: m ...
- UVa 12100 Printer Queue(queue或者vector模拟队列)
The only printer in the computer science students' union is experiencing an extremely heavy workload ...
- hdu 4841 圆桌问题(用vector模拟约瑟夫环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4841 圆桌问题 Time Limit: 3000/1000 MS (Java/Others) M ...
- 利用C++ STL的vector模拟邻接表的代码
关于vector的介绍请看 https://www.cnblogs.com/zsq1993/p/5929806.html https://zh.cppreference.com/w/cpp/conta ...
- [UPC10525]:Dove打扑克(暴力+模拟)
题目描述 $Dove$和$Cicada$是好朋友,他们经常在一起打扑克来消遣时光,但是他们打的扑克有不同的玩法. 最开始时,牌桌上会有$n$个牌堆,每个牌堆有且仅有一张牌,第$i$个牌堆里里里那个扑克 ...
- 2019.8.5 NOIP模拟测试13 反思总结【已更新完毕】
还没改完题,先留个坑. 放一下AC了的代码,其他东西之后说… 改完了 快下课了先扔代码 跑了跑了 思路慢慢写 来补完了[x 刚刚才发现自己打错了标题 这次考试挺爆炸的XD除了T3老老实实打暴力拿了52 ...
- NOIP模拟测试13
考得还算可以,T3还有提升空间(没看清题&&样例没过 拿了4分). 期望得分:80+40+0=120 实际得分:80+85+4=169 一脸黑线.....是数据比较水的原因,T2分都比 ...
- 8.5 NOIP模拟测试13 矩阵游戏+跳房子+优美序列
T1矩阵游戏 数学题.首先这一列这一行先乘还是后乘对最后答案没有影响.a[i][j]表示矩阵中原始的值,h[i]表示i行的累乘,l[i]表示i列的累乘.易得ans=Σa[i][j]*h[i]*l[i] ...
随机推荐
- Azure Storage 系列(六)使用Azure Queue Storage
一,引言 在之前介绍到 Azure Storage 第一篇文章中就有介绍到 Azure Storage 是 Azure 上提供的一项存储服务,Azure 存储包括 对象.文件.磁盘.队列和表存储.这里 ...
- vue 游戏手柄使用
直接上代码. <template> <div class="home"> </div> </template> <script ...
- 【暂咕咕咕】SuffixTree
#include<bits/stdc++.h> using namespace std; const int MAXN=1e6+10; typedef long long ll; char ...
- Linux网卡命名规则
网卡命名 一.为什么需要这个 服务器通常有多块网卡,有板载集成的,同时也有插在PCIe插槽的.Linux系统的命名原来是eth0,eth1这样的形式,但是这个编号往往不一定准确对应网卡接口的 ...
- vector专题
<C++程序设计语言(第4部分:标准库)> 31.4 容器 31.4.1 vector 31.4.1.1 vector和增长 重要知识点:vector的内存布局 vector不会在添加每个 ...
- 多测师讲解接口自动化测试 _requests_高级讲师肖sir
rep=requests.post 错误方法: 1.在代理中---把高级中----代理-----去除勾选,调用失败
- 多测师讲解python _函数的传递_高级讲师肖sir
题目: 要求1.通过函数来实现 2.引用函数传递方法 3.引用返回值 有一个登录系统:账号admin 密码123456 验证码abc123 账号.密码.验证码 ...
- 本溪6397.7539(薇)xiaojie:本溪哪里有xiaomei
本溪哪里有小姐服务大保健[微信:6397.7539倩儿小妹[本溪叫小姐服务√o服务微信:6397.7539倩儿小妹[本溪叫小姐服务][十微信:6397.7539倩儿小妹][本溪叫小姐包夜服务][十微信 ...
- MeteoInfoLab脚本示例:Maskout图形
Maskout通常有两种类型:Maskout图形和Maskout数据.这里是Maskout图形的示例.需要用shaperead读取地图数据形成图层作为Maskout图层(这里是中国的行政区域china ...
- 在Linux终端中快速生成、解码二维码
我们要实现两个功能: 解码Linux屏幕上的二维码,将结果输出在终端 在终端中将字符串转为二维码,直接显示二维码在终端中以供扫描 实现方法 生成二维码 qrencode是一个常见的生成二维码的CLI程 ...