P2825 [HEOI2016/TJOI2016] 游戏 与 P10945 Place the Robots
1.[ABC363G] Dynamic Scheduling 与 P4511 [CTSC2015] 日程管理2.P9058 [Ynoi2004] rpmtdq 与 P9678 [ICPC2022 Jinan R] Tree Distance3.P1081 [NOIP2012 提高组] 开车旅行4.P1973 [NOI2011] NOI 嘉年华5.P1398 [NOI2013] 书法家6.P3957 [NOIP2017 普及组] 跳房子7.P5017 [NOIP2018 普及组] 摆渡车8.P5665 [CSP-S2019] 划分9.P4544 [USACO10NOV] Buying Feed G10.P3089 [USACO13NOV] Pogo-Cow S11.P3572 [POI2014] PTA-Little Bird12.P6764 [APIO2020] 粉刷墙壁13.P2831 [NOIP2016 提高组] 愤怒的小鸟14.P3959 [NOIP2017 提高组] 宝藏15.P2150 [NOI2015] 寿司晚宴16.P8037 [COCI2015-2016#7] Prokletnik17.CF1943C Tree Compass18.P1084 [NOIP2012 提高组] 疫情控制19.P6805 [CEOI2020] 春季大扫除20.P4689 [Ynoi2016] 这是我自己的发明 与 P5268 [SNOI2017] 一个简单的询问021.CF1264D1/2 Beautiful Bracket Sequence (easy/hard version)22.CF924D Contact ATC23.P9640 [SNCPC2019] Digit Mode24.P2757 [国家集训队] 等差子序列 与 CF452F Permutation25.P4423 [BJWC2011] 最小三角形 与 SP7209 CLOSEST - Closest Triplet
26.P2825 [HEOI2016/TJOI2016] 游戏 与 P10945 Place the Robots
27.P8304 [CoE R4 D] 01 串28.P3320 [SDOI2015] 寻宝游戏 与 P10930 异象石 与 CF176E Archaeology29.P9108 [PA2020] Malowanie płotu30.CF773D Perishable Roads本文中的机器人同炸弹,主要是题目描述不同,两道题目做法是本质相同的。
思路:
先说一下没有墙怎么办,那么当一个位置放了机器人之后,这个机器人所在的行和列是不能继续放置的。
那么发现行和列几乎是独立的,考虑建二分图,若
那么答案就是这个二分图的最大匹配,这样每个匹配的就代表着一个机器人所放的位置。
现在再考虑有墙的情况,有墙时,机器人所放的激光无法穿透过去,则在墙另外一边依旧可能可以放置机器人。
发现墙就是把行或列分为了几个部分,每个部分互不干扰,则考虑每遇到墙,就新起一行表示当前位置到下一个墙或者这一行的末尾的放块;列同理。
直接跑匈牙利算法即可。
P2825 [HEOI2016/TJOI2016] 游戏 Code:
#include<bits/stdc++.h> #define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y) #define lowbit(x) x&(-x) #define pi pair<ll,ll> #define pii pair<ll,pair<ll,ll>> #define iip pair<pair<ll,ll>,ll> #define ppii pair<pair<ll,ll>,pair<ll,ll>> #define fi first #define se second #define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x #define Full(a) memset(a,0,sizeof(a)) #define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout); #define For(i,l,r) for(int i=l;i<=r;i++) #define _For(i,l,r) for(int i=r;i>=l;i--) using namespace std; typedef double db; typedef unsigned long long ull; typedef long long ll; const ll N=2505; inline ll read(){ ll x=0,f=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=(x<<1)+(x<<3)+(c^48); c=getchar(); } return x*f; } inline void write(ll x){ if(x<0){ putchar('-'); x=-x; } if(x>9) write(x/10); putchar(x%10+'0'); } inline char get(){ char c; while((c=getchar())!='*'&&c!='x'&&c!='#'); return c; } ll n,m,id,ans,s1,s2; ll a[N],f[N]; ll h[N][N]; char s[N][N]; vector<ll> E[N]; void add(ll u,ll v){ E[u].push_back(v); } bool dfs(ll u){ for(auto v:E[u]){ if(f[v]==id) continue; f[v]=id; if(!a[v]||dfs(a[v])){ a[v]=u; return 1; } } return 0; } void Match(){ for(int i=1;i<=s1;i++){ id=i; if(dfs(i)) ans++; } } int main(){ n=read(),m=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) s[i][j]=get(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(s[i][j]=='#') continue; if(s[i][j-1]=='#'||j==1) ++s1; h[i][j]=s1; } } for(int j=1;j<=m;j++){ for(int i=1;i<=n;i++){ if(s[i][j]=='#') continue; if(s[i-1][j]=='#'||i==1) ++s2; if(h[i][j]&&s[i][j]=='*') add(h[i][j],s2); } } Match(); write(ans); return 0; }
P10945 Place the Robots Code:
#include<bits/stdc++.h> #define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y) #define lowbit(x) x&(-x) #define pi pair<ll,ll> #define pii pair<ll,pair<ll,ll>> #define iip pair<pair<ll,ll>,ll> #define ppii pair<pair<ll,ll>,pair<ll,ll>> #define fi first #define se second #define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x #define Full(a) memset(a,0,sizeof(a)) #define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout); #define For(i,l,r) for(int i=l;i<=r;i++) #define _For(i,l,r) for(int i=r;i>=l;i--) using namespace std; typedef double db; typedef unsigned long long ull; typedef long long ll; const ll N=2505; inline ll read(){ ll x=0,f=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=(x<<1)+(x<<3)+(c^48); c=getchar(); } return x*f; } inline void write(ll x){ if(x<0){ putchar('-'); x=-x; } if(x>9) write(x/10); putchar(x%10+'0'); } inline char get(){ char c; while((c=getchar())!='*'&&c!='o'&&c!='#'); return c; } ll T,n,m,cnt,id,ans,s1,s2; ll a[N],f[N]; ll h[N][N]; char s[N][N]; vector<ll> E[N]; void add(ll u,ll v){ E[u].push_back(v); } bool dfs(ll u){ for(auto v:E[u]){ if(f[v]==id) continue; f[v]=id; if(!a[v]||dfs(a[v])){ a[v]=u; return 1; } } return 0; } void Match(){ memset(f,0,sizeof(f)); memset(a,0,sizeof(a)); for(int i=1;i<=s1;i++){ id=i; if(dfs(i)) ans++; } } void solve(){ n=read(),m=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) s[i][j]=get(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(s[i][j]=='#') continue; if(s[i][j-1]=='#'||j==1) ++s1; h[i][j]=s1; } } for(int j=1;j<=m;j++){ for(int i=1;i<=n;i++){ if(s[i][j]=='#') continue; if(s[i-1][j]=='#'||i==1) ++s2; if(h[i][j]&&s[i][j]=='o') add(h[i][j],s2); } } Match(); printf("Case :%lld\n",++cnt); write(ans); putchar('\n'); For(i,1,max(s1,s2)) E[i].clear(); s1=s2=ans=0; } int main(){ T=read(); while(T--) solve(); return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验