L. Simone and graph coloring
L Simone and graph coloring
链接:https://ac.nowcoder.com/acm/contest/12548/L
题意:给定一个 n 的排列,每两个点直接如果存在逆序就连一条边。请你对这 n 个点染色,要求任意一条边的两点颜色不同,且使用的颜色数量最少,输出染色方案。
思路:最直接的想法,那就是枚举每一个点,然后遍历它的每一条边,然后对自己的后继颜色取 mex 。但是这样的边最极端的情况有 (1+n)n2\frac {(1+n)n} 22(1+n)n 条,显然不能围绕边数来做
- 可以这样想,从 n 到 1 枚举每一个数。对于数 iii 只考虑大于 iii 的,且在左边的数对 iii 的影响。假设 jjj 大于 iii 在 iii 的左边,颜色为 cjc_jcj ,这个 cjc_jcj 也是 jjj 左边大于 jjj 的数对 jjj 的影响,那么 cic_ici 肯定是 ≥cj+1\ge c_j + 1≥cj+1 的。因此只需要取在 [1,pos[i]−1][1,pos[i]-1][1,pos[i]−1] 这个范围内颜色最大值 cxc_xcx,那么 cic_ici 取 cx+1c_x+1cx+1即可。
- 对于一个数 iii ,右边的小于 iii 的数 kkk ,虽然也是逆序,看起来 cic_ici 颜色的取值和 ckc_kck 有关系,但其实此时可以当做 kkk 还没有确定,kkk 对 iii 的影响,可以在枚举 kkk 的时候,当做 iii 对 kkk 的影响。
- 通过这样的转化,就避免了枚举每一条边,而是变成了在 [1,pos[i]−1][1,pos[i]-1][1,pos[i]−1] 范围内查询最大值,此时拿线段树维护区间最大值就好了。
小结
- 从大到小枚举,每次都找左边的最大值来更新 i 。把影响从左往右进行了传递,也就是说 i 不用去找在 i 左边与 i 相连的所有边的影响,而是找一个最优的值,用它来更新 i 。也就是只取一条最优的边来更新。
- 边数看着很多,但其实有序枚举之后,只需要在前面确定的值中,选择最优的值,通过一条边来更新当前值即可。
#include <bits/stdc++.h>
#define ls (rt<<1)
#define rs (rt<<1|1)
#define ll long long
using namespace std;
const int maxn=1e6+5;
int t,n;
int a[maxn],pos[maxn],c[maxn];
int st[maxn<<2];void build(int rt,int L,int R)
{st[rt]=0;if(L==R) return;int mid=(L+R)>>1;build(ls,L,mid);build(rs,mid+1,R);
}
void update(int rt,int p,int L,int R,int val)
{if(L==R){st[rt]=val;return;}int mid=(L+R)>>1;if(p<=mid) update(ls,p,L,mid,val);else update(rs,p,mid+1,R,val);st[rt]=max(st[ls],st[rs]);
}
int query(int rt,int l,int r,int L,int R)
{if(l>r) return 0;if(l<=L&&R<=r) return st[rt];int mid=(L+R)>>1;int ans=0;if(l<=mid) ans=max(ans,query(ls,l,r,L,mid));if(r>mid) ans=max(ans,query(rs,l,r,mid+1,R));return ans;
}
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=1; i<=n; ++i) scanf("%d",&a[i]),pos[a[i]]=i;build(1,1,n);for(int i=n; i>=1; --i){int p=pos[i];c[p]=query(1,1,p-1,1,n)+1;update(1,p,1,n,c[p]);}int ans=*max_element(c+1,c+1+n);printf("%d\n",ans);for(int i=1; i<=n; ++i) printf("%d%c",c[i],i==n?'\n':' ');}return 0;
}
L. Simone and graph coloring相关推荐
- 线段树维护区间最大值+第 45 届(ICPC)亚洲区域赛(昆明)L题Simone and Graph Coloring
题意: 给你n个数的序列,当满足i<ji<ji<j andandand ai>aja_i>a_jai>aj时,这两个点之间有一条边,现在对点染色,要求每个点相邻 ...
- 【第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛】Simone and Graph Coloring
#include <bits/stdc++.h> using namespace std; const int maxn = 1000005, INF = 0x7f7f7f7f; int ...
- C++图形着色graph coloring算法(附完整源码)
图形着色graph coloring算法 图形着色graph coloring算法的完整源码(定义,实现,main函数测试) 图形着色graph coloring算法的完整源码(定义,实现,main函 ...
- 夯实基础项目工程之图论——Uncle Bogdan and Country Happiness,Graph Coloring,How Many Paths?,Array Differentiation
文章目录 做题情况项目报告 Uncle Bogdan and Country Happiness Graph Coloring How Many Paths? Array Differentiatio ...
- [CF1499G]Graph Coloring
Graph Coloring 题解 一个晚上又没了... 我们考虑什么情况下 ∑ v ∈ V ∣ r ( v ) − b ( v ) ∣ \sum_{v\in V}\left|r(v)-b(v)\ri ...
- CodeForces - 1354E Graph Coloring(dfs判断二分图+dp)
题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的无向图,要求给 n 个点赋值为 1 . 2 或 3 ,需要满足以下条件: 每个点都需要被赋值 权值为 1 的点共 n1 个 权值为 ...
- Graph Coloring I
来源:牛客网: 题目描述 修修在黑板上画了一些无向连通图,他发现他可以将这些图的结点用两种颜色染色,满足相邻点不同色. 澜澜不服气,在黑板上画了一个三个点的完全图.修修跟澜澜说,这个图我能找到一个简单 ...
- poj1419 Graph Coloring 最大独立集(最大团)
最大独立集: 顶点集V中取 K个顶点,其两两间无连接. 最大团: 顶点集V中取 K个顶点,其两两间有边连接. 最大独立集=补图的最大团 最大团=补图的最大独立集 #include<iostrea ...
- [BFS]JZOJ 4672 Graph Coloring
Description 现在你有一张无向图包含n个节点m条边.最初,每一条边都是蓝色或者红色.每一次你可以将一个节点连接的所有边变色(从红变蓝,蓝变红). 找到一种步数最小的方案,使得所有边的颜色相同 ...
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明),签到题HIL
H. Hard Calculation 链接:https://ac.nowcoder.com/acm/contest/12548/H 来源:牛客网 题目描述 Hooray! It is the fir ...
最新文章
- 面试题31.连续子数组的最大和
- mysql9索引实战_课程介绍目录索引
- HDU1754_I Hate It(线段树/单点更新)
- version robot
- python的基础命令_Python必学之命令行常用的命令
- 2021年中国以太网测试设备市场趋势报告、技术动态创新及2027年市场预测
- 左移和右移的运算规则_一文读懂JavaScript位的与、或、异或、取反及左移右移操作...
- Java基础知识强化之IO流笔记59:打印流
- Android源码下载repo以及repo init总结
- Python模块——标准库\开源模块\自定义模块
- Linux 基础命令(二)
- 自己动手编写CSDN博客备份工具-blogspider之源码分析(1)
- 如何将JPG转换成PNG格式呢?
- 《植物大战僵尸》游戏存档修改
- win10 RTX30系列显卡 安装tensorflow-gpu 1.15
- 利用火绒黑名单功能屏蔽风险ip地址
- 平稳信号、非平稳信号
- 特性提醒-Qt6录音QIODevice::readAll()返回奇数字节。
- .\output\stm32f103.axf: Error: L6218E: Undefined symbol __aeabi_assert (referred from mqtt.o).
- linux qt地图开发教程,基于QT的电子地图的设计与实现