题目描述

  $Dove$和$Cicada$是好朋友,他们经常在一起打扑克来消遣时光,但是他们打的扑克有不同的玩法。
  最开始时,牌桌上会有$n$个牌堆,每个牌堆有且仅有一张牌,第$i$个牌堆里里里那个扑克牌的编号为$i$,任意两张牌仅有标号不不同。游戏会进行$m$轮,每轮$Dove$可以执行行下列操作之一:
  $\bullet 1\ x\ y$,将编号为$x,y$的牌所在的牌堆合并,如果此时$x,y$已在同一牌堆中,那么不进行任何操作。
  $\bullet 2\ c$,询问有多少对牌堆的牌数之差不少于$c$。形式化的,对于当前的$r$个牌堆中,有多少对$i,j(i<j)$,满足$|size_i-size_j|\geqslant c$,其中$size_i$表示第$i$个牌堆的牌数。
  每次$Cicada$都不能很快的回答出$Dove$的询问,为了不让$Cicada$难堪,$Dove$想要写一个小程序来帮助$Cicada$,但是$Dove$还要把妹学高考,所以这个任务就交给你啦!


输入格式

  第一行两个空格隔开的整数$n,m$。
  接下来$m$行,每行为$1\ x\ y$或者$2\ c$,具体含义如上文所示。


输出格式

  对于每个询问,输出一行一个整数表示答案。


数据范围与提示

$n,c\leqslant 10^5,m\leqslant 3\times 10^5$


题解

显然答案就是$\sum \limits_{i=1}^ns[i]\times s[<(i-c)]$,其中$s[i]$表示有$i$个石子的堆的个数。

用树状数组即可快速求出$s[<(i-c)]$,由于同时最多只会有$\sqrt{n}$个不同的$s[i]$,于是去个重就好了。

