日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

codeforces gym100959 I - Robots(稠密图建图优化)

發(fā)布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codeforces gym100959 I - Robots(稠密图建图优化) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

I - Robots

顯然可以兩點(diǎn)之間能連邊就連邊,但是邊數(shù)會很多,考慮優(yōu)化
對于三個點(diǎn)(x0,y0)(x_0,y_0)(x0?,y0?)(x0,y1)(x_0,y_1)(x0?,y1?)(x0,y2)(x_0,y_2)(x0?,y2?)

如果三個點(diǎn)的方向都是UUU 那么沒有必要1→31\to 313連邊只需要讓222作為中轉(zhuǎn)站連邊即1→2→31\to 2\to 3123連邊即可。

這樣邊數(shù)就是線性的。

upd:向上面建圖不難發(fā)現(xiàn)每個點(diǎn)只會和啟動它的點(diǎn)連一條邊,因此邊數(shù)是O(n)O(n)O(n)量級的

#include<bits/stdc++.h> using namespace std; constexpr int N=100010; struct node {int x,y;char d; }a[N]; int b[2*N],n,m; vector<pair<int,int> > gx[2*N]; vector<pair<int,int> > gy[2*N]; long long d[N]; long long T; bool vis[N]; void dijkstra() {priority_queue<pair<long long,int>,vector<pair<long long,int>>,greater<pair<long long,int>>>q;memset(d,0x3f,sizeof d);q.push({0,1});d[1]=0;while(q.size()){int u=q.top().second; q.pop();if(vis[u]) continue;vis[u]=1;if(a[u].d=='U'){vector<pair<int,int> >::iterator it=lower_bound(gx[a[u].x].begin(),gx[a[u].x].end(),(pair<int,int>){a[u].y,u});++it;while(it!=gx[a[u].x].end()){int v=it->second;if(d[v]>d[u]+b[a[v].y]-b[a[u].y]){d[v]=d[u]+b[a[v].y]-b[a[u].y];q.push({d[v],v});}if(a[v].d=='U') break;it++;}}if(a[u].d=='D'){vector<pair<int,int> >::iterator it=lower_bound(gx[a[u].x].begin(),gx[a[u].x].end(),(pair<int,int>){a[u].y,u});if(it==gx[a[u].x].begin()) continue;--it;while(1){int v=it->second;if(d[v]>d[u]-b[a[v].y]+b[a[u].y]){d[v]=d[u]-b[a[v].y]+b[a[u].y];q.push({d[v],v});}if(a[v].d=='D') break;if(it==gx[a[u].x].begin()) break;it--;}}if(a[u].d=='R'){vector<pair<int,int> >::iterator it=lower_bound(gy[a[u].y].begin(),gy[a[u].y].end(),(pair<int,int>){a[u].x,u});++it;while(it!=gy[a[u].y].end()){int v=it->second;if(d[v]>d[u]+b[a[v].x]-b[a[u].x]){d[v]=d[u]+b[a[v].x]-b[a[u].x];q.push({d[v],v});}if(a[v].d=='R') break;it++;}}if(a[u].d=='L'){vector<pair<int,int> >::iterator it=lower_bound(gy[a[u].y].begin(),gy[a[u].y].end(),(pair<int,int>){a[u].x,u});if(it==gy[a[u].y].begin()) continue;--it;while(1){int v=it->second;if(d[v]>d[u]-b[a[v].x]+b[a[u].x]){d[v]=d[u]-b[a[v].x]+b[a[u].x];q.push({d[v],v});}if(a[v].d=='L') break;if(it==gy[a[u].y].begin()) break;it--;}}} } int main() {cin>>n>>T;for(int i=1;i<=n;i++){int x,y;char d;cin>>x>>y>>d;a[i]={x,y,d};b[++m]=x;b[++m]=y;}sort(b+1,b+1+m);m=unique(b+1,b+1+m)-b-1;for(int i=1;i<=n;i++){a[i].x=lower_bound(b+1,b+1+m,a[i].x)-b;a[i].y=lower_bound(b+1,b+1+m,a[i].y)-b;}for(int i=1;i<=n;i++){gx[a[i].x].push_back({a[i].y,i});gy[a[i].y].push_back({a[i].x,i});}for(int i=1;i<=m;i++) {sort(gx[i].begin(),gx[i].end());sort(gy[i].begin(),gy[i].end());}dijkstra();for(int i=1;i<=n;i++){if(d[i]==0x3f3f3f3f3f3f3f3f||T<=d[i])cout<<b[a[i].x]<<' '<<b[a[i].y]<<'\n';else{long long x=b[a[i].x],y=b[a[i].y];if(a[i].d=='U') y+=T-d[i];if(a[i].d=='D') y-=T-d[i];if(a[i].d=='R') x+=T-d[i];if(a[i].d=='L') x-=T-d[i];cout<<x<<' '<<y<<'\n';}}return 0; }

想到做法了,但是以為可能還有數(shù)據(jù)能把邊卡到2次方,就幫隊(duì)友調(diào)題去了~~非常可惜

總結(jié)

以上是生活随笔為你收集整理的codeforces gym100959 I - Robots(稠密图建图优化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。