【AtCoder】【思维】【图论】Splatter Painting(AGC012)
题意:
有一个含有n个点的无向图,所有的点最初颜色均为0。有q次操作,每次操作将v[i]周围的距离小于等于d[i]的点全部都染成颜色c[i]。最后输出每个点的最终的颜色。
数据范围:
1<=n,m,q<=10^5
0<=d[i]<=10
1<=c[i]<=10^5
思路:
看见1<=d[i]<=10,这个条件,第一反应当然是暴力啦。但是如果从一个点总是能够访问所有的节点,那么这就变成O(n^2)了。那么我们应当考虑时间复杂度更加稳定的算法。
然后开始考虑如何优化。倒着扫操作是很容易想到的。然后可以对于每一个点维护一个对于当前已经扫完的操作的最大值。假如说当前在点v,然后当前的d为d[i],假如说d[i]<=maxd[v],那么就说明在后面的操作中将当前这一次操作所产生的效果抵消了。于是就可以直接返回了。
经过上述的优化之后,我们发现能够进入一个点并成功进行拓展的条件是d[i]>maxd[v],那么因为1<=d[i]<=10,所以说就算d[i]从1~10依次排列,也只会对于v点访问最多10次。这样子时间复杂度就变为了稳定的O(10*n+m),从而稳当了不少。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 100000
using namespace std;
struct node
{
int to;
node *nxt;
}edges[MAXN*2+5];
node *ncnt=&edges[0],*Adj[MAXN+5];
int n,m,q,col[MAXN+5],maxd[MAXN+5];
int V[MAXN+5],D[MAXN+5],C[MAXN+5];
void Init()
{
memset(maxd,-1,sizeof(maxd));
}
void AddEdge(int u,int v)
{
node *p=++ncnt;
p->to=v;
p->nxt=Adj[u];
Adj[u]=p;
node *q=++ncnt;
q->to=u;
q->nxt=Adj[v];
Adj[v]=q;
}
void DFS(int u,int d,int c)
{
if(col[u]==0)//没有赋过值才赋值
col[u]=c;
if(maxd[u]>=d)//判断当前操作是否被后面的操作覆盖了
return;
if(d==0)//到达能够赋值的边界了
return;
maxd[u]=d;
for(node *p=Adj[u];p!=NULL;p=p->nxt)
{
int v=p->to;
DFS(v,d-1,c);//d--,继续赋值
}
}
int main()
{
Init();
scanf("%d %d",&n,&m);
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d %d",&u,&v);
AddEdge(u,v);
}
scanf("%d",&q);
for(int i=1;i<=q;i++)
scanf("%d %d %d",&V[i],&D[i],&C[i]);
for(int i=q;i>=1;i--)//倒着处理
DFS(V[i],D[i],C[i]);
for(int i=1;i<=n;i++)
printf("%d\n",col[i]);
return 0;
}
【AtCoder】【思维】【图论】Splatter Painting(AGC012)的更多相关文章
- AtCoder Grand Round 012B Splatter Painting
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- AtCoder Grand Contest 012 B - Splatter Painting(dp)
Time limit : 2sec / Memory limit : 256MB Score : 700 points Problem Statement Squid loves painting v ...
- AtCoder Grand Contest 012 B Splatter Painting (反向处理 + 记忆化)
题目链接 agc012 Problem B 题意 给定一个$n$个点$m$条边的无向图,现在有$q$个操作.对距离$v$不超过$d$的所有点染色,颜色编号为$c$. 求每个点最后的颜色状态. 倒过 ...
- AtCoder Grand Contest 012 B Splatter Painting(记忆化搜索)
题意: 给一个包含N个顶点,M条边,无自环和重边的简单无向图,初始每个点颜色都为0,每条边的长度为1,连接着ai,bi两个节点.经过若干个操作, 每次将与某个点vi距离不超过di的所有点染成某种颜色c ...
- 计蒜客 17417 Highest Tower(思维+图论)
题解: 实际上一个可行解即选取长和宽的一个,使得最后每一组选第一维的数值都不同 在此基础上,使得另一维的和最大. 然后建立图论模型 对于每一个方块,在a和b之间连边. 对于选择的方案,如果选择a-&g ...
- Almost Acyclic Graph CodeForces - 915D (思维,图论)
大意: 给定无向图, 求是否能删除一条边后使图无环 直接枚举边判环复杂度过大, 实际上删除一条边可以看做将该边从一个顶点上拿开, 直接枚举顶点即可 复杂度$O(n(n+m))$ #include &l ...
- Codeforces Gym 101142 C. CodeCoder vs TopForces(思维+图论)
题意: 每个人有两个积分CC和TF 第i个人能战胜第j个人的条件满足下面两个条件中的一个即可 1.CCi > CCj 或 TFi > TFj 2.i能战胜k,k能战胜j. 题解: 先按CC ...
- AGC 012 B - Splatter Painting
题面在这里! (显然首先想到反着做比较简单,每个点取第一次被覆盖到的颜色) 发现d非常小,那么是否可以暴力覆盖呢??? 考虑一个稠密图..暴力肯定就gg了啊... 不过我们可以对每一个点 i 记一个m ...
- 【AtCoder】AGC012
AGC012 A - AtCoder Group Contest 从最后开始间隔着取就行 #include <bits/stdc++.h> #define fi first #define ...
随机推荐
- nginx 返回数据被截断
nignx 代理 buffer proxy_buffers 16 512k; proxy_buffer_size 512k; fastcgi buffer fastcgi_buffers 4 64 ...
- Flink部署-standalone模式
Flink部署-standalone模式 2018年11月30日 00:07:41 Xlucas 阅读数:74 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- postgresql语句
查询oracle数据库所有表数据量 select t.table_name,t.num_rows from user_tables t ORDER BY t.num_rows desc 查询postg ...
- 【Sql Server】SQL SERVER 收缩日志
事务日志记录着在相关数据库上的操作,同时还存储数据库恢复(recovery)的相关信息. 收缩日志的原因有很多种,有些是考虑空间不足,有些则是应用程序限制导致的. 下面介绍的是在简单模式下,进行收缩操 ...
- DirectX11 With Windows SDK--22 立方体映射:静态天空盒的读取与实现
前言 这一章我们主要学习由6个纹理所构成的立方体映射,以及用它来实现一个静态天空盒. 但是在此之前先要消除两个误区: 认为这一章的天空盒就是简单的在一个超大立方体的六个面内部贴上天空盒纹理: 认为天空 ...
- NOI-OJ 2.2 ID:3089 爬楼梯
整体思路 这是一个典型的递归型问题: 临界点:如果只有1级台阶,有1种走法(一次一步):如果有2级台阶,则有2种走法(一次一步或一次两步) 递归方法,对于n级台阶,如果第一次走1步,还剩n-1级台阶, ...
- [物理学与PDEs]第4章第3节 一维反应流体力学方程组 3.3 一维反应流体力学方程组的数学结构
一维理想反应流体力学方程组是一阶拟线性双曲组.
- 有关于 java native方法
看java源码时,经常看到native方法后,就没有具体的是实现了. 以前一直有疑惑,今天查了查,看到前辈们的博文才明白: Java的native方法http://blog.csdn.net/wike ...
- nginx禁止ip登录,只允许域名访问
公司要求,线上solr.kibana要求只能通过域名进行访问,禁止用ip+端口进行登录访问,那么,下面介绍下我是如何实现的 1.禁止ip,允许域名访问 如下图,默认安装好nginx,不让ip方式访问, ...
- ES6走一波 数组的扩展
Array flat 数组实例的扁平化方法(浏览器支持不佳) 建议使用 lodash的 flatten