常用STL

1.优先队列 priority_queue

内部是用堆(heap)实现的

priority_queue<int> pq; 默认为一个“越小的整数优先级越低的优先队列”

对于一些常见的优先队列,STL提供了更简单的定义方法 例如:“越小的整数优先级越大的优先队列”可以写成“priority_queue<int,vector<int>,greater<int> >pq"

自定义优先级

struct Node {
int x, y;
friend bool operator < (const Node& a, const Node& b) {
return a.x < b.x; //用小于号,表示小的先出列
}
};
priority_queue<Node> q;

 2.map

内部是一颗红黑树

map的遍历

map<string, int> mp;
for (auto it = mp.begin(); it != mp.end(); it++) {
if (it->second > max) {
max = it->second; ss = it->first;
}
}

3.接口 erase() 和 count(),empty()要比count()快

4.  4.pair<>类型可以简化代码

二叉树的遍历

节点

struct treeNode {
string data; treeNode* left;
treeNode* right; treeNode() {
data = "";
left = NULL;
right = NULL;
}
};

1.先序遍历

void PreOrder(treeNode* node) {
if (node == NULL) return;
cout << node->data<<"->"; if (node->left != NULL) {
PreOrder(node->left);
}
if (node->right != NULL) {
PreOrder(node->right);
}
}

2.中序遍历

void InOrder(treeNode* node) {
if (node == NULL) return; if (node->left != NULL) {
InOrder(node->left);
} cout << node->data << "->"; if (node->right != NULL) {
InOrder(node->right);
}
}

3.后序遍历

void PosOrder(treeNode* node) {
if (node == NULL) return; if (node->left != NULL) {
PosOrder(node->left);
}
if (node->right != NULL) {
PosOrder(node->right);
}
cout << node->data << "->";
}

并查集

并查集用于集合联通和查询

两个核心函数 Union 和Find

int Find(int x) {   //递归实现
return pre[x] != x ? pre[x] = Find(pre[x]) : x;
}
int Find() {
int p, tmp;
p = x;
while (x != pre[x]) x = pre[x];
while (p != x) { //路径压缩
tmp = pre[p]; //tmp暂存p的父节点
pre[p] = x; //pre[p]指向祖先节点
p = tmp;
}
return x;
}
void Union(int x, int y) {
int p = Find(x); int q = Find(y);
if (p != q) pre[q] = p;
}

畅通工程  http://acm.hdu.edu.cn/showproblem.php?pid=1232

#include<iostream>
using namespace std;
int pre[];
int Find(int x) {
if (x == pre[x]) return x;
else {
pre[x] = Find(pre[x]);
return pre[x];
}
}
int Union(int x, int y) {
int p = Find(x);
int q = Find(y);
if (q != p) {
pre[q] = p; return ;
}
return ;
}
int main() {
std::ios::sync_with_stdio();
cin.tie();
int n, m;
int x, y;
while(scanf("%d",&n)!=EOF){
if (n == ) break;
scanf("%d", &m);
int ans = n - ;
for (int i = ; i <=n; i++) {
pre[i] = i;
}
for (int i = ; i < m; i++) {
scanf("%d%d", &x, &y);
ans-=Union(x, y);
}
if (ans >= ) printf("%d\n", ans);
else printf("0\n");
}
return ;
}

How Many Tables http://acm.hdu.edu.cn/showproblem.php?pid=1213

#include<iostream>
#include<string>
#include<cmath>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<queue>
#include<stack>
#include<sstream>
#pragma warning(disable:4996)
const int maxn = 1e6 + ;
const double PI = acos(-1.0);
typedef long long ll;
using namespace std;
int tot;
void read() {
char ch;
while ((ch = getchar()) != '\n');
} int pre[];
int Find(int x) {
if (x == pre[x]) return x;
else {
pre[x] = Find(pre[x]);
return pre[x];
}
}
void Union(int x,int y) {
int p = Find(x);
int q = Find(y);
if (q != p) {
pre[q] = p;
tot--;
}
}
int main() {
std::ios::sync_with_stdio();
cin.tie();
int n, m,k;
int t,x,y;
cin >> t;
while (t--) {
cin >> n >> m;
tot = n - ;
for (int i = ; i <= n; i++) pre[i] = i;
for (int i = ; i < m; i++) {
cin >> x >> y;
Union(x, y);
}
cout << tot+<< "\n";
}
return ;
}

