bzoj 1539 [POI2005]Dwu-Double-row 建图+思路
题面
题目传送门
解法
思路还是比较精妙的
- 我们不妨假设a[i]a[i]a[i]表示iii这一列是否交换两行的数
- 然后对于一个数xxx,假设它出现的位置分别为第iii列和第jjj列,如果这两个位置在同一行,那么i,ji,ji,j之间连接一条为111的无向边,表示a[i]≠a[j]a[i]≠a[j]a[i]̸=a[j],否则在i,ji,ji,j之间连接一条为000的无向边,表示a[i]=a[j]a[i]=a[j]a[i]=a[j]
- 然后这个图会被分成若干个连通块,对于每一个连通块,假设a[i]=0a[i]=0a[i]=0的有xxx个, a[i]=1a[i]=1a[i]=1的有yyy个,那么这个连通块对答案的贡献为min(x,y)min(x,y)min(x,y),这个应该比较显然
- 时间复杂度:O(n)O(n)O(n)
代码
#include <bits/stdc++.h>
#define N 100010
using namespace std;
template <typename node> void chkmax(node &x, node y) {x = max(x, y);}
template <typename node> void chkmin(node &x, node y) {x = min(x, y);}
template <typename node> void read(node &x) {x = 0; int f = 1; char c = getchar();while (!isdigit(c)) {if (c == '-') f = -1; c = getchar();}while (isdigit(c)) x = x * 10 + c - '0', c = getchar(); x *= f;
}
struct Edge {int next, num, v;} e[N * 4];
int s0, s1, cnt, vis[N];
vector <int> pos[N];
void add(int x, int y, int v) {e[++cnt] = (Edge) {e[x].next, y, v};e[x].next = cnt;
}
void dfs(int x, int col) {if (col == 0) s0++; else s1++; vis[x] = 1;for (int p = e[x].next; p; p = e[p].next) {int k = e[p].num, v = e[p].v;if (vis[k]) continue; dfs(k, col ^ v);}
}
int main() {int n, mx = 0; read(n); cnt = n;for (int i = 1; i <= n; i++) {int x; read(x); chkmax(mx, x);pos[x].push_back(i);}for (int i = 1; i <= n; i++) {int x; read(x); chkmax(mx, x);pos[x].push_back(-i);}for (int i = 1; i <= mx; i++) {if (pos[i].size() < 2) continue;int x = pos[i][0], y = pos[i][1], tx = abs(x), ty = abs(y);if (x < 0 && y > 0 || x > 0 && y < 0) add(ty, tx, 0), add(tx, ty, 0);else add(ty, tx, 1), add(tx, ty, 1);}int ans = 0;for (int i = 1; i <= n; i++)if (!vis[i]) {s0 = 0, s1 = 0;dfs(i, 0); ans += min(s0, s1);}cout << ans << "\n";return 0;
}
bzoj 1539 [POI2005]Dwu-Double-row 建图+思路相关推荐
- bzoj 1539: [POI2005]Dwu-Double-row
假设一列交换表示为1,不换表示为0. 身高相同的两个人相当于给其中两列了一个限制条件,要么是两个必须相等,要么一个为零一个为一. 有了关系后我们就可以把每列当成一个点建边,边权为0表示必须相同,1为必 ...
- POJ 3281 -- Dining(最大流,拆点建图)
题目链接 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drink ...
- BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...
- bzoj 4883 [Lydsy1705月赛]棋盘上的守卫 题解(思维,建图,最小基环森林)
原题链接: bzoj 题意简述 一个 n ∗ m n*m n∗m的矩阵,要放 n + m n+m n+m个守卫,每个守卫只能守住所在行或所在列(只能选择一个).在 i , j i,j i,j位置上放守 ...
- BZOJ 4242 水壶(BFS建图+最小生成树+树上倍增)
题意 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入建筑 ...
- ORBSLAM2实验记录(1)——稠密建图
写在前面 近期又重新拾起ORBSLAM2的学习,换装了Ubuntu16.04,配置环境的bug比18.04少了不少,可以说是一路顺利,关于环境配置的问题,网络上可以说是众说纷纭,如果你打算使用Ubun ...
- ORB_SLAM2局部建图线程
局部建图线程入口:可执行程序在初始化三个线程的时候,在System.cc的构造函数中进入局部建图线程 mpLocalMapper = new LocalMapping(mpMap, //指定使io ...
- POJ 2516 -- Minimum Cost (最小费用最大流, 必须分开建图)
题目链接 Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In ...
- hdu 4885 (n^2*log(n)推断三点共线建图)+最短路
题意:车从起点出发,每次仅仅能行驶L长度,必需加油到满,每次仅仅能去加油站或目的地方向,路过加油站就必需进去加油,问最小要路过几次加油站. 開始时候直接建图,在范围内就有边1.跑最短了,再读题后发现, ...
最新文章
- antv g6 禁止移动_antV G6流程图在Vue中的使用
- IIS7.5 错误代码0x8007007e HTTP 错误 500.19
- 【学习笔记】Django
- 三大数据驱动机制,助力文娱企业打造高留存、高转化增长闭环
- MySQL 中删除的数据都去哪儿了?
- 当我们谈论 996 的时候我们在谈论什么?
- python多进程间通信
- Excel实验情况对比排序
- 学计算机的感想300字,大学生计算机实训心得体会3篇
- M1卡读写软件C#源代码
- Word转换PDF:pdf虚拟打印机怎么用操作技巧详解
- 图文实例带你了解香农编码和霍夫曼编码
- 花了一万多买的web前端全套教程,现在分享给大家
- java语言中标识符大小写不敏感_下列叙述中,正确的是()。A.Java语言的标识符是区分大小写的B.源文件名与public类名可...
- ipoo3可以用鸿蒙,真正全网通!iQOO 3支持双模六频5G,出国也能用
- Mac上doc 转docx
- redis分布式锁的原子保证
- 如何用大数据进行宠物店选址要素分析
- xp下,输入法不能删除,也不能添加(所有添加和删除的按钮都为灰色)的解决方法
- Linux系统中彻底隐藏你的进程(隐藏后如何恢复显示?)
热门文章
- 消费提示:2012春运火车票 网上订票攻略
- Linux 系统 pptpd+radius+mysql 安装攻略
- 我们应该如何看待牛市熊市?到了牛市熊市有什么标志吗?
- 什么样的人适合当软件工程师?
- 2008 r2 server sql 中文版补丁_Microsoft SQL Server 2008 R2 SP1补丁 32位 官方免费版(附安装教程)...
- windows 2008 r2或win7安装SP1补丁,安装sqlserver 2012
- Corner芯片TT,FF,SS
- 对链特异性建库的理解
- 安装Burp suitev2021.8.1过程中出现错误--illegal-access=permit
- 提升色觉障碍用户的视频观看体验——播放器色觉辅助功能开发