「国庆训练」Bomb(HDU-5934)
题意
给定\(n\)个炸弹,每个炸弹的坐标与代价与影响范围给定,炸弹会引爆影响范围内其他所有炸弹。求引爆所有炸弹的最小代价。
分析
先做\(n^2\)的循环,然后建图,对\(i\)能引爆\(j\)建边\((i,j)\)。然后对这个图求强连通分量并缩点,构成新的有向无环的森林。定义每个强连通分量的cost为其中包含的点的最小cost,然后把新森林中所有入度为0的点的cost加起来求和即可(由于无环,所以从任何入度不为0的点往回走,必然终止于一个入度为0的点)。
代码
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
#define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define MS(x,y) memset(x,y,sizeof(x))
#define int ll
using namespace std;
typedef long long ll;
const int MAXN=1005;
vector<int> G[MAXN];
bool mat[MAXN][MAXN];
int n;
int pre[MAXN], lowlink[MAXN], sccno[MAXN], dfs_clock, scc_cnt;
stack<int> stk;
void dfs(int u)
{
pre[u]=lowlink[u] = ++dfs_clock;
stk.push(u);
rep(i,0,n-1)
{
if(!mat[u][i]) continue;
int v=i;
if(!pre[v])
{
dfs(v);
lowlink[u]=min(lowlink[u],lowlink[v]);
}
else if(!sccno[v])
{
lowlink[u]=min(lowlink[u],pre[v]);
}
}
if(lowlink[u]==pre[u])
{
scc_cnt++;
for(;;)
{
int x=stk.top(); stk.pop();
sccno[x]=scc_cnt;
if(x==u) break;
}
}
}
void find_scc()
{
dfs_clock=scc_cnt=0;
ZERO(sccno);
ZERO(pre);
rep(i,0,n-1)
if(!pre[i]) dfs(i);
}
bool nmat[MAXN][MAXN];
vector<pair<int,int> > edges;
vector<int> nG[MAXN];
int ncnt=0;
void add_edges(int u,int v)
{
edges.PB(MP(u,v));
nG[u].PB(edges.size()-1);
}
pair<int,int> pnt[MAXN];
int pntc[MAXN], pntr[MAXN];
inline double dist(int x,int y)
{
return sqrt((pnt[x].fi-pnt[y].fi)*(pnt[x].fi-pnt[y].fi)+
(pnt[x].se-pnt[y].se)*(pnt[x].se-pnt[y].se));
}
int cost[MAXN];
signed main()
{
int T; scanf("%lld", &T);
rep(kase,1,T)
{
ZERO(nmat);
ZERO(mat);
scanf("%lld", &n);
rep(i,1,n)
{
int x,y;
scanf("%lld%lld%lld%lld", &x,&y, &pntr[i], &pntc[i]);
pnt[i]=MP(x,y);
}
rep(i,1,n)
{
rep(j,1,n)
{
if(i==j) continue;
double d=pntr[i]-dist(i,j);
if(fabs(d)<1e-6 || d>1e-6)
{
mat[i-1][j-1]=true;
}
}
}
/*
rep(i,0,n-1)
{
rep(j,0,n-1)
cout<<mat[i][j]<<" ";
cout<<endl;
}
*/
find_scc();
memset(cost,0x3f,sizeof(cost));
rep(i,1,n)
{
cost[sccno[i-1]]=min(cost[sccno[i-1]],pntc[i]);
}
rep(i,0,n-1)
{
rep(j,0,n-1)
{
if(i==j) continue;
nmat[sccno[i]][sccno[j]]|=
mat[i][j];
}
}
/*
rep(i,1,scc_cnt)
{
rep(j,1,scc_cnt)
cout<<nmat[i][j]<<" ";
cout<<endl;
}
*/
ll ans=0;
/*
rep(i,0,n-1) cout<<sccno[i]<<" ";
cout<<endl;
rep(i,0,n-1) cout<<cost[i]<<" ";
cout<<endl;
*/
rep(i,1,scc_cnt)
{
int ok=0;
rep(j,1,scc_cnt)
{
if(i==j) continue;
if(nmat[j][i])
{
ok++;
break;
}
}
if(!ok)
{
//cout<<i<<" "<<cost[i]<<endl;
ans+=cost[i];
}
}
printf("Case #%lld: %lld\n", kase, ans);
}
return 0;
}
札记
这题是在一场训练赛中打的。当时的我们激情卡题两个半小时23333然后我觉得不行了只能换题,不懂图论的队友说了这题可以写,他觉得是带权并查集23333我想了一下,这一看就是缩点啊。然后缩点之后没什么好办法,不过也没浪费时间——他们还在卡题23333过了又是半个小时,他们终于出了另外一题(卡的那个签到题还是没出!!!),这个时候还剩下一个半小时了,我想到可以求和入度为0的点即可。然后又过去半个小时(出签到题啊啊啊啊啊)没出(- -|||),只好我上写这题,然后半个小时写完,5分钟调试,交上去WA,看了下代码,改了个long long,过了。后来那个签到题成功出了(太真实了),我们翻盘大成功,哇咔咔~
「国庆训练」Bomb(HDU-5934)的更多相关文章
- 「国庆训练」ArcSoft's Office Rearrangement(HDU-5933)
题目与分析 题解见https://blog.csdn.net/cmershen/article/details/53200922. 训练赛场上我们写出来了--在4小时50分钟的时候...激情补题啊.. ...
- 「国庆训练」Kingdom of Obsession(HDU-5943)
题意 给定\(s,n\),把\(s+1,s+2,...,s+n\)这\(n\)个数填到\(1,2,...,n\)里,要求\(x\)只能填到\(x\)的因子的位置(即题目中\(x\%y=0\)那么x才能 ...
- 「国庆训练&知识学习」图的最大独立集与拓展(Land of Farms,HDU-5556)
题意 一个\(N*M\)的矩阵,其中"."代表空地,"0-9"代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要将全部该编号的建筑建立起来,如 ...
- 「日常训练」 神、上帝以及老天爷 (HDU 2048)
题意 数论中的错排问题.记错排为Dn" role="presentation">DnDn,求Dnn!" role="presentation&q ...
- 「日常训练」 不容易系列之(3)—— LELE的RPG难题 (HDU 2045)
题目简述 有排成一行的n" role="presentation">nn个方格,用红(Red).粉(Pink).绿(Green)三色涂每个格子,每格涂一色,要求任何 ...
- 「日常训练」 Fire!(UVA-11624)
与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...
- 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...
- 「日常训练」COMMON 约数研究(HYSBZ-1968)
题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...
- 「日常训练」Mike and Feet(Codeforces Round #305 Div. 2 D)
题意 (Codeforces 548D) 对一个有$n$个数的数列,我们要求其连续$x(1\le x\le n)$(对于每个$x$,这样的连续group有若干个)的最小数的最大值. 分析 这是一道用了 ...
随机推荐
- Linux学习总结(十四) 文件的打包和压缩
文件的压缩和打包,在windos下我们很熟悉.rar和.zip文件,这是两种压缩文件,他们支持单个文件和多个文件的压缩.windos下我们不提及打包的概念,虽然多个文件的压缩肯定存在打包过程.打包和压 ...
- 理解JavaScript对象
理解JavaScript对象 对象是JavaScript的基本数据类型.对象是一种复合值:将很多值(原始值或者其他对象)聚合在一起. JavaScript对象不仅可以保持自有的属性,还可以从原型对象继 ...
- 443M衣架遥控arduino代码备档
] = {,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,}; ] = {,,,,,,,,,,,,,,,,,,,,,,, ...
- event对象,ie8及其以下
event 对象是 JavaScript 中一个非常重要的对象,用来表示当前事件.event 对象的属性和方法包含了当前事件的状态.当前事件,是指正在发生的事件:状态,是与事件有关的性质,如引发事件的 ...
- I/O复用——各种不同的IO模型
一.概述 我们看到上面的TCP客户同时处理两个输入:标准输入和TCP套接字.我们遇到的问题就是在客户阻塞于(标准输入上的)fgets调用期间,服务器进程会被杀死.服务器TCP虽然正确地给客户TCP发送 ...
- php导出word格式数据的代码(转)
本节内容:一个php导出文档的类 例子:<?php /*** 生成word文档的类* by www.jbxue.com*/class word{ function start() ...
- GPUImage源码解读之GPUImageFramebufferCache
简介 由于GPUImage添加滤镜可以形成一个FilterChain,因此,在渲染的过程中,可能会需要很多个FrameBuffer,但是正如上文所说,每生成一个FrameBuffer都需要占用一定的内 ...
- scroll(),scrollTop(),scrollBy()无效问题的总结
· 使用的浏览器:Chrome(67.0.3396.87)/火狐(60.0.2)/IE(ie7和ie8),均为PC端. · 代码如下 表现结果: Chrome:只有第一次打开标签页面是有效的(在当前标 ...
- LeetCode 中级 -二叉树的层次遍历(102)
题目描述: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 ...
- 学生管理系统增删查基本操作(dom4j/sax技术)
基本代码: student.xml <?xml version="1.0" encoding="UTF-8"?><student> &l ...