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] 范围内查询最大值,此时拿线段树维护区间最大值就好了。

小结

  1. 从大到小枚举,每次都找左边的最大值来更新 i 。把影响从左往右进行了传递,也就是说 i 不用去找在 i 左边与 i 相连的所有边的影响,而是找一个最优的值,用它来更新 i 。也就是只取一条最优的边来更新。
  2. 边数看着很多,但其实有序枚举之后,只需要在前面确定的值中,选择最优的值,通过一条边来更新当前值即可。
#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相关推荐

  1. 线段树维护区间最大值+第 45 届(ICPC)亚洲区域赛(昆明)L题Simone and Graph Coloring

    题意: 给你n个数的序列,当满足i<ji<ji<j andandand ai>aja_i>a_jai​>aj​时,这两个点之间有一条边,现在对点染色,要求每个点相邻 ...

  2. 【第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛】Simone and Graph Coloring

    #include <bits/stdc++.h> using namespace std; const int maxn = 1000005, INF = 0x7f7f7f7f; int ...

  3. C++图形着色graph coloring算法(附完整源码)

    图形着色graph coloring算法 图形着色graph coloring算法的完整源码(定义,实现,main函数测试) 图形着色graph coloring算法的完整源码(定义,实现,main函 ...

  4. 夯实基础项目工程之图论——Uncle Bogdan and Country Happiness,Graph Coloring,How Many Paths?,Array Differentiation

    文章目录 做题情况项目报告 Uncle Bogdan and Country Happiness Graph Coloring How Many Paths? Array Differentiatio ...

  5. [CF1499G]Graph Coloring

    Graph Coloring 题解 一个晚上又没了... 我们考虑什么情况下 ∑ v ∈ V ∣ r ( v ) − b ( v ) ∣ \sum_{v\in V}\left|r(v)-b(v)\ri ...

  6. CodeForces - 1354E Graph Coloring(dfs判断二分图+dp)

    题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的无向图,要求给 n 个点赋值为 1 . 2 或 3 ,需要满足以下条件: 每个点都需要被赋值 权值为 1 的点共 n1 个 权值为 ...

  7. Graph Coloring I

    来源:牛客网: 题目描述 修修在黑板上画了一些无向连通图,他发现他可以将这些图的结点用两种颜色染色,满足相邻点不同色. 澜澜不服气,在黑板上画了一个三个点的完全图.修修跟澜澜说,这个图我能找到一个简单 ...

  8. poj1419 Graph Coloring 最大独立集(最大团)

    最大独立集: 顶点集V中取 K个顶点,其两两间无连接. 最大团: 顶点集V中取 K个顶点,其两两间有边连接. 最大独立集=补图的最大团 最大团=补图的最大独立集 #include<iostrea ...

  9. [BFS]JZOJ 4672 Graph Coloring

    Description 现在你有一张无向图包含n个节点m条边.最初,每一条边都是蓝色或者红色.每一次你可以将一个节点连接的所有边变色(从红变蓝,蓝变红). 找到一种步数最小的方案,使得所有边的颜色相同 ...

  10. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明),签到题HIL

    H. Hard Calculation 链接:https://ac.nowcoder.com/acm/contest/12548/H 来源:牛客网 题目描述 Hooray! It is the fir ...

最新文章

  1. 面试题31.连续子数组的最大和
  2. mysql9索引实战_课程介绍目录索引
  3. HDU1754_I Hate It(线段树/单点更新)
  4. version robot
  5. python的基础命令_Python必学之命令行常用的命令
  6. 2021年中国以太网测试设备市场趋势报告、技术动态创新及2027年市场预测
  7. 左移和右移的运算规则_一文读懂JavaScript位的与、或、异或、取反及左移右移操作...
  8. Java基础知识强化之IO流笔记59:打印流
  9. Android源码下载repo以及repo init总结
  10. Python模块——标准库\开源模块\自定义模块
  11. Linux 基础命令(二)
  12. 自己动手编写CSDN博客备份工具-blogspider之源码分析(1)
  13. 如何将JPG转换成PNG格式呢?
  14. 《植物大战僵尸》游戏存档修改
  15. win10 RTX30系列显卡 安装tensorflow-gpu 1.15
  16. 利用火绒黑名单功能屏蔽风险ip地址
  17. 平稳信号、非平稳信号
  18. 特性提醒-Qt6录音QIODevice::readAll()返回奇数字节。
  19. .\output\stm32f103.axf: Error: L6218E: Undefined symbol __aeabi_assert (referred from mqtt.o).
  20. linux qt地图开发教程,基于QT的电子地图的设计与实现

热门文章

  1. android光标Cursor
  2. VS使用NPOI替换word模板中的关键字
  3. 计算机发展的雏形,( )是现代计算机的雏形。
  4. 一种人机友好的视频压缩方案(HMFVC)
  5. July's English
  6. hdu5285-wyh2000 and pupil-(染色法二分图判定)
  7. 网络知识-02 物理层
  8. VC++ MFC实现的优秀的开源项目
  9. google vr 简介
  10. flyaway mysql_mysql 常用命令