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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

HDU 6229 Wandering Robots 找规律+离散化

發布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 6229 Wandering Robots 找规律+离散化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:Wandering Robots

題解:先講一下規律,對于每一個格子它可以從多少個地方來有一個值(可以從自己到自己),然后答案就是統計合法格子上的數與所有格子的數的比值

比如說樣例的3 0格子上的值就是

3 4 3

4 5 4

3 4 3

答案就是22/33 =2/3;接下來就是如何統計答案了,由于圖1e4*1e4的但點只有1e3必須將圖離散化得到新圖,離散化是要將點相鄰的兩行也要加進新圖,這樣省去的點在原圖上相鄰沒有被阻隔的點,然后dfs一次,把可以到達的點標記一邊,然后統計答案注意邊界。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e3+10;
bool vis[N][N],mp[N][N];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int n,k,mm,mn;
int sc[N],sr[N],cn1,cn2;
int x[N],y[N];
int x_hash(int x)
{return lower_bound(sc,sc+mn,x)-sc;
}
int y_hash(int y)
{return lower_bound(sr,sr+mm,y)-sr;
}
void dfs(int x,int y)
{vis[x][y]=1;for(int i=0;i<4;i++){int tx=x+dx[i],ty=y+dy[i];if(tx>=0&&tx<mn&&ty>=0&&ty<mm&&!vis[tx][ty]&&!mp[tx][ty])dfs(tx,ty);}
}
int get(int x,int y)
{if(!vis[x][y])return 0;int cnt=vis[x][y];for(int i=0;i<4;i++){int tx=x+dx[i],ty=y+dy[i];if(tx>=0&&tx<mn&&ty>=0&&ty<mm)cnt+=vis[tx][ty];}return cnt;
}
int main(){int T;scanf("%d",&T);int cas=1;while(T--){cn1=0;cn2=0;//memset(vis,0,sizeof(vis));//memset(mp,0,sizeof(mp));scanf("%d %d",&n,&k);sc[cn1++]=0;sc[cn1++]=n-1;sr[cn2++]=0;sr[cn2++]=n-1;for(int i=0;i<k;i++){scanf("%d %d",&x[i],&y[i]);sc[cn1++]=x[i];if(x[i]-1>=0)sc[cn1++]=x[i]-1;if(x[i]+1<n)sc[cn1++]=x[i]+1;sr[cn2++]=y[i];if(y[i]-1>=0)sr[cn2++]=y[i]-1;if(y[i]+1<n)sr[cn2++]=y[i]+1;}sort(sc,sc+cn1);sort(sr,sr+cn2);mn=unique(sc,sc+cn1)-sc;mm=unique(sr,sr+cn2)-sr;for(int i=0;i<=mn;i++){for(int j=0;j<=mm;j++){vis[i][j]=mp[i][j]=0;}}for(int i=0;i<k;i++){mp[x_hash(x[i])][y_hash(y[i])]=1;}dfs(0,0);int an1=0,an2=0;for(int i=0;i<mn;i++){if(i!=0){an1+=(sc[i-1]+1+sc[i]+1)*(sc[i]-sc[i-1]-1)*5/2;an1-=sc[i]-sc[i-1]-1;}for(int j=0;j<mm;j++){if(sr[j]+sc[i]>=n-1)an1+=get(i,j);if(j<mm-1&&sr[j]+1!=sr[j+1]){int tmp=n-1-sc[i];if(sr[j+1]-1>=tmp){if(sr[j]+1>=tmp){if(sc[i]==0||sc[i]==n-1)an1+=4*(sr[j+1]-sr[j]-1);else an1+=5*(sr[j+1]-sr[j]-1);}else{if(sc[i]==0||sc[i]==n-1)an1+=4*(sr[j+1]-tmp);else an1+=5*(sr[j+1]-tmp);}}}an2+=get(i,j);}}an2+=5*(n*n-mn*mm);an2-=2*(n-mn)+2*(n-mm);int gc=__gcd(an1,an2);an1/=gc;an2/=gc;printf("Case #%d: %d/%d\n",cas++,an1,an2);}return 0;
}

?

轉載于:https://www.cnblogs.com/lhclqslove/p/9736747.html

總結

以上是生活随笔為你收集整理的HDU 6229 Wandering Robots 找规律+离散化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。