Atcoder ABC299 E-G
Atcoder ABC299 E-G
E - Nearest Black Vertex
链接:
E - Nearest Black Vertex (atcoder.jp)
简要题意:
问题陈述
给你一个简单连接的无向图,有 \(N\) 个顶点和 \(M\) 条边(简单图不包含自循环和多条边)。
在 \(i = 1, 2, \ldots, M\) 中, \(i\) -th 边双向连接顶点 \(u_ i\) 和顶点 \(v_ i\) 。请判断是否有办法将每个顶点涂成黑色或白色以同时满足以下两个条件,如果存在,请给出一个这样的办法。
- 至少有一个顶点被涂成黑色。
- 对于每个 \(i = 1, 2, \ldots, K\) 都成立:
- 顶点 \(p_ i\) 与涂成黑色的顶点之间的最小距离正好是 \(d_i\) 。
这里,顶点 \(u\) 和顶点 \(v\) 之间的距离是连接 \(u\) 和 \(v\) 的路径中边的最小数量。
思路:
- 先找到每个到\(p_ i\)距离为\(d_i\)的点,我们称之为可行点
- 那非可行点是什么呢,就是到\(p_ i\)短于\(d_i\)的点,这些点需要排除在外
- 然后对于每个\(p_i\)用可行点中挑出不可行点,即是答案
代码:
const int N = 200005;
int n,m;
vector<int> e[N];
int nin[N]; //排除在外的数字,白色数字
vector<int> can[N]; //可能的数字;
map<int,int> hd;// 每个数字对于黑色的最短距离
void solve(){
cin >> n >> m;
for(int i = 1; i <= m;i++){
int u,v;
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
int q;
cin >> q;
for(int i = 1;i<=q;i++){
int u,d;
cin >> u >> d;
hd[u] = d;
}
if(q==0){
cout << "Yes" << endl;
for(int i = 1;i<=n;i++){
cout << 1;
}
return;
}
int vis[n + 1];
for(int i = 1;i<=n;i++){
if(!hd.count(i)){
continue;
}
memset(vis,0,sizeof vis);
int d = hd[i];
if(d==0){
can[i].push_back(i);
continue;
}
queue<pair<int,int>> q;
q.push({i,0});
while(q.size()){
auto p = q.front();q.pop();
int u = p.first,val = p.second;
if(vis[u]) continue;
if(val<d){
nin[u]=1;
}
if(val==d){
can[i].push_back(u);
continue;
}
if(val>d) continue;
vis[u] = 1;
for(auto v:e[u]){
q.push({v,val+1});
}
}
}
int res[n + 1];
memset(res,0,sizeof res);
for(int i = 1;i<=n;i++){
if(!hd.count(i)) continue;
int cnt = 0;
for(auto p:can[i]){
if(!nin[p]){
cnt++;
res[p] = 1;
}
}
if(!cnt){
cout << "No" << endl;
return;
}
}
cout << "Yes" << endl;
for(int i = 1;i<=n;i++){
cout << res[i];
}
}
G - Minimum Permutation
链接:
G - Minimum Permutation (atcoder.jp)
简要题意:
问题陈述
长度为 \(N\) 的序列 \(A\) 由 \(1\) 和 \(M\) 之间的整数组成。其中,从 \(1\) 到 \(M\) 的每个整数都至少在 \(A\) 中出现过一次。
在 \(A\) 的长度为 \(M\) 的子序列中,每个 \(1, \ldots, M\) 都出现过一次,请找出字典序最小的一个。
思路:
- 很明显我们对于一个1至M的数有保留和删除两种操作
- 什么时候不能删除?,在后面数组中没有这个数字了就不能删除
- 这样我们可以建一个表记录每个数字最后出现的位置
- 然后用单调栈保持数组的最小即可
- 注意还要开一个表记录数字是否在栈中
代码:
const int N = 200005;
int last[N],a[N],instk[N];
void solve(){
int n,k;
cin >> n >> k;
for(int i = 1;i<=n;i++){
int t;
cin >>t;
a[i] = t;
last[t] = i;
}
stack<int> st;
for(int i = 1;i<=n;i++){
if(instk[a[i]]) continue;
while(!st.empty() && a[i] < st.top() && last[st.top()] > i){
instk[st.top()]=0;
st.pop();
}
st.push(a[i]);
instk[a[i]]=1;
}
vector<int> res;
while(st.size()){
res.push_back(st.top());st.pop();
}
for(int i = res.size() - 1;i>=0;i--){
cout << res[i] << " ";
}
}
Atcoder ABC299 E-G的更多相关文章
- Storyboards Tutorial 03
这一节主要介绍segues,static table view cells 和 Add Player screen 以及 a game picker screen. Introducing Segue ...
- 文件图标SVG
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink ...
- AtCoder - 4496 G - k-DMC
AtCoder - 4496 G - k-DMC 题目 长度为n的字符串,q次查询,问"DMC"(不要求连续)在字符串中出现的次数,其中D和M的距离不超过k. 错误思路 通过遍历字 ...
- AtCoder Beginner Contest 260 G // imos(累积和算法)
题目传送门:G - Scalene Triangle Area (atcoder.jp) 题意: 给定大小为N*N的OX矩阵,若矩阵的(s,t)处为O,其覆盖范围为:满足以下条件的所有位置(i,j) ...
- AtCoder Beginner Contest 220部分题(G,H)题解
刚开始的时候被E题卡住了,不过发现是个数学题后就开始使劲推式子,幸运的是推出来了,之后的F题更是树形DP换根的模板吧,就草草的过了,看了一眼G,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完 ...
- [题解] Atcoder Beginner Contest ABC 270 G Ex 题解
点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...
- AtCoder Beginner Contest 282 G - Similar Permutation
套路题 题意 求有多少个 \(1\) 到 \(n\) 的排列满足恰有 \(k\) 对在排列中相邻的数满足前小于后 \(2 \leq n \leq 500, 0 \leq k \leq (n - 1)\ ...
- AtCoder Beginner Contest 272 - G - Yet Another mod M
随机 + 数论 题意 Submission #35524126 - AtCoder Beginner Contest 272 给一个长度为 \(n\;(1<=n<=5000)\) 的数组 ...
- Atcoder CODE FESTIVAL 2016 Final G - Zigzag MST[最小生成树]
题意:$n$个点,$q$次建边,每次建边选定$x,y$,权值$c$,然后接着$(y,x+1,c+1),(x+1,y+1,c+2),(y+1,x+2,c+3),(x+2,y+2,c+4)\dots$(画 ...
- AtCoder Grand Contest 030题解
第一次套刷AtCoder 体验良好 传送门 Poisonous Cookies cout<<b+min(c,a+b+); Tree Burning 难度跨度有点大啊 可以证明当第一次转向之 ...
随机推荐
- 为什么Python的多线程是假的呢?
https://www.zhihu.com/question/23474039/answer/269526476
- 一文搞懂到底什么是 AQS
前言 日常开发中,我们经常使用锁或者其他同步器来控制并发,那么它们的基础框架是什么呢?如何实现的同步功能呢?本文将详细讲解构建锁和同步器的基础框架--AQS,并根据源码分析其原理. 一.什么是 AQS ...
- GUI自动化测试策略
标签(空格分隔): GUI自动化策略 带你看看实际的大型全球化电商网站的 GUI 自动化测试如何开展.这场实战,我将从以下两个方面展开 试策略如何设计?这一点,我会根据亲身经历的实际项目,和你探讨 G ...
- 在Docker中搭建rabbit MQ集群 (Mac + OrbStack)
我以为用docker搭建一个rabbitMq集群会非常简单,但是结果却出乎意料,我花了差不多两个半天才搞定.这还是依赖了AI的协助,否则难度不敢想象. 我的环境是Mac上的OrbStack.用了Kim ...
- debian12 笔记
前言 最近在win10通过wsl安装了debian linux子系统(wsl2安装报错了..所以改成了wsl),没想到安装的还是最新的debian12 (Bookworm).的确和ubuntu有些不一 ...
- PixiJS源码分析系列: 第一章 从最简单的例子入手
从最简单的例子入手分析 PixiJS 源码 我一般是以使用角度作为切入点查看分析源码,例子中用到什么类,什么方法,再入源码. 高屋建瓴的角度咱也做不到啊,毕竟水平有限 pixijs 的源码之前折腾了半 ...
- 解决方案 | AutoCAD 版本+版本号+受支持的 .NET SDK版本+.NET Framework版本
关于 Managed .NET 兼容性 Managed .NET 应用程序通常与扩展基于 AutoCAD 的产品的行为和功能的公司和第三方应用程序关联. 在移植到最新版本后,并非所有 .NET 应用程 ...
- 集群及分布式定时任务中间件MEE_TIMED
集群及分布式定时任务中间件MEE_TIMED 转载请著名出处:https://www.cnblogs.com/funnyzpc/p/18312521 MEE_TIMED一套开源的定时任务中间件,MEE ...
- Web 开发技术栈
Web 开发技术栈 Web 是什么? 简单地说,网络是一个遍布全球的网络,它连接大量设备并允许它们相互通信 Internet 上的网站托管在称为服务器的设备上,当与 Internet 上的网页交互时, ...
- 垃圾回收器比较:CMS 和 G1
前言 在查看系统内存监控的过程中,发现有几台机器的内存使用率一直很高,而且是呈现一个不太正常的高度,初始以为是 GC 不完全,也就是 JVM 内有大量对象不能回收,于是采用 Arthas 诊断查看一下 ...