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 ...
随机推荐
- python列表元组 魔法方法
1.元祖 count() 统计某个字符串的出现次数 tuple.count('22') 返回一个整数 index() 获取某个值出现的位置 2.列表 字符串可以直接转换列表 l ...
- Lesson 48 Planning a share portfolio
How does the older investor differ in his approach to investment from the younger investor? There is ...
- is application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem
最近试着了解 c++,接触到了QT,写了一个测试程序,在开发环境下正常后移到非开发环境,报错 网上找资料说是少了platforms文件夹中的dll,把里面所有的dll复制到执行程序目录,还是提示,继续 ...
- POJ 3273:Monthly Expense 二分好题啊啊啊啊啊啊
Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19207 Accepted: 7630 ...
- BlackArch-Tools
BlackArch-Tools 简介 安装在ArchLinux之上添加存储库从blackarch存储库安装工具替代安装方法BlackArch Linux Complete Tools List 简介 ...
- LOJ #10002. 喷水装置
题目 裸的贪心. 基本思想见图: Code: #include<iostream> #include<cstdio> #include<cstring> #incl ...
- 图形与动画在Android中的实现
public class MyView extends View{ Bitmap myBitmap; Paint paint; public MyView(Context context, Attri ...
- angular.js开发 将多页面开发成单页面
用angulara.js做单页面开发时,由于不能跨页面取数据,又需要传参,可以采用:$scope.step=0/1来解决这个问题,设置初始值为想要的页面即可.
- 5 GC 参数
- 2 JVM 运行机制