[杂题 暴力 ST表] 51Nod1487 占领资源
2017-10-21 21:43
162 查看
这种题看似很暴力,但也不能太暴力,需要一定的思考。
我们先枚举一个塔,再考虑下一个塔,注意到第2个塔与第一个塔有重叠的只有最多 K2 个,即暴力枚举交在哪里,直接就得到了。
对于这些有重叠的暴力算答案,剩下的都和第一个塔没有重叠,就挑一个最大值即可。
除去 K2 个元素的最大值,不要学傻了用什么线段树单点修改,直接 ST 表预处理,把除掉的元素按编号排序,中间一段一段询问最大值即可,常数小。
总复杂度 O(nmK2logK2)
我们先枚举一个塔,再考虑下一个塔,注意到第2个塔与第一个塔有重叠的只有最多 K2 个,即暴力枚举交在哪里,直接就得到了。
对于这些有重叠的暴力算答案,剩下的都和第一个塔没有重叠,就挑一个最大值即可。
除去 K2 个元素的最大值,不要学傻了用什么线段树单点修改,直接 ST 表预处理,把除掉的元素按编号排序,中间一段一段询问最大值即可,常数小。
总复杂度 O(nmK2logK2)
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int maxn=105; int _test,n,m,K,a[maxn][maxn],b[205],dx[15],dy[15]; int st[maxn*maxn][20],ans,vis[maxn][maxn],clk; inline int ID(int x,int y){ return (x-1)*m+y; } inline bool check(int x,int y){ return 1<=x&&x<=n&&1<=y&&y<=m; } void make_ST(){ for(int j=1;(1<<j)<=n*m;j++) for(int i=1;i+(1<<j)-1<=n*m;i++) st[i][j]=max(st[i][j-1],st[i+(1<<j-1)][j-1]); } inline int Query(int L,int R){ if(L>R) return 0; int t=log2(R-L+1); return max(st[L][t],st[R-(1<<t)+1][t]); } char s[maxn]; int main(){ scanf("%d",&_test); while(_test--){ scanf("%d%d%d",&n,&m,&K); for(int i=1;i<=n;i++){ scanf("%s",s+1); for(int j=1;j<=m;j++) a[i][j]=s[j]-'0'; } for(int i=1;i<=K;i++) scanf("%d%d",&dx[i],&dy[i]); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ st[ID(i,j)][0]=0; for(int k=1;k<=K;k++) if(check(i+dx[k],j+dy[k])) st[ID(i,j)][0]+=a[i+dx[k]][j+dy[k]]; } make_ST(); //for(int i=1;i<=n*m;i++) printf("%d ",st[i][0]); printf("\n"); ans=Query(1,n*m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ b[0]=0; clk++; for(int k=1;k<=K;k++) if(check(i+dx[k],j+dy[k])){ int x=i+dx[k],y=j+dy[k]; vis[x][y]=clk; for(int k2=1;k2<=K;k2++) if(check(x-dx[k2],y-dy[k2])) b[++b[0]]=ID(x-dx[k2],y-dy[k2]); } b[++b[0]]=0; b[++b[0]]=n*m+1; sort(b+1,b+1+b[0]); b[0]=unique(b+1,b+1+b[0])-(b+1); for(int k=1;k<=b[0]-1;k++) ans=max(ans,st[ID(i,j)][0]+Query(b[k]+1,b[k+1]-1)); for(int k=2;k<=b[0]-1;k++){ int res=0, x=(b[k]-1)/m+1, y=(b[k]-1)%m+1; for(int k2=1;k2<=K;k2++) if(check(x+dx[k2],y+dy[k2])&&vis[x+dx[k2]][y+dy[k2]]!=clk) res+=a[x+dx[k2]][y+dy[k2]]; ans=max(ans,st[ID(i,j)][0]+res); } } printf("%d\n",ans); } return 0; }
相关文章推荐
- 51node 1487 占领资源【思维+暴力枚举】
- 51nod 1487 占领资源(RMQ+暴力)
- [51Nod1487]占领资源
- 枚举 51Nod1487 占领资源
- HDU 5726 GCD [ST表+暴力二分]【数据结构|杂类】
- 何从ST官网上下载资源STM32标准库
- 如何从ST官网上下载资源STM32标准库Standard Peripheral LibrariesV3.5.0
- ST发布新款LoRa开发工具,让无线物联网充分利用STM32 MCU生态系统的资源优势
- HDU 5254 棋盘占领(暴力枚举)
- hdu 5254 棋盘占领(百度之星2015初赛2 1003)暴力模拟
- 51Nod-1487-占领资源
- 51nod 1487:占领资源 很好玩很痛苦
- [DP 暴力 || ST表 || 单调队列] BZOJ 1499 [NOI2005]瑰丽华尔兹
- 【HDU5749 BestCoder Round 84C】【ST-RMQ?NO!暴力跳法or单调栈法 + 贡献思维】Colmerauer 所有子矩阵size乘鞍点权值和
- 暴力解hdu4930Fighting the Landlords
- jsp页面加载静态资源404问题
- 通过字符串来使用R下面资源的ID 值
- Qt on Android:资源文件系统qrc与assets
- 代码中获取资源文件中的string,Array
- WPF(四)Application4:程序集资源