时间复杂度:$\Theta(n\sqrt{n}\log n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,m,t;
int fa[100001],bl[100001],size[100001],num[100001];
long long ans[2][100001];
vector<int> vec;
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void change(int x,int w){ans[0][x]+=w;ans[1][bl[x]]+=w;}
void del(int x)
{
if(x<=t)num[x]--;
else vec.erase(lower_bound(vec.begin(),vec.end(),x));
for(int i=1;i<=t;i++)change(abs(x-i),-num[i]);
for(auto i:vec)change(abs(x-i),-1);
}
void add(int x,int y)
{
for(int i=1;i<=t;i++)change(abs(size[x]-i),num[i]);
for(auto i:vec)change(abs(size[x]-i),1);
if(size[x]<=t)num[size[x]]++;
else vec.insert(lower_bound(vec.begin(),vec.end(),size[x]),size[x]);
}
long long ask(int x)
{
long long res=0;
for(int i=x;i<=bl[x]*t;i++)res+=ans[0][i];
for(int i=bl[x]+1;i<=bl[n];i++)res+=ans[1][i];
return res;
}
int main()
{
scanf("%d%d",&n,&m);
t=sqrt(n);
for(int i=1;i<=n;i++)
{
fa[i]=i;
size[i]=1;
bl[i]=(i-1)/t+1;
}
num[1]=n;ans[0][0]=ans[1][0]=1LL*n*(n-1)/2;
while(m--)
{
int opt;scanf("%d",&opt);
switch(opt)
{
case 1:
int x,y;
scanf("%d%d",&x,&y);
x=find(x);y=find(y);
if(x==y)continue;
del(size[x]);
del(size[y]);
size[x]+=size[y];
fa[y]=x;
add(x,y);
break;
case 2:
int c;scanf("%d",&c);
printf("%lld\n",ask(max(c,0)));
break;
}
}
return 0;
}

rp++

[UPC10525]:Dove打扑克(暴力+模拟)的更多相关文章

  1. 晚间测试13 A. Dove 打扑克 vector +模拟

    题目描述 分析 这道题比较关键的一点就是要看出最终牌数的种类数不会超过 \(\sqrt{n}\) 种 知道了这个性质我们就可以用 \(vector\) 维护一个有序的序列 \(vector\) 中存放 ...

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

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

  3. bnuoj 20832 Calculating Yuan Fen(暴力模拟)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=20832 [题意]: 给你一串字符串,求一个ST(0<ST<=10000),对字符串中字符 ...

  4. POJ 1013 小水题 暴力模拟

    Counterfeit Dollar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35774   Accepted: 11 ...

  5. hdu_1006 Tick and Tick(暴力模拟)

    hdu1006 标签(空格分隔): 暴力枚举 好久没有打题了,退队了有好几个月了,从心底不依赖那个人了,原来以为的爱情戏原来都只是我的独角戏.之前的我有时候好希望有个人出现,告诉自己去哪里,做什么,哪 ...

  6. hihoCoder #1871 : Heshen's Account Book-字符串暴力模拟 自闭(getline()函数) (ACM-ICPC Asia Beijing Regional Contest 2018 Reproduction B) 2018 ICPC 北京区域赛现场赛B

    P2 : Heshen's Account Book Time Limit:1000ms Case Time Limit:1000ms Memory Limit:512MB Description H ...

  7. 美团2018年CodeM大赛-资格赛 分数 暴力模拟

    链接:https://www.nowcoder.com/acm/contest/138/D来源:牛客网 小胖参加了人生中最重要的比赛——MedoC资格赛.MedoC的资格赛由m轮构成,使用常见的“加权 ...

  8. 2018/7/31-zznu-oj-问题 B: N! 普拉斯 -【求大数的阶乘-ll存不下-然后取尾零的个数输出-暴力模拟】

    问题 B: N! 普拉斯 时间限制: 1 Sec  内存限制: 128 MB提交: 114  解决: 35[提交] [状态] [讨论版] [命题人:admin] 题目描述 在处理阶乘时也需要借助计算器 ...

  9. 2018/7/31-zznuoj-问题 A: A + B 普拉斯【二维字符串+暴力模拟+考虑瑕疵的题意-0的特例】

    问题 A: A + B 普拉斯 在计算机中,数字是通过像01像素矩阵来显示的,最终的显示效果如下:  现在我们用01来构成这些数字 当宝儿姐输入A + B 时(log10(A)<50,log10 ...

随机推荐

  1. 头大!RabbitMQ 和 Kafka 到底怎么选?

    前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措. 对于RabbitMQ和Kafka,到底应该选哪个? Rabb ...

  2. 《剑指offer》面试题6 重建二叉树 Java版

    (由一个二叉树的前序和中序序列重建一颗二叉树) 书中方法:我们要重建一棵二叉树,就要不断地找到根节点和根节点的左子结点和右子节点.注意前序序列, 它的第一个元素就是二叉树的根节点,后面的元素分为它的左 ...

  3. day 17 模块

    模块是什么? 抖音: 20万行代码全部放在一个py文件中? 为什么不行? 1. 代码太多,读取代码耗时太长. 代码不容易维护. 所以我们怎么样? 一个py文件拆分100文件,100个py文件又有相似相 ...

  4. ELK-全文检索技术-kibana操作elasticsearch

    前言:建议kibana语法一定要学好! 1       软件安装 1.1     ES的安装 第一步:解压压缩包,放到一个没有中文没有空格的位置 第二步:修改配置文件 1.  jvm.options ...

  5. P多行溢出省略号的处理

    因为-webkit-line-clamp: 2不兼容火狐或IE,采用判断浏览器的方式来启用哪个方式 先判断是什么浏览器 //判断是否是谷歌浏览器 if (!stripos($_SERVER[" ...

  6. 洛谷P1412 经营与开发题解

    题目链接QWQ这里就不阐述了: 题解部分: 从题面上来看,这是个dp(递推)的题目. 但是dp要满足无后效性,但这个题为了取最值,得考虑从当前开始一直持续到结束的p的影响. 这让我们怎么满足无后效性? ...

  7. spring+mybatis事务配置(转载)

    原文地址:http://blog.csdn.net/wgh1015398431/article/details/52861048 申明式事务配置步骤 .xml文件头部需要添加spring的相关支持: ...

  8. 跨域 (2) cors

    html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  9. 前端每日实战:136# 视频演示如何用 D3 和 GSAP 创作一个横条 loader

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/pOZKWJ 可交互视频 此视频是可 ...

  10. pt-archiver使用记录

    pt-archiver使用记录 功能:将MySQL表中的行存档到另一个表或文件中用法:pt-archiver [OPTIONS] --source DSN --where WHERE ; trunca ...