题意:

有一个含有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)的更多相关文章

  1. AtCoder Grand Round 012B Splatter Painting

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  2. AtCoder Grand Contest 012 B - Splatter Painting(dp)

    Time limit : 2sec / Memory limit : 256MB Score : 700 points Problem Statement Squid loves painting v ...

  3. AtCoder Grand Contest 012 B Splatter Painting (反向处理 + 记忆化)

    题目链接  agc012 Problem B 题意  给定一个$n$个点$m$条边的无向图,现在有$q$个操作.对距离$v$不超过$d$的所有点染色,颜色编号为$c$. 求每个点最后的颜色状态. 倒过 ...

  4. AtCoder Grand Contest 012 B Splatter Painting(记忆化搜索)

    题意: 给一个包含N个顶点,M条边,无自环和重边的简单无向图,初始每个点颜色都为0,每条边的长度为1,连接着ai,bi两个节点.经过若干个操作, 每次将与某个点vi距离不超过di的所有点染成某种颜色c ...

  5. 计蒜客 17417 Highest Tower(思维+图论)

    题解: 实际上一个可行解即选取长和宽的一个,使得最后每一组选第一维的数值都不同 在此基础上,使得另一维的和最大. 然后建立图论模型 对于每一个方块,在a和b之间连边. 对于选择的方案,如果选择a-&g ...

  6. Almost Acyclic Graph CodeForces - 915D (思维,图论)

    大意: 给定无向图, 求是否能删除一条边后使图无环 直接枚举边判环复杂度过大, 实际上删除一条边可以看做将该边从一个顶点上拿开, 直接枚举顶点即可 复杂度$O(n(n+m))$ #include &l ...

  7. Codeforces Gym 101142 C. CodeCoder vs TopForces(思维+图论)

    题意: 每个人有两个积分CC和TF 第i个人能战胜第j个人的条件满足下面两个条件中的一个即可 1.CCi > CCj 或 TFi > TFj 2.i能战胜k,k能战胜j. 题解: 先按CC ...

  8. AGC 012 B - Splatter Painting

    题面在这里! (显然首先想到反着做比较简单,每个点取第一次被覆盖到的颜色) 发现d非常小,那么是否可以暴力覆盖呢??? 考虑一个稠密图..暴力肯定就gg了啊... 不过我们可以对每一个点 i 记一个m ...

  9. 【AtCoder】AGC012

    AGC012 A - AtCoder Group Contest 从最后开始间隔着取就行 #include <bits/stdc++.h> #define fi first #define ...

随机推荐

  1. Java基础 -- final关键字

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...

  2. Zookeeper与Curator二三事【坑爹】

    起因:我的Dubbo服务起不来:我本地Zookeeper3.4.11,Curator4.1 Caused by: org.apache.zookeeper.KeeperException$Unimpl ...

  3. Java转换流、缓冲流、流操作规律整理

    转换流 1.1                OutputStreamWriter类 OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字 ...

  4. saltstack主机管理项目:今日总结(六)

    一.总目录 二.具体代码 salt #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:luoahong import os,sys if __ ...

  5. C++回顾day03---<异常>

    一:传统错误处理机制(C中通过函数返回来处理) int CalcRes(int n, int m, char ch, int& res) { ; switch (ch) { case '+': ...

  6. IE提示“Internet Explorer已限制此网页运行脚本或ActiveX控件”的解决办法

    在页面html开始标签和head开始标签中间新增一行,添加以下代码: <!-- saved from url=(0014)about:internet --> 或者 直接设置IE浏览器 工 ...

  7. LFYZ-OJ ID: 1024 火车站

    火车过站 问题描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从 ...

  8. HTML(七)HTML 表单(form元素介绍,input元素的常用type类型,input元素的常用属性)

    前言 表单是网页与用户的交互工具,由一个<form>元素作为容器构成,封装其他任何数量的表单控件,还有其他任何<body>元素里可用的标签 表单能够包含<input> ...

  9. maven私库nexus2.11.4迁移升级到nexus3.12.0

    nexus简介 nexus是一个强大的maven仓库管理器,它极大的简化了本地内部仓库的维护和外部仓库的访问. nexus是一套开箱即用的系统不需要数据库,它使用文件系统加Lucene来组织数据 .n ...

  10. struts2简单入门-数据校验

    数据校验流程 校验数据的方式 重写execute方法在内部写校验代码 public class LoginAdminAction extends ActionSupport { private Use ...