题目传送门

题意:中文题面

思路:

  先将所有题目给出的点离散化一下,得到一张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. upc组队赛2 Master of GCD 【线段树区间更新 || 差分】

    Master of GCD 题目描述 Hakase has n numbers in a line. At fi rst, they are all equal to 1. Besides, Haka ...

  2. python-selenium -- 弹出框处理

    弹出框有两种:页面弹出框(可定位元素能操作).Windows弹出框(不能直接定位) 一.页面弹出框 等待弹出框出现之后,定位弹出框,操作其中元素 如: driver = webdriver.Chrom ...

  3. Android四大组件之Service浅见

    Service 是Android四大组件之一,可以在不显示界面的情况下在后台运行.还有一个作用是通过AIDL来实现进程间通信. Service的启动方式 Service的启动方式有两种,startSe ...

  4. usb-host与外设通信(三)

    4.与设备之间的通信 和USB设备通信可以是同步的或者是异步的,无论是哪一种情况,你都应该创建一个新的线程来处理数据传输,这样才不会使UI线程出现阻塞.与设备建立适宜的通信,你需要获得该设备一个合适的 ...

  5. C语言指针变量的长度

    #include <stdio.h> int main() { /********************************************* * * 指针的长度:不同机器可 ...

  6. Oracle导出存储过程对象

    $ pwd/home/oracle 导出存储过程 $ vi test.par INCLUDE=PROCEDURE:"IN ('P_TEST_LAST_DDL')" SCHEMAS= ...

  7. js 默认事件取消

    防止事件捕获和冒泡   :子类的事件会会发父类相同类型的事件, w3c 标准 window.event.stopPropagation也是事件对象(Event)的一个方法,作用是阻止目标元素的冒泡事件 ...

  8. 2 java程序入门

    1. 第一个java  class  { public static void main(String[] args) { System.out.println("Hello World!& ...

  9. Mybatis枚举转换

    自定义mybatis枚举转换,原理是如果用户没有定义自己的枚举转换工具,mybatis在解析枚举类时会自动获取mybatis的BaseTypeHandler,来转换枚举类,我们只需要重写这个枚举转换器 ...

  10. IDEA中@Autowired 注解报错~图文