2019 年百度之星·程序设计大赛 - 初赛一 C. Mindis 离散化+dijkstra
题意:中文题面
思路:
先将所有题目给出的点离散化一下,得到一张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的更多相关文章
- 2019 年百度之星·程序设计大赛 - 初赛一 C. HDU 6670 Mindis 离散化+dijkstra
题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=6670 Mindis Time Limit: 4000/2000 MS (Java/Others) M ...
- 2019 年百度之星·程序设计大赛 - 初赛一Game HDU 6669 (实现,贪心)
Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
- 2019 年百度之星·程序设计大赛 - 初赛四 1001 Strassen
比赛链接:2019 年百度之星·程序设计大赛 - 初赛四 题目链接:HDU-6719 Strassen C++ 没写出来 于是直接上 Java 暴力. 好像可以用 __int128. import j ...
- Seq[找规律]----2019 年百度之星·程序设计大赛 - 初赛一:1005
Seq Accepts: 1249 Submissions: 3956 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...
- 2019 年百度之星·程序设计大赛 - 初赛一 1005 Seq(数学规律)
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=861&pid=1005 Sample Input Sampl ...
- HDU6383 2018 “百度之星”程序设计大赛 - 初赛(B) 1004-p1m2 (二分)
原题地址 p1m2 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- HDU6380 2018 “百度之星”程序设计大赛 - 初赛(B) A-degree (无环图=树)
原题地址 degree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))
度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017"百度之星"程序设计大赛 - 初赛(B))
小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
随机推荐
- PAT_A1041#Be Unique
Source: PAT A1041 Be Unique (20 分) Description: Being unique is so important to people on Mars that ...
- 并发新构件之Exchanger:交换器
Exchanger:JDK描述:可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchang ...
- 使ie6/7/8支持css3的方法
使用PIE.htc让IE6\7\8支持CSS3部分属性 包括圆角,阴影,背景渐变等效果 下载地址 http://css3pie.com/download/ 需要注意几点的是 第一,pie是以相对页面h ...
- python基础讲解部分&纯小白需要扎实基础
第一章知识点 一.Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum),在中国人称龟叔 Python崇尚优美.清晰.简单 应用领域: (1)云计算,写 ...
- 怎样在Cocos2d-x中使用Lua脚本
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013321328/article/details/25699545 笔者使用的是Cocos2d-x ...
- linux指令【参考鸟哥的Linux私房菜】
date指令 显示日期 cal指令 显示日历 bc 计算器 scale+number 显示几位小数 quit退出bc tab键 命令提示 入输入ca,按下tab键,会将所有ca的指令全部 ...
- Linux/CentOS 7 timezone 修改
1.su - 登录root用户 2.timedatectl set-timezone {timezone} (set后面加想要设置的时区) 举例:timedatectl set-timezone As ...
- 文本聚合函数(wm_concat, listagg, group_concat, string_agg)
实现目标 1.聚合文本 2.聚合文本(去重) 3.聚合文本(去重),按照指定字段排序 4.聚合文本(去重),按照指定字段排序,替换默认逗号分隔符 MySQL: group_concat ...
- vue+element 构建的后台管理系统项目(1)新建项目
1.运行 vue init webpack demo 这里的demo是你项目的名字 2.npm run dev 查看项目启动效果 3.安装Element cd 项目 cmd 运行 npm i e ...
- python 模拟按键模拟键盘按键按下放开
python模拟按键 pip install pypiwin32安装库 import win32conimport win32apiimport time 导入 打个比方模拟A win32api.ke ...