HZNU-ACM寒假集训Day1小结 STL 并查集的更多相关文章

  1. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  2. HZNU-ACM寒假集训Day8小结 最小生成树

    最小生成树(无向图) Kruskal 给所有边按从小到大排序 形成环则不选择(利用并查集) P1546 最短网络   https://www.luogu.com.cn/problem/P1546 #i ...

  3. 中南大学2019年ACM寒假集训前期训练题集(入门题)

    A: 漫无止境的八月 Description 又双叒叕开始漫无止境的八月了,阿虚突然问起长门在这些循环中团长哪几次扎起了马尾,他有多少次抓住了蝉等等问题,长门一共回复n个自然数,每个数均不超过1500 ...

  4. HZNU-ACM寒假集训Day10小结 单调栈-单调队列

    数据结构往往可以在不改变主算法的前提下题高运行效率,具体做法可能千差万别,但思路却是有规律可循 经典问题:滑动窗口  单调队列O(n) POJ 2823 我开始写的: TLE 说明STL的库还是有点慢 ...

  5. HZNU-ACM寒假集训Day3小结 搜索

    简单搜索 1.DFS UVA 548 树 1.可以用数组方式实现二叉树,在申请结点时仍用“动态化静态”的思想,写newnode函数 2.给定二叉树的中序遍历和后序遍历,可以构造出这棵二叉树,方法是根据 ...

  6. HZNU-ACM寒假集训Day2小结 二分答案

    Day2 ---二分 这里直接给出模板 两种对应不同的情况 可以借助数轴理解 int bsearch_1(int l, int r) { while (l < r) { ; if (check( ...

  7. 清北学堂寒假集训DAY1

    第一天,上午讲了些基本的技巧和简单算法,主要就是适应这里. 中午跑到食堂吃了顿“饭”(我并没有挖苦233333),然后回宿舍休息休息 因为 迎接我们的是模拟啊啊啊啊啊阿 下午题一发下来,并没有想象中的 ...

  8. 【2018寒假集训 Day1】【位运算】翻转游戏

    翻转游戏(flip) [问题描述] 翻转游戏是在一个 4 格×4 格的长方形上进行的,在长方形的 16 个格上每 个格子都放着一个双面的物件.每个物件的两个面,一面是白色,另一面是黑色, 每个物件要么 ...

  9. 【2018寒假集训 Day1】【位运算】桐桐的运输方案

    桐桐的运输方案(transp) [问题描述] 桐桐有 N 件货物需要运送到目的地,它们的重量和价值分别记为: 重量:W1,W2,…,Wn: 价值:V1,V2,…,Vn: 已知某辆货车的最大载货量为 X ...

随机推荐

  1. 吴裕雄--天生自然JAVAIO操作学习笔记:字节流与字符流操作

    import java.io.* ; public class Copy{ public static void main(String args[]){ if(args.length!=2){ // ...

  2. springboot自定义属性文件与bean映射注入属性值

    主要有几点: 一.导入依赖 springboot的包和: <dependency> <groupId>org.springframework.boot</groupId& ...

  3. UVA10820 交表 Send a Table

    \(\Large\textbf{Description:} \large{输入n,求有多少个二元组(x,y)满足:1\leqslant x,y\leqslant n,且x和y互素.}\) \(\Lar ...

  4. python isinstance()判断数据类型

    举例: d = (1,2,3) print(isinstance(d,int)) #False print(isinstance(d,tuple)) #True print(isinstance(d, ...

  5. MQTT 协议学习:Retained(保留消息) 与 LWT(最后遗嘱)

    背景导入 让我们来看一下这个场景: 你有一个温度传感器,它每三个小时向一个 Topic 发布当前的温度.那么问题来了,有一个新的订阅者在它刚刚发布了当前温度之后订阅了这个主题,那么这个订阅端什么时候能 ...

  6. C++面试常见问题——03String类的实现

    String类的具体实现 string的内容其实就是C中的字符串,在C中是char*型,在C++中是string类型. //C char *str = "mengziyue"; / ...

  7. Windows 10中使用VirtualBox

    新版Windows 10或者安装了新的更新以后,VirtualBox虚拟机就不能用了. 原因是WIndows10里面有个叫Virtualization-base security的安全机制打开了. 关 ...

  8. MSVCRTD.LIB和LIBCMTD.LIB冲突(转载)

    以前经常遇到这个警告信息,因为运行并没有什么问题,所以也没深究.但是耿耿于怀那个“ 0 个错误,0 个警告”的成功提示,在网上搜了一下.原来问题出在默认库的引用选择上. VS2008,项目——属性—— ...

  9. php.basic.functions

    array_unshift call_user_func_array闭包 下面是学院的代码 class Container { protected $binds; protected $instanc ...

  10. Python 中使用动态创建类属性的机制实现接口之后的依赖

    我们在自动化测试中经常会需要关联用例处理,需要动态类属性: 推荐使用第二种方法: 创建:setattr() 获取:getattr() 两种,如何创建 类属性 loan_id # 第一种,创建 # 类名 ...