常用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. redis.rpm 安装

    yum install jemalloc wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/redis-3.0.7 ...

  2. jmeter里面Dug Sampler 和json提取器的用法

    1.编写用户详情请求 2.查看结果树 一级一级往上查找父集 3.添加json提取器 步骤:点击[用户详情]请求->添加->后置处理器->json提取器 把查看结果树里面的JSON P ...

  3. Java笔记--集合

    1.Java集合类可以用于存储数量不等的多个对象,还可以用于保存具有映射关系的关联数组. 2.Java集合可分为Collection和Map两种体系: --Collection:1)Set:元素无序. ...

  4. 017.CI4框架CodeIgniter数据库操作之:Updata更新修改一条数据

    01. 在Model中写入数据库操作的代码如下: <?php namespace App\Models\System; use CodeIgniter\Model; class User_mod ...

  5. Spark Deploy 模块

    Spark Scheduler 模块的文章中,介绍到 Spark 将底层的资源管理和上层的任务调度分离开来,一般而言,底层的资源管理会使用第三方的平台,如 YARN 和 Mesos.为了方便用户测试和 ...

  6. [题解] UVA11426 GCD - Extreme (II)

    题面 莫反是不可能莫反的,这辈子都不可能莫反了 题目要求的是 \[ \sum\limits_{i=1}^n \sum\limits_{j=i+1}^n \gcd(i,j) \] 稍微变个亚子 \[ \ ...

  7. 谈谈对MapTask任务分配和Shuffle的理解

    一.切片与MapTask的关系 1.概述 大家要注意区分切片与切块的区别: 切块Block是HDFS物理上把数据分成一块一块的,默认是128M: 数据切片:只是在逻辑上对输入进行分片,并不会在磁盘上分 ...

  8. 吴裕雄--天生自然java开发常用类库学习笔记:对象克隆技术

    class Person implements Cloneable{ // 实现Cloneable接口表示可以被克隆 private String name ; public Person(Strin ...

  9. CentOS 6.5(x86_32)下安装Oracle 10g R2

    一.硬件要求 1.内存 & swap Minimum: 1 GB of RAMRecommended: 2 GB of RAM or more 检查内存情况 # grep MemTotal / ...

  10. 【剑指Offer】面试题32 - II. 从上到下打印二叉树 II

    题目 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回 ...