UESTC 1634 记得小苹初见,两重心字罗衣 欧拉路径(回路)
记得小苹初见,两重心字罗衣
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
Submit Status
二维平面上有n个点.
你需要将每个点染成红色或蓝色.
请设计一种染色方案能够使得每一行和每一列的红色的点的数量与蓝色的点的数量之差都不超过1.
Input
第一行一个整数n(1≤n≤200000),表示有n个点.
接下来n行,每行两个整数x,y(1≤x,y≤200000),表示第i个点的坐标,保证任意两个点的坐标不相同. 保证输入至少存在一个可行解.
Output
输出一行,一共n个字母,第i个字母表示第i个点的颜色. 如果是红色,输出字母r;如果是蓝色,输出字母b.
Sample input and output
Sample Input Sample Output
3
1 1
1 2
2 1
brr
Source
2017 UESTC Training for Graph Theory
UESTC 1634 记得小苹初见,两重心字罗衣
My Solution
题意:二维平面上有n个点,需要将每个点染成红色或蓝色.
要求设计一种染色方案能够使得每一行和每一列的红色的点的数量与蓝色的点的数量之差都不超过1。
欧拉路径(回路)
把每个点当作一条边来处理,横坐标x表示一个点,纵坐标y加MAXN以后也表示一个点,边x-y+MAXN就
唯一确定了这个坐标。然后对这个图,如果有度数为奇数的点,则新建节点a和b,如果是表示横坐标的
点度数为奇数,则向a连边,如果是纵坐标就向b连边。
然后if(adj[i].size())则跑Fleury算法。
这个要写成
inline void dfs(int u){
int i, v, e;
while(!adj[u].empty()){
v = adj[u].back().second, e = adj[u].back().first;
adj[u].pop_back();
if(!vis[e]){
vis[e] = true;
dfs(v);
path.push_back(e);
}
}
}
这样的形式,如每次枚举u连出的每条边则每个点u都要扫adj[u].size()次所以几乎n^2的复杂度。
然后还有一个问题,我们oj上的系统调用栈在这时是不够用的,测试了下大概支持3e5次递归,
这里是超出了。但加了inline之后一定程度上降低了函数的开销,所以加了之后就不爆栈了。
时间复杂度 O(V + E)
空间复杂度 O(V + E)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<int, int> ii;
const int MAXN = 2e5 + 8;
const int MAXM = 3*2e5 + 8;vector<ii> adj[2*MAXN + 8];
bool vis[MAXM];
inline void add(int x, int y, int z){ //z is the edge who disjoint x and y.adj[x].push_back(ii(z, y));adj[y].push_back(ii(z, x));
}vector<int> path;
inline void dfs(int u){int v, e;while(!adj[u].empty()){v = adj[u].back().second, e = adj[u].back().first;adj[u].pop_back();if(!vis[e]){vis[e] = true;dfs(v);path.push_back(e);}}
}
inline void get_path(int m){int i, j, sz, a = 2*MAXN + 1, b = 2*MAXN + 2, cnt = m;int origin = -1;for(i = 1; i <= 2*MAXN; i++){sz = adj[i].size();if(sz){if(sz & 1){if(i <= MAXN){add(a, i, ++cnt);if(origin != a) origin = a;}else{add(b, i, ++cnt);if(origin != b) origin = b;}}if(origin == -1) origin = i;}}dfs(origin);for(i = 1; i <= 2*MAXN; i++){if(adj[i].size()) dfs(i);}
}int ans[MAXN];int main()
{#ifdef LOCALfreopen("c.txt", "r", stdin);//freopen("c.out", "w", stdout);int T = 1;while(T--){#endif // LOCAL//ios::sync_with_stdio(false); cin.tie(0);int m, i, x, y;//cin >> n;scanf("%d", &m);for(i = 1; i <= m; i++){scanf("%d%d", &x, &y);add(x, y + MAXN, i);}get_path(m);int sz = path.size();for(i = 0 ; i < sz; i++){if(path[i] <= m) ans[path[i]] = i&1;}for(i = 1; i <= m; i++){if(ans[i]) putchar('r');else putchar('b');}#ifdef LOCALcout << endl;}#endif // LOCALreturn 0;
}
Thank you!
------from ProLights
UESTC 1634 记得小苹初见,两重心字罗衣 欧拉路径(回路)相关推荐
- UESTC 1634 记得小苹初见,两重心字罗衣
题意:给你不超过20万个点,要求每行每列的蓝红数量不能相差超过一,输出一种方案 题解:解法1:每一个棋子看做一个点,每一列任意两个点连接一条边,同理,每一行也连两条边,DFS染色就可以 解法2:每一个 ...
- 图论的起源:柯尼斯堡七桥(一笔画)问题与欧拉路径/回路
柯尼斯堡七桥问题 大数学家欧拉一生中的大部分时间在俄国和普鲁士度过.1735年,他提出了著名的柯尼斯堡七桥(Seven Bridges of Königsberg)问题: 柯尼斯堡(今俄罗斯加里宁格勒 ...
- 【欧拉回路】【欧拉路径】【Fleury算法】CDOJ1634 记得小苹初见,两重心字罗衣...
Fleury算法看这里 http://hihocoder.com/problemset/problem/1181 把每个点看成边,每个横纵坐标看成一个点,得到一个无向图. 如果新图中每个点的度都是偶数 ...
- UESTC 图论专题 A-D
A:梦后楼台高锁,酒醒帘幕低垂 题目链接:http://acm.uestc.edu.cn/#/problem/show/1636 解法:首先,考虑到,我们需要找到一条路径,使它的最小边尽量大,最大边尽 ...
- 欧拉回路 欧拉路径
欧拉路径(瞎)定义 : 如果有一条路径使得能够走完所有的边且每一条边经过有且只有一次,这样的路径叫做欧拉路径 欧拉回路定义 : 如果有从起点出发最后回到起点的一条路径使得能够走完所有的边且每条边经过有 ...
- 科大星云诗社动态20210309
[诗人背后的故事--为情而活晏几道] 杜甫忧国,不顾妻子有孕离家而去:陆游孝顺,因为母亲反对就休掉唐婉:元白交好,两人唱和诗比给妻子的诗多得多--诗人虽写情,却未必重情.忠义礼孝,皆在情之上. 而历史 ...
- css 大于号 标签_CSS设计基础选择器篇
点击上方 Java项目学习 ,选择 星标 公众号 重磅资讯.干货,第一时间送达 前言:如果将CSS样式应用于特定的网页对象上,需要先找到目标元素.在CSS样式中执行这一任务的部分被称为选择器. 1 标 ...
- The road to learning English-Grammar
定语从句 定语从句的结构 先行词:被定语从句修饰的名词,或代词,或句子 关系代词有:who, whom, whose, that, which, as. 关系副词有:when, where, why, ...
- 【渝粤教育】广东开放大学 应用创意写作 形成性考核 (54)
选择题 题目:<四库全书>将图书分为 ( )四部. 题目:"五经"指 ( ). 题目:汉代 ( )在<论六家要旨>中,重点对春秋战国时诸子百家中的儒.墨.名 ...
最新文章
- Ubuntu 安装OpenCV3.0.0
- eclipse下查看maven下载的源码中文乱码问题
- go语言从零学起(二)--list循环删除元素(转载)
- Datalore:用于机器学习可视化的新Web方案!
- c++99乘法表_nine-nine table 不是“99张桌子”,理解错了数学老师会打你!
- 阿里面试官常问的TCP和UDP,你真的弄懂了吗?
- Recommender Sys Interview Qs
- linux 在ftp gt 下登录,cutftp显示的是啥意思?
- Oracle 10G安装指导
- matlab语音信号生成语谱图,基于MATLAB的语音信号采集和语谱图分析
- Caffe 框架理解
- android studio mipmap下创建不同分辨率的文件夹
- 利用ip138取得公网IP,公网ip改变后报警通知我们进行更改
- [视觉Slam十四讲(2)踩坑记录]第3讲:Fatal error :Eigen/core没有那个文件或目录
- 使用ManagedWifi连接无线网络
- c# wifi串口通信_在C#中实现串口通信的方法
- 超实数与布尔巴基学派
- Beyond Compare v3.3.13 中文版
- 手撕instanceof
- STM32G474 基于IRTIM外设实现红外接收