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. 在WPF UWP WinUI中相同功能的用法的区别

    文件选择器 WPF:OpenFileDialog Microsoft.Win32.OpenFileDialog openFileDialog = new(); bool? result = openF ...

  2. python重拾第八天-Socket网络编程

    本节内容 Socket介绍 Socket参数介绍 基本Socket实例 Socket实现多连接处理 通过Socket实现简单SSH 通过Socket实现文件传送 作业:开发一个支持多用户在线的FTP程 ...

  3. Linux 内核:initcall机制与module_init

    Linux 内核:initcall机制与module_init 背景 在做分享的时候,被资深的同事问起关于驱动加载时机与probe的问题.发现自己并不熟悉,因此学习了解一下. 学习本文你就可以知道,内 ...

  4. 3568F-Docker容器部署方法说明

                 

  5. OpenStack 下 CentOS6.X 镜像网络初始化失败问题排查

    问题表现 在我的 OpenStack 集群上迁移了一批老旧的镜像(从其他三方云平台过来的)发现这批镜像在使用 ConfigDrive 的方式注入配置初始化时无法对非首张网卡镜像初始化(后经过测试非 C ...

  6. 洛谷P6397

    [COI2008] GLASNICI 题意描述 输入 3.000 2 0.000 6.000 输出 1.500 点拨 二分答案的题一般来说可以用答案去检验假设. 对于这道题,每一个信使的最佳走法是保证 ...

  7. 第二部分:关键技术领域的开源实践【内网穿透FRP】

    FRP简介 FRP(Fast Reverse Proxy)作为一种高性能的内网穿透工具,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内网服务以安全.便捷的方式通过具有公网IP节点(云 ...

  8. KubeCube 新增版本转换:K8s 尝鲜再也不用担心影响老版本了

    多租户可视化 K8s 管理平台KubeCube近日迎来了新版本的发布,新版本增加了 K8s 版本转化.HNC GA 版本适配.审计信息国际化.warden 主动上报模式,为集群和项目设置 Ingres ...

  9. CF916C 题解

    CF916C 题解 思路 思考发现,如果我们让很多边的边权变得非常大,而故意留下 \(1\) 到 \(n\) 的某一条路径,使整条路径之和甚至还没有剩下一条边的权值大,这条路径显然就是最短路了. 更重 ...

  10. nacos:关于注册服务与配置管理

    为什么要用nacos做配置中心? 1.nacos可以做到统一管理,而且在修改时可以做到动态管理,无需重启即可生效. 2.nacos通过namespace进行环境隔离, 约定: namespace:用于 ...