codeforces gym100959 I - Robots(稠密图建图优化)
生活随笔
收集整理的這篇文章主要介紹了
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 31→3連邊只需要讓222作為中轉(zhuǎn)站連邊即1→2→31\to 2\to 31→2→3連邊即可。
這樣邊數(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑网线怎么插路由器路由器与网线怎么连接
- 下一篇: codeforces1493 D. GC