HZNU-ACM寒假集训Day1小结 STL 并查集
常用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 并查集的更多相关文章
- 中南大学2019年ACM寒假集训前期训练题集(基础题)
先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...
- HZNU-ACM寒假集训Day8小结 最小生成树
最小生成树(无向图) Kruskal 给所有边按从小到大排序 形成环则不选择(利用并查集) P1546 最短网络 https://www.luogu.com.cn/problem/P1546 #i ...
- 中南大学2019年ACM寒假集训前期训练题集(入门题)
A: 漫无止境的八月 Description 又双叒叕开始漫无止境的八月了,阿虚突然问起长门在这些循环中团长哪几次扎起了马尾,他有多少次抓住了蝉等等问题,长门一共回复n个自然数,每个数均不超过1500 ...
- HZNU-ACM寒假集训Day10小结 单调栈-单调队列
数据结构往往可以在不改变主算法的前提下题高运行效率,具体做法可能千差万别,但思路却是有规律可循 经典问题:滑动窗口 单调队列O(n) POJ 2823 我开始写的: TLE 说明STL的库还是有点慢 ...
- HZNU-ACM寒假集训Day3小结 搜索
简单搜索 1.DFS UVA 548 树 1.可以用数组方式实现二叉树,在申请结点时仍用“动态化静态”的思想,写newnode函数 2.给定二叉树的中序遍历和后序遍历,可以构造出这棵二叉树,方法是根据 ...
- HZNU-ACM寒假集训Day2小结 二分答案
Day2 ---二分 这里直接给出模板 两种对应不同的情况 可以借助数轴理解 int bsearch_1(int l, int r) { while (l < r) { ; if (check( ...
- 清北学堂寒假集训DAY1
第一天,上午讲了些基本的技巧和简单算法,主要就是适应这里. 中午跑到食堂吃了顿“饭”(我并没有挖苦233333),然后回宿舍休息休息 因为 迎接我们的是模拟啊啊啊啊啊阿 下午题一发下来,并没有想象中的 ...
- 【2018寒假集训 Day1】【位运算】翻转游戏
翻转游戏(flip) [问题描述] 翻转游戏是在一个 4 格×4 格的长方形上进行的,在长方形的 16 个格上每 个格子都放着一个双面的物件.每个物件的两个面,一面是白色,另一面是黑色, 每个物件要么 ...
- 【2018寒假集训 Day1】【位运算】桐桐的运输方案
桐桐的运输方案(transp) [问题描述] 桐桐有 N 件货物需要运送到目的地,它们的重量和价值分别记为: 重量:W1,W2,…,Wn: 价值:V1,V2,…,Vn: 已知某辆货车的最大载货量为 X ...
随机推荐
- NO16 第二关课后考试-aw-F-过滤已知的一级目录
·总结的经验:1.学会总结时学好运维的重要前提.2.通过案列或例子来总结一个技术点或者命令.3.画一张逻辑图,形象的卡通记忆这个知识技术点.4.通过管道过滤数据时,最好先输出结果,然后回退再使用管道看 ...
- iplimage 转HBITMAP
HBITMAP IplImage2hBitmap(IplImage* pImg) { cvFlip(pImg, NULL); BYTE tmp[]; BITMAPINFO *bmi = (BITMAP ...
- DB2的常用指令
注:大写的是固定的,小写的根据自己的实际情况 首先进入 命令窗口, win+r ---> 输入 db2cmd db2 1. 删除数据库 UNCATALOG DB db_name --db_nam ...
- ubuntu 新建用户后 不能使用TAB键、上下键,命令行不显示当前路径的解决
因默认ubuntu创建的普通帐号,默认shell为/bin/sh,而这不支持tab等键的,所以将「指定用户」帐号的shell改为/bin/bash就可以了. 1.查看当前的shell:# echo $ ...
- 03.Delphi通过接口实现多重继承的优化
在上一篇02中,写到的sayhello函数,需要使用2个接口参数,很繁琐.可以使用as参数,把多重继承的子类对象变成需要的对象 uSayHello代码如下 unit uSayHello; interf ...
- Hive 中的 order by, sort by, distribute by 与 cluster by
Order By order by 会对输入做全排序, 因此只有一个Reducer(多个Reducer无法保证全局有序), 然而只有一个Reducer, 会导致当输入规模较大时, 消耗较长的计算时间. ...
- 吴裕雄--天生自然java开发常用类库学习笔记:国际化程序
import java.util.ResourceBundle ; public class InterDemo01{ public static void main(String args[]){ ...
- Problem J. Joseph’s Problem 约瑟夫问题--余数之和
链接:https://vjudge.net/problem/UVA-1363 题意:给出n k,当 i 属于 1~n 时 ,求解 n% i 的和 n 和 k 的范围都是 1 到 10^9; 商相同 ...
- grep -w ,grep -e的使用
1.grep -w -wDoes a word search.grep -w用于字符串精确匹配若文件中的内容包括如下:262 a326226如果 grep ‘26’ file,结果是三行全部都被显示若 ...
- HDU 4819 二维线段树
13年长春现场赛的G题,赤裸裸的二维线段树,单点更新,区间查询 不过我是第一次写二维的,一开始写T了,原因是我没有好好利用行段,说白一点,还是相当于枚举行,然后对列进行线段树,那要你写二维线段树干嘛 ...