题目描述



分析

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

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

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

每次二分插入和删除即可

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

代码

  1. #include<cstdio>
  2. #include<vector>
  3. #define rg register
  4. inline int read(){
  5. rg int x=0,fh=1;
  6. rg char ch=getchar();
  7. while(ch<'0' || ch>'9'){
  8. if(ch=='-') fh=-1;
  9. ch=getchar();
  10. }
  11. while(ch>='0' && ch<='9'){
  12. x=(x<<1)+(x<<3)+(ch^48);
  13. ch=getchar();
  14. }
  15. return x*fh;
  16. }
  17. const int maxn=1e6+5;
  18. int n,m,tp,siz[maxn],sum[maxn],fa[maxn],sta[maxn];
  19. int zhao(int xx){
  20. if(xx==fa[xx]) return xx;
  21. return fa[xx]=zhao(fa[xx]);
  22. }
  23. struct jie{
  24. int val,cnt;
  25. jie(){}
  26. jie(int aa,int bb){
  27. val=aa,cnt=bb;
  28. }
  29. };
  30. std::vector<jie> g;
  31. int ef(int val){
  32. rg int l=1,r=g.size(),mids;
  33. while(l<=r){
  34. mids=(l+r)>>1;
  35. if(g[mids-1].val>=val) r=mids-1;
  36. else l=mids+1;
  37. }
  38. return l-1;
  39. }
  40. int main(){
  41. n=read(),m=read();
  42. for(rg int i=1;i<=n;i++){
  43. siz[i]=1;
  44. fa[i]=i;
  45. }
  46. g.insert(g.begin(),jie(1,n));
  47. rg int aa,bb,cc,dd,ee,ff;
  48. rg long long ans=0;
  49. for(rg int i=1;i<=m;i++){
  50. aa=read();
  51. if(aa==1){
  52. bb=read(),cc=read();
  53. dd=zhao(bb),ee=zhao(cc);
  54. if(dd==ee) continue;
  55. ff=ef(siz[dd]);
  56. g[ff].cnt--;
  57. if(g[ff].cnt==0) g.erase(g.begin()+ff);
  58. ff=ef(siz[ee]);
  59. g[ff].cnt--;
  60. if(g[ff].cnt==0) g.erase(g.begin()+ff);
  61. siz[dd]+=siz[ee];
  62. siz[ee]=0;
  63. if(g[g.size()-1].val<siz[dd]){
  64. g.push_back(jie(siz[dd],1));
  65. } else {
  66. ff=ef(siz[dd]);
  67. if(g[ff].val==siz[dd]) g[ff].cnt++;
  68. else g.insert(g.begin()+ff,jie(siz[dd],1));
  69. }
  70. fa[ee]=dd;
  71. } else {
  72. bb=read();
  73. ans=0;
  74. tp=g.size();
  75. for(rg int j=1;j<=tp;j++){
  76. sum[j]=sum[j-1]+g[j-1].cnt;
  77. sta[j]=g[j-1].val;
  78. }
  79. if(bb==0){
  80. ans+=1LL*(sum[tp]-1)*sum[tp]/2LL;
  81. } else {
  82. ee=1,ff=1;
  83. while(ee<=tp){
  84. while(sta[ff]-sta[ee]<bb && ff<=tp) ff++;
  85. if(sta[ff]-sta[ee]<bb || ff>tp) break;
  86. ans+=1LL*(sum[ee]-sum[ee-1])*(sum[tp]-sum[ff-1]);
  87. ee++;
  88. }
  89. }
  90. printf("%lld\n",ans);
  91. }
  92. }
  93. return 0;
  94. }

晚间测试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. Azure Storage 系列(六)使用Azure Queue Storage

    一,引言 在之前介绍到 Azure Storage 第一篇文章中就有介绍到 Azure Storage 是 Azure 上提供的一项存储服务,Azure 存储包括 对象.文件.磁盘.队列和表存储.这里 ...

  2. vue 游戏手柄使用

    直接上代码. <template> <div class="home"> </div> </template> <script ...

  3. 【暂咕咕咕】SuffixTree

    #include<bits/stdc++.h> using namespace std; const int MAXN=1e6+10; typedef long long ll; char ...

  4. Linux网卡命名规则

    网卡命名 一.为什么需要这个      服务器通常有多块网卡,有板载集成的,同时也有插在PCIe插槽的.Linux系统的命名原来是eth0,eth1这样的形式,但是这个编号往往不一定准确对应网卡接口的 ...

  5. vector专题

    <C++程序设计语言(第4部分:标准库)> 31.4 容器 31.4.1 vector 31.4.1.1 vector和增长 重要知识点:vector的内存布局 vector不会在添加每个 ...

  6. 多测师讲解接口自动化测试 _requests_高级讲师肖sir

    rep=requests.post 错误方法: 1.在代理中---把高级中----代理-----去除勾选,调用失败

  7. 多测师讲解python _函数的传递_高级讲师肖sir

    题目:   要求1.通过函数来实现       2.引用函数传递方法        3.引用返回值   有一个登录系统:账号admin  密码123456 验证码abc123    账号.密码.验证码 ...

  8. 本溪6397.7539(薇)xiaojie:本溪哪里有xiaomei

    本溪哪里有小姐服务大保健[微信:6397.7539倩儿小妹[本溪叫小姐服务√o服务微信:6397.7539倩儿小妹[本溪叫小姐服务][十微信:6397.7539倩儿小妹][本溪叫小姐包夜服务][十微信 ...

  9. MeteoInfoLab脚本示例:Maskout图形

    Maskout通常有两种类型:Maskout图形和Maskout数据.这里是Maskout图形的示例.需要用shaperead读取地图数据形成图层作为Maskout图层(这里是中国的行政区域china ...

  10. 在Linux终端中快速生成、解码二维码

    我们要实现两个功能: 解码Linux屏幕上的二维码,将结果输出在终端 在终端中将字符串转为二维码,直接显示二维码在终端中以供扫描 实现方法 生成二维码 qrencode是一个常见的生成二维码的CLI程 ...