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 难度跨度有点大啊 可以证明当第一次转向之 ...
随机推荐
- 12-CentOS7安装与管理数据库mariadb
关于Mariadb Mariadb和MySQL是同一个制作团队,命令几乎一样. 在centos中安装 yum -y install mariadb mariadb-server firewall-cm ...
- 实验10.3层vlan互通实验
# 实验10.三层Vlan互通实验 本实验是跨vlan路由的第二种形式,比第一种形式更常见常用一些. 需要用到三层交换机. 实验组 交换机配置 不同于以往,本次的交换机使用了三层交换的功能 SW vl ...
- AGC044C Strange Dance
在2020年A卷省选day2t2有类似操作trie的技巧. 题目链接 显然是建一棵三叉trie树,代表0/1/2 对这棵trie树,我们需要支持子树交换和全局加1 考虑第一个操作怎么做?直接打个懒标记 ...
- THM-Skynet-Writeup
通过学习相关知识点:攻破Linux目标机器并完成提权操作. 部署并渗透目标机器 step1 使用Nmap扫描端口 nmap -p- -sC -sV -T4 -v 10.10.164.81 139/44 ...
- 深度学习pytorch常用操作以及流程
在微信公众号上看到这篇文章,担心以后想找的时候迷路,所以记录到了自己的博客上,侵扰致歉,随时联系可删除. 1.基本张量操作 1. 1 创建张量 介绍: torch.tensor() 是 PyTorch ...
- PowerBuilder编程新思维6.5:外传1(PowerPlume的设计与规划)
<第五部分 Otherside 意外的宝藏> 每一颗种子都有发芽的梦想.PowerPlume(孔雀翎)开发交流群:286502392 PowerBuilder编程新思维6.5:外传1 ...
- log4cpp的安装及使用
目录 前言 安装 使用 示例代码 配置文件 编译链接 输出 前言 本文的操作均在ubuntu20.04下进行 安装 本文仅介绍从源码编译安装log4cpp的过程. ①在开始编译前,首先要确保系统中安装 ...
- TypeScript 学习笔记 — 类型推断和类型保护(十一)
目录 类型推断 1.赋值推断 2.返回值推断 3.函数推断(反向推断) 4.属性推断 5.类型反推 6.索引访问操作符 7.类型映射 类型保护 1.typeof 类型保护 2.instanceof 类 ...
- tensorflow学习率指数衰减ExponentialDecay的参数介绍与使用方法
本文介绍在tensorflow库中,用于动态调整神经网络的学习率的一种方法--指数衰减ExponentialDecay()策略的参数含义及其具体用法. 在进行神经网络训练时,我们经常需要用到动 ...
- Masked Popcount 题解
背景 罚了一发,太菜了.为什么我终于有时间的时候她要考试? 题意 给你 \(n,m\),问 \(\sum_{i=0}^{n}popcount(i \&m)\). 其中 \(\&\) 代 ...