トピックへのリンク:http://acm.hdu.edu.cn/showproblem.php?pid=6670
Mindis
時間制限:4000/2000 MS(Javaの/その他)メモリの制限:131072分の131072 K(Javaの/その他)
の合計提出(S):548受理提出(S):119
問題の説明は、
N個の矩形を有し、矩形の辺が平面上の座標軸に平行に、B点から耐えるようになった文字の度合いを制御する必要性が今です。
文字は単に矩形kで覆われた領域に、上下に移動することができ、速度が役割をk + 1 /秒(両端を含む長方形のフットプリント領域)距離です。
何秒の最速Bに移動するための要求。
入力
最初の行は整数T(1≤T≤5)は、データセットの数を表します。
各試験のために、入力された整数n(1≤n≤200)の最初の行。
次の4行は、それぞれn個の整数X1、Y1、X2、Y2( 0≤x1<x2≤1000000000,0≤y1<y2≤1000000000)、 矩形の左下と右上の座標を表します。
最後の行4つの整数XA、YA、XB、YB( (0≤xa、XB、YA、yb≤1000000000) AとBの座標の代表
出力
各テストについては、小数点以下の回答の出力。小数点以下5桁の答え。
サンプル入力
1
1
5 6 6
7 7 8 8
サンプル出力
2.00000
ソース
2019インディアンBaiduのスター・プログラミング・コンテスト-予選
アイデア:
第1の離散点で与えられたすべてのトピックの、N×m個のグリッドを与え、nおよびmは400最大であります
我々は、別個の列挙が含まながら矩形の座標を指した後、各矩形を列挙する
これは、含まれる各矩形の点の数を維持することができ、
CNT [X] [Y] [K]を横軸グリッドX、縦軸Yに表され、方向は辺のこの離散長K(垂直および水平の0,1,2,3代表)である1回数長方形の足跡。
次いで内蔵隣接するドット(エッジ距離コスト/速度、我々は調整することができる距離を引いた、すなわち、時間、速度は矩形の数点を含むから誘導される)、最短経路マップを実行することができ、
書き込みコードは、書き込みが精神的、物理的な部分の多くは、機械的な動作である必要はありませんので、書くのは難しいことではない、非常に長いです。、細部へのこだわり、
詳細コードを参照してください。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 400010;
const ll inf = 1e18;
/*** TEMPLATE CODE * * STARTS HERE ***/
int t;
int n;
struct juzhen
{
int x1,x2,y1,y2;
}a[500];
std::vector<int> vx,vy;
int sn,sm;
int getid(int x,int y)
{
return (x-1)*sn+y;
}
double dis[maxn];
struct node
{
int to;
double val;
node (){}
node(int tt,double vv)
{
to=tt;
val=vv;
}
bool operator <(const node &b)const
{
return val>b.val;
}
};
std::vector<node> v[maxn];
int cnt[500][500][5];
bool check(int x,int y)
{
return x>=1&&x<=sn&&y>=1&&y<=sm;
}
juzhen aid;
priority_queue<node> heap;
void dij()
{
while(heap.size())
{
heap.pop();
}
dis[getid(aid.x1,aid.y1)]=0;
heap.push(node(getid(aid.x1,aid.y1),0));
node temp;
while(!heap.empty())
{
temp=heap.top();
heap.pop();
for(auto x:v[temp.to])
{
if(dis[x.to]>x.val+dis[temp.to])
{
dis[x.to]=x.val+dis[temp.to];
heap.push(node(x.to,dis[x.to]));
}
}
}
}
int main()
{
//freopen("D:\\code\\text\\input.txt","r",stdin);
//freopen("D:\\code\\text\\output.txt","w",stdout);
gbtb;
cin>>t;
while(t--)
{
cin>>n;
vx.clear();
vy.clear();
repd(i,1,n)
{
cin>>a[i].x1>>a[i].y1>>a[i].x2>>a[i].y2;
vx.push_back(a[i].x1);
vx.push_back(a[i].x2);
vy.push_back(a[i].y1);
vy.push_back(a[i].y2);
}
cin>>aid.x1>>aid.y1>>aid.x2>>aid.y2;
vx.push_back(aid.x1);
vx.push_back(aid.x2);
vy.push_back(aid.y1);
vy.push_back(aid.y2);
sort(ALL(vx));
sort(ALL(vy));
vx.erase(unique(ALL(vx)),vx.end());
vy.erase(unique(ALL(vy)),vy.end());
sn=sz(vx);
sm=sz(vy);
repd(i,1,sn)
{
repd(j,1,sm)
{
dis[getid(i,j)]=inf;
v[getid(i,j)].clear();
repd(z,0,3)
cnt[i][j][z]=1;
}
}
aid.x1=lower_bound(ALL(vx),aid.x1)-vx.begin()+1;
aid.x2=lower_bound(ALL(vx),aid.x2)-vx.begin()+1;
aid.y1=lower_bound(ALL(vy),aid.y1)-vy.begin()+1;
aid.y2=lower_bound(ALL(vy),aid.y2)-vy.begin()+1;
repd(i,1,n)
{
int x1=lower_bound(ALL(vx),a[i].x1)-vx.begin()+1;
int y1=lower_bound(ALL(vy),a[i].y1)-vy.begin()+1;
int x2=lower_bound(ALL(vx),a[i].x2)-vx.begin()+1;
int y2=lower_bound(ALL(vy),a[i].y2)-vy.begin()+1;
repd(j,x1+1,x2-1)
{
repd(k,y1+1,y2-1)
{
repd(z,0,3)
cnt[j][k][z]++;
}
}
// 0 1 2 3
// 上 下 左 右
repd(j,x1+1,x2-1)
{
cnt[j][y2][1]++;
cnt[j][y2][2]++;
cnt[j][y2][3]++;
cnt[j][y1][0]++;
cnt[j][y1][2]++;
cnt[j][y1][3]++;
}
repd(j,y1+1,y2-1)
{
cnt[x1][j][0]++;
cnt[x1][j][1]++;
cnt[x1][j][3]++;
cnt[x2][j][0]++;
cnt[x2][j][1]++;
cnt[x2][j][2]++;
}
cnt[x1][y1][0]++;
cnt[x1][y1][3]++;
cnt[x2][y1][0]++;
cnt[x2][y1][2]++;
cnt[x1][y2][3]++;
cnt[x1][y2][1]++;
cnt[x2][y2][1]++;
cnt[x2][y2][2]++;
}
repd(i,1,sn)
{
repd(j,1,sm)
{
if(check(i-1,j))
{
v[getid(i,j)].push_back(node(getid(i-1,j),1.00*(vx[i-1]-vx[i-2])/cnt[i][j][2]));
}
if(check(i+1,j))
{
v[getid(i,j)].push_back(node(getid(i+1,j),1.00*(vx[i]-vx[i-1])/cnt[i][j][3]));
}
if(check(i,j-1))
{
v[getid(i,j)].push_back(node(getid(i,j-1),1.00*(vy[j-1]-vy[j-2])/cnt[i][j][1]));
}
if(check(i,j+1))
{
v[getid(i,j)].push_back(node(getid(i,j+1),1.00*(vy[j]-vy[j-1])/cnt[i][j][0]));
}
}
}
dij();
// cout<<getid(aid.x2,aid.y2)<<endl;
cout<<fixed<<setprecision(5)<<dis[getid(aid.x2,aid.y2)]<<endl;
}
return 0;
}
inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
}
else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}