[UPC10525]:Dove打扑克(暴力+模拟)
题目描述
$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打扑克(暴力+模拟)的更多相关文章
- 晚间测试13 A. Dove 打扑克 vector +模拟
题目描述 分析 这道题比较关键的一点就是要看出最终牌数的种类数不会超过 \(\sqrt{n}\) 种 知道了这个性质我们就可以用 \(vector\) 维护一个有序的序列 \(vector\) 中存放 ...
- 「10.28」Dove 打扑克(链表)·Cicada 与排序(概率)·Cicada 拿衣服(各种数据结构)
A. Dove 打扑克 考场思考半天线段树树状数组,没有什么想法 打完暴力后突然想到此题用链表实现会很快. 因为只有$n$堆,所以设最多有$x$个不同的堆数,那么$x\times (x-1)/2==n ...
- bnuoj 20832 Calculating Yuan Fen(暴力模拟)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=20832 [题意]: 给你一串字符串,求一个ST(0<ST<=10000),对字符串中字符 ...
- POJ 1013 小水题 暴力模拟
Counterfeit Dollar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 35774 Accepted: 11 ...
- hdu_1006 Tick and Tick(暴力模拟)
hdu1006 标签(空格分隔): 暴力枚举 好久没有打题了,退队了有好几个月了,从心底不依赖那个人了,原来以为的爱情戏原来都只是我的独角戏.之前的我有时候好希望有个人出现,告诉自己去哪里,做什么,哪 ...
- 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 ...
- 美团2018年CodeM大赛-资格赛 分数 暴力模拟
链接:https://www.nowcoder.com/acm/contest/138/D来源:牛客网 小胖参加了人生中最重要的比赛——MedoC资格赛.MedoC的资格赛由m轮构成,使用常见的“加权 ...
- 2018/7/31-zznu-oj-问题 B: N! 普拉斯 -【求大数的阶乘-ll存不下-然后取尾零的个数输出-暴力模拟】
问题 B: N! 普拉斯 时间限制: 1 Sec 内存限制: 128 MB提交: 114 解决: 35[提交] [状态] [讨论版] [命题人:admin] 题目描述 在处理阶乘时也需要借助计算器 ...
- 2018/7/31-zznuoj-问题 A: A + B 普拉斯【二维字符串+暴力模拟+考虑瑕疵的题意-0的特例】
问题 A: A + B 普拉斯 在计算机中,数字是通过像01像素矩阵来显示的,最终的显示效果如下: 现在我们用01来构成这些数字 当宝儿姐输入A + B 时(log10(A)<50,log10 ...
随机推荐
- IDEA怎么关闭暂时不用的工程
一.隐藏 二.隐藏之后显示显示模块 原文地址:https://blog.csdn.net/woshilovetg/article/details/82774437
- Homebrew学习(一)之初认识
Homebrew Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装.卸载.更新.查看.搜索等很多实用的功能.简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,会 ...
- 088、Docker 如何支持多种日志方案 (2019-05-10 周五)
参考https://www.cnblogs.com/CloudMan6/p/7762369.html 将容器日志发送到 STDOUT 和 STDERR 是Docker 的默认日志行为.实际上,Do ...
- EditPlus配置Java编译器
一.环境说明 系统: windows 7 64位 editplus version: 4.3 二.设置步骤 打开工具中的配置用户工具: 找到用户工具User tools,点击组名Group Name ...
- vue单页应用首次加载太慢之性能优化
问题描述: 最近开发了一个单页应用,上线后发现页面初始加载要20s才能完成,这就很影响用户体验了,于是分析原因,发现页面加载时有个 vendor.js达到了3000多kb,于是在网上查找了一下原因,是 ...
- AndroidStudio Gradle手动下载和安装
操作流程概述: 下载好的压缩包和解压后的文件夹复制到gradle-5.5.1-all --->97z1ksx6lirer3kbvdnh7jtjg文件夹下,将gradle-5.5.1-all.zi ...
- 2019-11-29-msbuild-项目文件常用判断条件
title author date CreateTime categories msbuild 项目文件常用判断条件 lindexi 2019-11-29 08:36:48 +0800 2019-7- ...
- oracle分页查询按日期排序失败问题
今天对已经上线的代码进行测试,结果发现分页是失效的,一度怀疑是前台页面分页失效,排查后发现是分页sql有问题,分页sql按日期排序,导致分页失败. 按日期排序,会造成相同的数据重复出现. 解决方案:在 ...
- PAT Basic 1067 试密码 (20 分)
当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过 20 的.不包含空格. ...
- List&LinQ
DataTable会将整个数据表接收过来,可真正使用的数据未必是整个数据表所有的数据. 使用List可以接收需要使用的数据 public class Data_Model { public strin ...