[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部署SSM项目后,访问路径为url:8080/项目名_war_exploded的解决方案
在tomcat配置页的Deployment下,修改Application context为/,即可直接使用url:8080访问项目主页.
- 786B - Legacy(线段树 + 最短路)线段树优化建图
题意: 就是给定一张n nn个点的图,求源点s ss到每个点的单源最短路.这张图共有q组边,连边方式有3种: a→b ,边权为w的单向边:a→[l,r] ,即a到连续区间[l,r]中的每一个点都有一条 ...
- JavaEE--JSP详解
一.JSP JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导.许多公司参与一起建立的一种 ...
- cherrypy
十多年来,Web 程序设计人员一直使用 CGI 将应用程序连接到 Web 服务器和另一端的 Web 浏览器.有很多理由建议使用 CGI:它可以与任何编程语言一起使用,并且它在 Web 服务器和宿主服务 ...
- Adobe cc2019全家桶(免破解直接安装版)
图片来源:Adobe官网 此次整理了Adobe cc2019的全家桶,全部为免破解,直接安装即可使用版本,对一些小白来说,值得推荐. 下载方式:找到下面你需要的Adobe软件,公众号内回复对应的关键词 ...
- 【vsCode】识别.vue/一键生成.vue模板文件
1.安装插件Vetur 结果 ---> .vue代码识别彩标 2.配置.vue文件模板,以便快速一键生成格式化 2.1新建代码片段 File->Preferences->User S ...
- Delphi简介
- byteArray转换为double,int
/*将int转为低字节在前,高字节在后的byte数组 b[0] = 11111111(0xff) & 01100001 b[1] = 11111111(0xff) & (n & ...
- Linux20期学习笔记 Day1
Linux就该这么学第一章 1.4重置root管理员密码 放到红帽RHCSA考前辅导视频 源代码安装: 弊端:(好处第二章讲解) 1.难度高,安装困难 2.自己解决依赖关系(暂时不说) 新技术:RP ...
- 对mysql进行快照复制
Myself> flush tables with read lock; 之后开始创建快照 [root@server0 mysql]# lvcreate -L 100M -s -n dbback ...