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. Windows无法调节亮度

    原因1:驱动问题 解决方式: 安装360驱动大师,一键安装. 也可以使用其他软件:如驱动精灵. 推荐使用电脑品牌本身的驱动软件:如联想:联想驱动管理 原因2:设备管理问题 解决方式: 计算机 -> ...

  2. mysql在把子查询结果作为删除表中数据的条件,mysql不允许在子查询的同时删除原表数据

    在上一文中发布了多表删除指定记录,发现达不到我想要的效果,找了很多资料,发现以下方法. 数据库不能边查询边删除, 尝试以下操作 delete from push_msg_overview where ...

  3. STM32的内存管理(转)

    背景 这里针对STM32F407芯片+1M外部内存的内存管理!(全篇是个人愚见,如果错误,请不吝指出!) 定义 首先,定义3个内存池,分别是内部SRAM,外表SRAM和CCM:通过指定内存中的绝对地址 ...

  4. 【Autoware】Autoware安装教程

    此篇主要是从自己的csdn copy 在博客园上备份一下哈~ 前提:大家需要换源[软件源和pip源]:git clone的时候走博主给的Gitee的链接吧 不然得等个十万年... 如果想看最终是啥样的 ...

  5. Python性能测试框架:Locust实战教程

    01认识Locust Locust是一个比较容易上手的分布式用户负载测试工具.它旨在对网站(或其他系统)进行负载测试,并确定系统可以处理多少个并发用户,Locust 在英文中是 蝗虫 的意思:作者的想 ...

  6. 量子算法抛转(以及Oracle函数初步)

    接下来要接触量子算法了,我们会看到怎么利用量子并行机制和干涉原理.干涉在算法对结果进行测量求值时举足轻重. Deutsch-Jozsa 算法 DJ算法是量子算法的入门算法,就像编程界的"He ...

  7. win10 VMware 关闭虚拟机失败导致再打开时显示连接不上虚拟机的一种解决方法

    VMware关闭虚拟机失败,强行关闭后,再次打开VMware,打开虚拟机时提示连接不上虚拟机,没有访问权限. 先试了退出后,用管理员权限打开,无果. 然后从网上查资料,cmd->services ...

  8. 谈谈你对MVVM开发模式和MVT的理解?

    MVVM分为Model.View.ViewModel三者. Model 代表数据模型,数据和业务逻辑都在Model层中定义: View 代表UI视图,负责数据的展示: ViewModel 负责监听 M ...

  9. SpringBoot获取指定Resource下的文件内容

    加入依赖 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</a ...

  10. Java-文件下载案例

    文件下载需求 1.页面显示超链接 2.点击超链接后弹出下载框 3.完成图片文件下载 分析 1.超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框.不满足需求 2.任 ...