晚间测试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] ...
随机推荐
- redis 的基本使用
Linux上查看redis是否运行 ps -ef | grep redis 还能查看到Linux的安装路径. set rediskey redisvalue 在redis里面存储了一个名称为r ...
- NodeJS沙箱逃逸&&vm
NodeJS沙箱逃逸 关于nodejs的沙箱 使用场景 在线代码编辑器 第三方js代码 jsonp,like百度搜索框 https://www.baidu.com/s?wd=nodejs&mi ...
- 神经网络全连接层+softmax:
如下图:(图片来自StackExchange) 强化说明全连接层: 1.通常将网络最后一个全连接层的输入,即上面的x \mathrm{x}x,视为网络从输入数据提取到的特征. 2. 强化说明softm ...
- 精心总结ansible-playbook剧本的这6种变量
#变量作用 #根据需求灵活修改,如:需要安装不同版本号的服务,或进行版本升级回退等 1.通过vars定义变量 #1.1.定义一个变量 version: 1.1.2 #定义多个变量 vars: - v1 ...
- mysql-12-DDL
#DDL /* 数据定义语言 库和表的管理 一.库的管理 创建.修改.删除 二.表的管理 创建.修改.删除 创建 create 修改 alter 删除 drop */ #一.库的管理 #1.库的创建 ...
- 【题解】[APIO2010]特别行动队
Link 题目大意:一段区间的贡献是\(ax^2+bx+c,x=\sum v\),求一个划分让总区间的价值最大.分段必须连续. \(\text{Solution:}\) 设计\(dp[i]\)表示前\ ...
- 在 Minecraft 中管理 Kubernetes 集群
原文链接:在 Minecraft 中管理 Kubernetes 集群 微软 2015 年收购 Minecraft 之后不久开源了一个项目叫 Dockercraft,这个项目当时看起来非常有趣,通过 D ...
- 抓包工具Charles使用
设置Reason:最近接触一个APP后台项目,但是不知道APP各个操作访问对应的是后台的哪个接口,迫切需要使用一个抓包工具one by one Charles Free 简单上手快,首选 下载:h ...
- Python+Appium自动化测试(8)-swipe()滑动页面
app自动化测试过程中,经常会遇到滑动屏幕操作,appium框架的话我们可以使用webdriver提供的swipe()方法来对屏幕页面进行上滑.下滑.左滑.右滑操作. 一,swipe方法介绍 swip ...
- 关于Elasticsearch版本升级,Kibana报index迁移与需要x-pack插件问题
关于Elasticsearch版本升级,Kibana报index迁移与需要x-pack插件问题 这个问题是由于elasticsearch旧版残留文件导致,使用下述指令删除即可 查看所有elastics ...