Police Stations CodeForces - 796D (bfs)】的更多相关文章

大意: 给定树, 有k个黑点, 初始满足条件:所有点到最近黑点距离不超过d, 求最多删除多少条边后, 使得原图仍满足条件. 所有黑点开始bfs, 贪心删边. #include <iostream> #include <algorithm> #include <math.h> #include <cstdio> #include <set> #include <map> #include <string> #include…
96D - Police Stations 思路:bfs,从所有的警察局开始bfs,因为bfs的深度一样,而且题目给的树保证满足条件,所以不用考虑深度. 如果搜索到一个点a,他的下一个点b已经被搜索过了,而且a到b这条路没有被走过,那么这条路可以被砍掉. 不能用dfs,这样可能导致某些点搜索不到,反例读者自己找. 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back…
地址:http://codeforces.com/contest/796/problem/D 题目: D. Police Stations time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Inzane finally found Zane with a lot of money to spare, so they togeth…
Inzane finally found Zane with a lot of money to spare, so they together decided to establish a country of their own. Ruling a country is not an easy job. Thieves and terrorists are always ready to ruin the country's peace. To fight back, Zane and In…
思路:删除尽量多的边使得所有点都能在限制距离之内到达一个警局,删除边会形成多棵子树,最多只能k棵.其实就是以每个警局为根结点,把整棵树划分为以警局为根结点的k棵树,说明要删除的边的数量就是k-1条,即删除的边的条数是一定的.剩下就是为每个节点找根结点,考虑从所有警局出发得到到每个点的最短距离,则当前节点u,一定是从u->v,如果d[v] <= lim则这条边一定会保留. AC代码 #include <cstdio> #include <cmath> #include &…
[题目链接]:http://codeforces.com/contest/796/problem/D [题意] 在一棵树上,保证每个点在距离d之内都有一个警察局; 让你删掉最多的边,使得剩下的森林仍然满足上述约束; [题解] 从每个警察局开始进行bfs; 这样每个路线第一次到达的点肯定是最短路; 所以bfs的时候遇到没访问过的点,就记录它被访问,即它被这个状态一开始的警察局所管辖(控制); 则可以想象每个警察局都同时往外扩张; 则每个警察局管的范围就确定是那些了; 则那些点肯定是到那个管辖它的警…
传送门 题意 n个点有n-1条边相连,其中有k个特殊点,要求: 删去尽可能多的边使得剩余的点距特殊点的距离不超过d 输出删去的边数和index 分析 比赛的时候想不清楚,看了别人的题解 一道将1个联通块转化为k个树的题目,考虑上界,应该是k-1条边,这k-1条边是原图中连接树与树的边,那么我们操作如下: 1.将特殊点i染色为i,放入队列 2.做一次bfs,对每个点相邻的点染色并判断 3.遍历边,如果边的两点不同色,则输出边的index trick 代码 #include <cstdio> #i…
题意:给定一棵树,树上有一些点是警察局,要求所有点到最近的警察局的距离不大于 $d$,求最多能删几条边 ? 题解: 考虑什么时候一条边可以被断开:这条边的两个端点被两个不同的警察局覆盖掉. 我们要设计一种染色方案,使得整棵树都被覆盖,且每个警察局覆盖的范围尽量小. 那么,我们可以使用 $BFS$ 算法,拓展到不超过 $d$ 的距离,然后染色就. 最后看一下哪些边的端点颜色不同即可. #include <bits/stdc++.h> #define N 300006 #define setIO(…
题目链接: http://codeforces.com/problemset/problem/796/D 题意: 给出一颗 n 个节点树, 树枝连接的两个定点距离为 1, 树中有 k 个特殊点, 问最多可以删除哪些树枝, 使得树中其他顶点到特殊点的最小距离不大于 d. 注意: 题目说明了一定有解. 思路: bfs 可以直接 bfs 求其他点到特殊点的最短距离, 因为题目说明给出的数据都是有解的, 即所有顶点到特殊点的距离都是不大于 d 的. 那么搜完所有顶点后剩余的边就是不必要的.  即答案中的…
大意: 给定格点图, 每个'.'的连通块会扩散为矩形, 求最后图案. 一开始想得是直接并查集合并然后差分, 但实际上是不对的, 这个数据就可以hack掉. 3 3 **. .** ... 正解是bfs, 一个点被扩散当且仅当它所在的某个2*2块中只有它为'*'. #include <iostream> #include <iostream> #include <algorithm> #include <cstdio> #include <math.h&…
沙茶bfs打了2小时... queue入队量太大了, 放函数里直接T了, 改成全局46ms #include <iostream> #include <algorithm> #include <cstdio> #include <math.h> #include <set> #include <map> #include <queue> #include <string> #include <string…
链接 大意: n*n棋盘, 每个格子写有数字, 各不相同, 范围[1,n*n], 初始在数字1的位置, 可以操纵knight,bishop,rook三种棋子, 每走一步花费1, 交换棋子花费1, 问按顺序遍历完[1,n*n]的最少花费和最少花费下的最少交换次数 这题码了1个小时, WA on test 86, 没看出来是哪里错了, 不想改了 设状态(z,x,y)表示到达点(x,y)时棋子为z的最少花费, 每次BFS求出最短路, 再DP两次求出最少花费 #include <iostream> #…
链接 大意:给定无向图边权均为1, 每个节点有一种货物, 对于每个节点, 求出拿到$s$种不同货物的最短距离 (每种货物独立计算,并且不用返回) 因为$s$较小, 直接枚举每种货物即可 所以问题就转化为无向图中标记了一个点集, 对于每个点, 求它到这个点集的最短距离 这跟昨天做的980E比较像, 不过980E是树上的情况, 并且是动态添点的 但该题点集是固定不变的, 直接把所有点扔进队列里BFS就行了 复杂度$O((n+m)k)$ #include <iostream> #include &l…
大意:给定无向图, 求补图的连通块数 bfs模拟即可, 这里用了map存图, set维护未划分的点集, 复杂度$O(nlog^2n)$, 用链表的话可以$O(n)$ #include <iostream> #include <algorithm> #include <cstdio> #include <set> #include <map> #include <queue> #define REP(i,a,n) for(int i=a…
题意:给出一个六面体分为k层,每层n行m列,每个小立方体有'.'(空)与'#'(障碍)的状态,第一层某个空的位置有一个水龙头,水流每次往六个方向流动(...).最少时间水流能把立方体空的部分填满. 思路:从水龙头开始bfs一遍.每步让所有能转移到的空的点入队,总步数即为答案. #include<cstdio> #include<queue> #include<iostream> using namespace std; struct Nod { int x; int y…
大意: 给定$n$张卡$(a_i,b_i,c_i,d_i)$, 初始坐标$(0,0)$. 假设当前在$(x,y)$, 若$x\ge a_i,y\ge b_i$, 则可以使用第$i$张卡, 使用后达到坐标$c_i,d_i$. 求最少使用多少张卡后才能使用最后一张卡. 直接$BFS$的话是$O(n^2)$的, 用数据结构优化即可. #include <iostream> #include <algorithm> #include <cstdio> #include <…
题面 传送门 分析 考虑BFS while(棋盘没有满){ for 玩家 p{ 对p进行BFS,走s[p]步 } } 对于每个玩家p BFS的时候如果到了格子(x,y),就把\(vis[x][y]\)标记为p 最后把vis扫一遍就统计出了每个玩家占领的个数 每次BFS时要把最外层的节点存下来,下一次BFS时直接从那些节点开始搜索 具体实现中对每个玩家维护两个队列q1,q2,队列中的每个元素(x,y,t)表示当前时间为t,位置(x,y) 初始化时向q2插入起点 function expand(p)…
不能一个一个bfs,要一起bfs #include<iostream> #include<vector> #include<cstdio> #include<queue> #include<cstring> #define maxn 300100 using namespace std; vector<int>G[maxn]; void insert(int be, int en) { G[be].push_back(en); } i…
大意: 有向图, 求找4个不同的点ABCD, 使得d(A,B)+d(D,C)+d(C,A)最大…
虽然说好像这题有其他做法,但是在问题转化之后,使用CDQ分治是显而易见的 并且如果CDQ打的熟练的话,码量也不算大,打的也很快,思维难度也很小 没学过CDQ分治的话,可以去看看我的另一篇博客,是CDQ分治的入门教程 下面是正文: 首先整理一下条件: 每个点有三个属性,x,r,f 统计有多少对点i,j满足 min(ri,rj) >= |xi-xj| 且 |fi-fj| <= k,这样的点对被称作是“坏的” 对r值取min是个烦人的条件,于是我们把点按照r值从大到小排序,按照r值从大到小的顺序依次…
大意: 给定$n$个三元组$(x,r,f)$, 求所有对$(i,j)$, 满足$i<j, |f_i-f_j|\le k, min(r_i,r_j)\ge |x_i-x_j|$ 按$r$降序排, 去掉$min$, 然后就是个裸的三维数点问题, 可以用$CDQ$分治解决. #include <iostream> #include <sstream> #include <algorithm> #include <cstdio> #include <ma…
决定在 codeforces 练题啦,决定每个比赛刷前四道...太难就算了 796A Buying A House 题意:给出x轴上的n 个点,每个点有个权值,问离m 点最近的权值小于等于k 的点离m的距离.单位是10. 思路:大水题.用l.r分别向左向右找即可. 代码: #include<stdio.h> int main(){ int n, m, k; ]; while(~scanf("%d%d%d", &n, &m, &k)){ ; i<…
Bank Hacking 阅读题,读完之后手算一下可以发现每一个bank被hack所需要的strength无非分为三种情况. 1. $a_i$,当且仅当i为第一个选择的点. 2. $a_i+1$,当且仅当i是第一个选择的点的neighborhood. 3. $a_i+2$,其他所有点. 这样,分类讨论即可. http://codeforces.com/contest/796/submission/26318700 Police Stations 猜想题,可以注意到因为给定的图是树,那么每删除一条…
C. Bank Hacking 题目大意:给出一棵n个节点的树,每个节点有一个权值,删掉一个点的代价为当前这个点的权值,并且会使其相邻点和距离为2且中间隔着未被删除的点的点权值加1,现在选一个点开始删,之后每次能删掉被删过的点的相邻点,问删掉整棵树,删各节点花费的最大值最小是多少.(n<=300,000) 思路:确定第一个删的点之后,与这个点相邻的点的删除花费是原权值加1,其他点是原权值加2,把所有点权加2后枚举一个点减2再把相邻的减1,线段树统计答案后改回去,总复杂度O(nlogn),O(n)…
A - Buying A House 题意:给你n个房间,妹子住在第m个房间,你有k块钱,你想买一个离妹子最近的房间.其中相邻的房间之间距离为10,a[i]=0表示已经被别人买了. 题解:扫一遍更新答案即可. #include<bits/stdc++.h> using namespace std; const int maxn = 105; int mp[maxn]; int n,m,k; int main(){ scanf("%d%d%d",&n,&m,&…
Description Inzane finally found Zane with a lot of money to spare, so they together decided to establish a country of their own. Ruling a country is not an easy job. Thieves and terrorists are always ready to ruin the country's peace. To fight back,…
Police Cities Time Limit: 10 Seconds      Memory Limit: 32768 KB Once upon the time there lived a king and he had a big kingdom. And there were n cities in his kingdom and some of them were connected by the roads. And the roads were all one-way becau…
Codeforces 1528D It's a bird! No, it's a plane! No, it's AaParsa!(*2500) 考虑以每个点为源点跑一遍最短路,每次取出当前距离最小的点然后更新一圈周围的点,具体更新方法是:设 \(p\) 为当前这一轮我们取出的点,那么显然对于一条本来由 \(p\to q\),权值为 \(c\) 的边以及另一个点 \(r\),有 \(d_r\leftarrow\min(d_r,c+d_p+(r-q+d_p)\bmod n)\),直接松弛单次复杂度…
ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syria, Lattakia, Tishreen University, April, 30, 2018 Problem A. Can Shahhoud Solve it? Problem B. Defeat the Monsters Problem C. UCL Game Night Problem…
$$2017-2018\ ACM-ICPC,\ Asia\ Daejeon\ Regional\ Contest$$ \(A.Broadcast\ Stations\) \(B.Connect3\) BFS+哈希判重,哈希就用一个16位的三进制数表示即可 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<bits/stdc++.h> using namespace std; function…