博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1483 链表 + 启发式合并
阅读量:5077 次
发布时间:2019-06-12

本文共 1725 字,大约阅读时间需要 5 分钟。

思路:将颜色相同的建成一个链表, 变颜色的时候进行链表的启发式合并。。

因为需要将小的接到大的上边,所以要用个f数组。

#include
#define LL long long#define fi first#define se second#define mk make_pair#define pii pair
using namespace std;const int N = 1e6 + 7;const int M = 1e5 + 7;const int inf = 0x3f3f3f3f;const LL INF = 0x3f3f3f3f3f3f3f3f;const int mod = 1e9 +7;int n, m, ans, f[N], a[N];struct node { node(int id, node *nx) { this->id = id; this->nx = nx; } int id; node *nx;} *head[N];void Insert(int x, int id) { node *p = new node(id, head[x]->nx); head[x]->nx = p; head[x]->id++;}void Merge(int x, int y) { if(x == y) return; if(head[f[x]]->id > head[f[y]]->id) swap(f[x], f[y]); x = f[x], y = f[y]; node *cur = head[x]; while(cur -> nx != NULL) { cur = cur -> nx; int id = cur->id; if(a[id - 1] == y) ans--; if(a[id + 1] == y) ans--; } cur = head[x]; while(cur -> nx != NULL) { cur = cur -> nx; int id = cur -> id; a[id] = y; } cur = head[y]; while(cur -> nx != NULL) { cur = cur -> nx; } cur->nx = head[x]->nx; head[y]->id += head[x]->id; head[x]->id = 0; head[x]->nx = NULL;}int main() { for(int i = 1; i <= 1e6; i++) { f[i] = i; head[i] = new node(0, NULL); } scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); if(a[i] != a[i - 1]) ans++; Insert(a[i], i); } while(m--) { int op; scanf("%d", &op); if(op == 1) { int x, y; scanf("%d%d", &x, &y); Merge(x, y); } else { printf("%d\n", ans); } } return 0;}/**/

 

转载于:https://www.cnblogs.com/CJLHY/p/9282248.html

你可能感兴趣的文章
Golang之interface(多态,类型断言)
查看>>
Redis快速入门
查看>>
BootStrap---2.表格和按钮
查看>>
Linear Algebra lecture 2 note
查看>>
CRC计算模型
查看>>
Ajax之404,200等查询
查看>>
Aizu - 1378 Secret of Chocolate Poles (DP)
查看>>
csv HTTP简单表服务器
查看>>
OO设计的接口分隔原则
查看>>
数据库连接字符串大全 (转载)
查看>>
java类加载和对象初始化
查看>>
对于负载均衡的理解
查看>>
django简介
查看>>
window.event在IE和Firefox的异同
查看>>
常见的js算法面试题收集,es6实现
查看>>
IO流写出到本地 D盘demoIO.txt 文本中
查看>>
Windows10 下Apache服务器搭建
查看>>
HDU 5458 Stability
查看>>
左手坐标系和右手坐标系
查看>>
solr后台操作Documents之增删改查
查看>>