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的更多相关文章

  1. Storyboards Tutorial 03

    这一节主要介绍segues,static table view cells 和 Add Player screen 以及 a game picker screen. Introducing Segue ...

  2. 文件图标SVG

    ​<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink ...

  3. AtCoder - 4496 G - k-DMC

    AtCoder - 4496 G - k-DMC 题目 长度为n的字符串,q次查询,问"DMC"(不要求连续)在字符串中出现的次数,其中D和M的距离不超过k. 错误思路 通过遍历字 ...

  4. AtCoder Beginner Contest 260 G // imos(累积和算法)

    题目传送门:G - Scalene Triangle Area (atcoder.jp) 题意: 给定大小为N*N的OX矩阵,若矩阵的(s,t)处为O,其覆盖范围为:满足以下条件的所有位置(i,j) ...

  5. AtCoder Beginner Contest 220部分题(G,H)题解

    刚开始的时候被E题卡住了,不过发现是个数学题后就开始使劲推式子,幸运的是推出来了,之后的F题更是树形DP换根的模板吧,就草草的过了,看了一眼G,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完 ...

  6. [题解] Atcoder Beginner Contest ABC 270 G Ex 题解

    点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...

  7. AtCoder Beginner Contest 282 G - Similar Permutation

    套路题 题意 求有多少个 \(1\) 到 \(n\) 的排列满足恰有 \(k\) 对在排列中相邻的数满足前小于后 \(2 \leq n \leq 500, 0 \leq k \leq (n - 1)\ ...

  8. AtCoder Beginner Contest 272 - G - Yet Another mod M

    随机 + 数论 题意 Submission #35524126 - AtCoder Beginner Contest 272 给一个长度为 \(n\;(1<=n<=5000)\) 的数组 ...

  9. 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$(画 ...

  10. AtCoder Grand Contest 030题解

    第一次套刷AtCoder 体验良好 传送门 Poisonous Cookies cout<<b+min(c,a+b+); Tree Burning 难度跨度有点大啊 可以证明当第一次转向之 ...

随机推荐

  1. JS神奇的或0(|0)

    按照常识,位运算x|0,要么等于x,要么等于0 那么在JS的世界你的认知就要被颠覆了 下面请看 不带或0运算: (window.crypto.getRandomValues(new Uint32Arr ...

  2. CLR via C# 笔记 -- 线程基础(26)

    1. Microsoft 设计这个OS内核时,决定在一个进程中运行应用程序的每个实例.进程实际是应用程序的实例要使用的资源的集合.每个进程都被赋予了一个虚拟地址空间,确保在一个进程中使用的代码和数据无 ...

  3. Nuxt3 的生命周期和钩子函数(十一)

    title: Nuxt3 的生命周期和钩子函数(十一) date: 2024/7/5 updated: 2024/7/5 author: cmdragon excerpt: 摘要:本文详细介绍了Nux ...

  4. 从Java开发者到.NET Core初级工程师学习路线:C#语言基础

    1. C#语言基础 1.1 C#语法概览 欢迎来到C#的世界!对于刚从Java转过来的开发者来说,你会发现C#和Java有很多相似之处,但C#也有其独特的魅力和强大之处.让我们一起来探索C#的基本语法 ...

  5. Curve 替换 Ceph 在网易云音乐的实践

    Curve 块存储已在生产环境上线使用近三年,经受住了各种异常和极端场景的考验,性能和稳定性均超出核心业务需求预期 网易云音乐背景 网易云音乐是中国领先的在线音乐平台之一,为音乐爱好者提供互动的内容社 ...

  6. .NET周刊【7月第2期 2024-07-14】

    国内文章 开源GTKSystem.Windows.Forms框架让C# winform支持跨平台运行 https://www.cnblogs.com/easywebfactory/p/18289178 ...

  7. [oeasy]教您玩转python - 0003 - 编写 py 文件

    ​ 编写 py 文件 回忆上次内容 次在解释器里玩耍 了解到字符串就是给一堆字符两边加引号 可以是单引号 也可以是双引号 这样游乐场就知道 这个不是一个名字 而是一个字符串 字符串可以用print函数 ...

  8. Python 实现行为驱动开发 (BDD) 自动化测试详解

    ​ 在当今的软件开发领域,行为驱动开发(Behavior Driven Development,BDD)作为一种新兴的测试方法,逐渐受到越来越多开发者的关注和青睐.Python作为一门功能强大且易于使 ...

  9. android常用布局基础学习

    总结:可水平放置可垂直放置也可穿插使用,默认为水平 <!--我在第一次使用权重的时候忽视了本线性布局中的宽度与高度,如果要使用权重,请将线性布局的最初大小设置为match_parent,否则不会 ...

  10. vue 路由缓存 keep-alive include和exclude无效

    <keep-alive :include="keepAliveData"> <router-view v-if="isShowRouter" ...