热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

UPC10525:Dove打扑克

时间限制: 1Sec  内存限制: 128MB提交: 33  解决: 11[提交][状态][讨论版][命题人:admin]题目描述Dove和Cicada是好朋友,他们经常在一起打扑

时间限制: 1 Sec  内存限制: 128 MB
提交: 33  解决: 11
[提交] [状态] [讨论版] [命题人:admin]

题目描述


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

 


输入


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

 


输出


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

 


样例输入


8 4
2 1
2 2
1 1 1
2 0

样例输出

0
0
28

 


来源/分类

衡水2018NOIP考前集训 


 
用并查集模拟合并操作,计算小于c的对数,总对数-小于c的对数即为ans
 

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 10;
ll fa[maxn], cnt[maxn], val[maxn];
ll all;
set num;
ll findd(ll x) {
return fa[x] == x ? x : fa[x] = findd(fa[x]);
}
void uni(ll a, ll b) {
ll p1 = findd(a), p2 = findd(b);
if (p1 != p2) {
cnt[val[p1]]--;
cnt[val[p2]]--;
if (cnt[val[p1]] == 0) num.erase(val[p1]);
if (cnt[val[p2]] == 0) num.erase(val[p2]);
cnt[val[p1] + val[p2]]++;
num.insert(val[p1] + val[p2]);
fa[p2] = p1;
val[p1] += val[p2];
all--;
}
}
void init(ll n) {
cnt[1] = n;
all = n;
num.insert(1);
for (ll i = 1; i <= n; i++) {
fa[i] = i;
val[i] = 1;
}
}
int main() {
freopen("input.txt", "r", stdin);
ll n, m;
scanf("%lld %lld", &n, &m);
init(n);
ll op;
ll x, y;
for (ll i = 0; i scanf("%lld", &op);
if (op == 1) {
scanf("%lld %lld", &x, &y);
uni(x, y);
} else {
scanf("%lld", &x);
set::iterator it, j;
it = num.begin();
j = it;
ll sum = 0;
ll ans = 0;
for (; it != num.end(); it++) {
while (j != num.end() && (*j - *it sum += cnt[*j];
j++;
}
sum -= cnt[*it];
if (x > 0) ans += 1ll * cnt[*it] * (cnt[*it] - 1) / 2;
ans = ans + cnt[*it] * sum;
}
printf("%lld\n", all * (all - 1) / 2 - ans);
}
}
return 0;
}

 



推荐阅读
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本文详细介绍了如何在BackTrack 5中配置和启动SSH服务,确保其正常运行,并通过Windows系统成功连接。涵盖了必要的密钥生成步骤及常见问题解决方法。 ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
author-avatar
YooHoo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有