题目传送门

题意:中文题面

思路:

  先将所有题目给出的点离散化一下,得到一张n*m的网格,n和m最大都是400,所以我们只需要枚举每个加强的区域,将属于这个区域的边处理一下(所有横着的和竖着的边,暴力处理即可),然后相邻的点建边,建图,跑最短路即可。

  $mp[x][y][k]$表示网格上横坐标$x$纵坐标$y$,方向为k(0,1,2,3表示上右下左)这条离散化后长度为1的边被矩形覆盖的次数(初始值为1),时间就是离散化前的长度除以次数.然后建边跑dijkstra。

  比赛最后几分钟交了一发T了,发现离散化数组没排序就直接unique了,改完bug,bestcode就炸了。赛后补题,wa了两次,看着代码看了二十分钟,最后发现原来是oj没把题目搬完,交啥都是错的。。。搬完后就一发a了。。太伤心了。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,b,a) for(int i=b;i>=a;i--)
#define clr(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pii pair<int,int >
using namespace std;
typedef long long ll;
ll rd() {
ll x=,f=;
char ch=getchar();
while(ch<''||ch>'') {
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<='') {
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
const int maxn=+;
const int inf=0x3f3f3f3f;
struct rc{
ll x1,x2,y1,y2;
}a[];
double mp[][][];
vector<ll >vx,vy;
ll xa,ya,xb,yb,n,m,num;
struct edge{
int to;
double w;
friend bool operator<(const edge &a,const edge &b){
return a.w>b.w;
}
};
priority_queue<edge >q;
vector<edge >ve[];
int getid(int x,int y){
return (y-)*n+x;
}
bool check(int x,int y){
if(x<||x>n||y<||y>m)return false;
return true;
}
double dis[]; void dij(){
int px1=lower_bound(vx.begin(),vx.end(),xa)-vx.begin()+;
int px2=lower_bound(vx.begin(),vx.end(),xb)-vx.begin()+;
int py1=lower_bound(vy.begin(),vy.end(),ya)-vy.begin()+;
int py2=lower_bound(vy.begin(),vy.end(),yb)-vy.begin()+;
int id1=getid(px1,py1),id2=getid(px2,py2);
// printf("id1:%d id2:%d n:%d m:%d px1:%d py1:%d px2:%d py2:%d\n",id1,id2,n,m,px1,py1,px2,py2);
dis[id1]=;
q.push({id1,});
while(!q.empty()){ edge st=q.top();
q.pop();
int u=st.to;
double w=st.w;
// printf("u:%d w:%.4f\n",u,w); int si=ve[u].size();
rep(i,,si-){
int v=ve[u][i].to;
if(dis[v]>dis[u]+ve[u][i].w){
dis[v]=dis[u]+ve[u][i].w;
q.push({v,dis[v]});
}
}
}
printf("%.5f\n",dis[id2]);
}
int main(){
int T;
cin>>T;
while(T--){
cin>>num;
vx.clear(),vy.clear();
rep(i,,num){
a[i].x1=rd();
a[i].y1=rd();
a[i].x2=rd();
a[i].y2=rd();
vx.pb(a[i].x1),vx.pb(a[i].x2);
vy.pb(a[i].y1),vy.pb(a[i].y2);
}
cin>>xa>>ya>>xb>>yb;
vx.pb(xa),vx.pb(xb);
vy.pb(ya),vy.pb(yb);
sort(vx.begin(),vx.end());
sort(vy.begin(),vy.end());
vx.erase(unique(vx.begin(),vx.end()),vx.end());
vy.erase(unique(vy.begin(),vy.end()),vy.end());
n=vx.size(),m=vy.size();
rep(i,,n){
rep(j,,m){
rep(k,,)
mp[i][j][k]=; ve[getid(i,j)].clear();
dis[getid(i,j)]=;
}
}
rep(i,,num){
int px1=lower_bound(vx.begin(),vx.end(),a[i].x1)-vx.begin()+;
int px2=lower_bound(vx.begin(),vx.end(),a[i].x2)-vx.begin()+;
int py1=lower_bound(vy.begin(),vy.end(),a[i].y1)-vy.begin()+;
int py2=lower_bound(vy.begin(),vy.end(),a[i].y2)-vy.begin()+;
rep(x,px1+,px2-){
rep(y,py1+,py2-){
mp[x][y][]++;
mp[x][y][]++;
mp[x][y][]++;
mp[x][y][]++;
}
}
rep(x,px1+,px2-){
int y=py1;
mp[x][y][]++;
mp[x][y][]++;
mp[x][y][]++;
y=py2;
mp[x][y][]++;
mp[x][y][]++;
mp[x][y][]++;
}
rep(y,py1+,py2-){
int x=px1;
mp[x][y][]++;
mp[x][y][]++;
mp[x][y][]++;
x=px2;
mp[x][y][]++;
mp[x][y][]++;
mp[x][y][]++;
}
mp[px1][py1][]++;
mp[px1][py1][]++;
mp[px1][py2][]++;
mp[px1][py2][]++;
mp[px2][py1][]++;
mp[px2][py1][]++;
mp[px2][py2][]++;
mp[px2][py2][]++; } rep(i,,n){
rep(j,,m){
int id=getid(i,j);
if(check(i-,j))ve[id].pb({getid(i-,j),(vx[i-]-vx[i-])/mp[i][j][]});
if(check(i+,j))ve[id].pb({getid(i+,j),(vx[i]-vx[i-])/mp[i][j][]});
if(check(i,j-))ve[id].pb({getid(i,j-),(vy[j-]-vy[j-])/mp[i][j][]});
if(check(i,j+))ve[id].pb({getid(i,j+),(vy[j]-vy[j-])/mp[i][j][]}); }
}
dij();
}
}

2019 年百度之星·程序设计大赛 - 初赛一 C. Mindis 离散化+dijkstra的更多相关文章

  1. 2019 年百度之星·程序设计大赛 - 初赛一 C. HDU 6670 Mindis 离散化+dijkstra

    题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=6670 Mindis Time Limit: 4000/2000 MS (Java/Others) M ...

  2. 2019 年百度之星·程序设计大赛 - 初赛一Game HDU 6669 (实现,贪心)

    Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  3. 2019 年百度之星·程序设计大赛 - 初赛四 1001 Strassen

    比赛链接:2019 年百度之星·程序设计大赛 - 初赛四 题目链接:HDU-6719 Strassen C++ 没写出来 于是直接上 Java 暴力. 好像可以用 __int128. import j ...

  4. Seq[找规律]----2019 年百度之星·程序设计大赛 - 初赛一:1005

    Seq Accepts: 1249 Submissions: 3956 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...

  5. 2019 年百度之星·程序设计大赛 - 初赛一 1005 Seq(数学规律)

    http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=861&pid=1005 Sample Input Sampl ...

  6. HDU6383 2018 “百度之星”程序设计大赛 - 初赛(B) 1004-p1m2 (二分)

    原题地址 p1m2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  7. HDU6380 2018 “百度之星”程序设计大赛 - 初赛(B) A-degree (无环图=树)

    原题地址 degree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  8. HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017"百度之星"程序设计大赛 - 初赛(B))

    小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

随机推荐

  1. 2019河北省大学生程序设计竞赛(重现赛) L题-smart robot(深度优先搜索)

    题目链接:https://ac.nowcoder.com/acm/contest/903/L 题意:给你 n * n的方阵,你可以从任意一个数字开始走,可以走上下左右四个方向,走过的数字会被拼合,拼合 ...

  2. JMeter轻松实现大数据量AI图像识别接口测试

    ****************************************************************************** 本文主要介绍利用Jmeter进行AI图像识 ...

  3. Django框架(四)—— 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别

    目录 路由控制 一.简单路由配置 二.无名分组 三.有名分组 四.反向解析 五.路由分发 六.名称空间(一般不使用) 七.伪静态 八.Django 2.x和Django 1.x 路由层区别 九.APP ...

  4. exe自启动的几种方式

    1 注册表启动项目RUN (注册路径 HKEY_LOCAL_MACHINE\SOFTWARE\microsoft\Windows\CurrentVersion\Run) 2 计划任务 比较少见这种方式 ...

  5. JavaScript小实例-文本循环变色效果

    在现实生活中我们常常看到文字循环变色的效果,此效果不仅能让人们印象深刻,还提高了美观度,代码及注释如下: <!DOCTYPE html> <html> <head> ...

  6. linux 6 timezone修改

    linux 6 / Amazon linux 因为正好在使用Amazon 的linux AMI  又遇到了需要修改系统时区这个case 所以就调查了一下修改方法,因为Amazon的linux版本是由A ...

  7. __stdcall,__cdecl,__fastcall,_stdcall,_cdecl,_fastcall 区别简介[转]

    今天写线程函数时,发现msdn中对ThreadProc的定义有要求: DWORD WINAPI ThreadProc(LPVOID lpParameter);   不解为什么要用WINAPI宏定义,查 ...

  8. mysqld_safe A mysqld process already exists

    最近修改mysql密码遇到mysqld_safe A mysqld process already exists问题: 解决步骤: 1:ps aux |grep mysql   查看mysql的进程. ...

  9. 过滤器 一 Filter

    import javax.servlet.Filter; 前言 过滤器是一个程序,依赖与servlet容器,它先于与之相关的servlet或JSP页面运行在服务器上.过滤器可附加到一个或多个servl ...

  10. bzoj1096题解

    [解题思路] 预处理spi=∑pj(j∈[1,i]),si=si-1+(xi-xi-1)*spi-1表示把工厂1~i-1的产品都运到工厂i的花费.于是把工厂j+1~i的产品都运到工厂i的花费为si-s ...