题目传送门

题意:中文题面

思路:

  先将所有题目给出的点离散化一下,得到一张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. Codeforces 1169B Pairs

    题目链接:http://codeforces.com/contest/1169/problem/B 题意:给你 m 对数 ,问你能不能在 1 − n 之间找到俩个不相等的 x 和 y 使得 对于前面每 ...

  2. pandas读取文件出现路径不存在的问题

    我写的路径是绝对路径,其他的文件读写完全是没有问题的但是pandas就是不行,于是我改写为全路径:'E:/Python/KNN/iris.csv' 即可解决

  3. ajax图片上传

    使用ajaxfileupload.js插件 html代码: <p> <label>ajax上传</label> <input type="file& ...

  4. ArcGis 字段计算器表达式(Field calculator expression).cal文件与标注表达式(label expression).lxp的实质及其编码方式、解析方法

    ArcGis 字段计算器表达式可以保存为一个扩展名为.cal的文件,该文件的实质是一个文本文件,编码方式为 UTF-16-LE. 官方的说明是“ArcGIS 应用程序使用 UTF-16-LE 编码读写 ...

  5. Windows性能监控perfmon工具的使用和性能指标的分析

    Windows性能监控工具perfmon的使用和性能指标分析 一.perfmon提供图表化的实时的性能监视器.性能日志.警报管理,能监控CPU的使用率.内存使用率.磁盘I/O(磁盘的读写速度).网络I ...

  6. Pregel的应用实例——单源最短路径

  7. json转字符串,json转list,json转pojo的工具类

    package com.loveshop.util; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingEx ...

  8. 建站租用RAKsmart服务器的优势

    RAKsmart算是近年来受国内用户关注度颇高的美国服务器提供商.位于美国西海岸加州地区的RAKsmart机房,拥有超过十年的机房管理经验,提供了快速.稳定的服务器租用服务.那么RAKsmart服务器 ...

  9. nodejs 模板引擎ejs的简单使用(3)

    1.ejs <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  10. CSIC_716_20191127【组合,封装、类的私有属性方法、property装饰器】

    组合 what?   组合是指一个对象中,包含另一个或多个对象. why?      减少代码的冗余. How?     在类中加入其他类的对象,实现跨类对象之间的联动. 耦合度  软件设计要 高内聚 ...