Codeforces Round #291 (Div. 2)D.R2D2 and Droid Army——RMQ+二分
2015-02-21 22:50
330 查看
http://codeforces.com/contest/514
n个机器人,每个机器人有m个属性,有k发子弹,每发子弹可以使所有机器人的某个属性减一。当某个机器人的m个属性都变为0时,该机器人视为被摧毁。
求在某段连续区间内消灭机器人数目最多的条件下,机器人的每个属性所需要的子弹数
先二分枚举最长的连续区间,然后根据所得的区间长度,求出某个可行解
O( mn(logn)^2 )
265 ms 49324 KB
n个机器人,每个机器人有m个属性,有k发子弹,每发子弹可以使所有机器人的某个属性减一。当某个机器人的m个属性都变为0时,该机器人视为被摧毁。
求在某段连续区间内消灭机器人数目最多的条件下,机器人的每个属性所需要的子弹数
先二分枚举最长的连续区间,然后根据所得的区间长度,求出某个可行解
O( mn(logn)^2 )
265 ms 49324 KB
[code]#include<bits/stdc++.h> const int maxn=1e5+10; using namespace std; int n,m,K; int dp[6][maxn][20]; int a[maxn][6]; int res[6],fres[6]; void RMQ(){ for(int i=1;i<=n;++i){ for(int j=1;j<=m;++j){ dp[j][i][0]=a[i][j]; } } for(int j=1;(1<<j)<=n;++j){ for(int i=1;i+(1<<j)-1<=n;++i){ for(int k=1;k<=m;++k){ dp[k][i][j]=max(dp[k][i][j-1],dp[k][i+(1<<(j-1))][j-1]); } } } } int query(int i,int L,int R){ int k=0; while((1<<(k+1))<=R-L+1) k++; return max(dp[i][L][k],dp[i][R-(1<<k)+1][k]); } bool ok(int x){ for(int p=1;p+x-1<=n;++p){ int sum=0; for(int i=1;i<=m;++i){ fres[i]=query(i,p,p+x-1); sum+=fres[i]; } if(sum<=K){ for(int i=1;i<=m;++i) res[i]=fres[i]; return true; } } return false; } int main() { scanf("%d%d%d",&n,&m,&K); for(int i=1;i<=n;++i){ for(int j=1;j<=m;++j){ scanf("%d",&a[i][j]); } } RMQ(); int l=0,r=n; while(l<r){ int mid=(l+r)>>1; if(ok(mid)) l=mid+1; else r=mid-1; } for(int i=1;i<=m;++i){ printf("%d ",res[i]); } return 0; }
[code]#include<bits/stdc++.h> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn=1e5+10; using namespace std; int n,m,k; int mx[6][maxn<<2]; int res[6]; void push_up(int rt){ for(int i=1;i<=m;++i){ mx[i][rt]=max(mx[i][rt<<1],mx[i][rt<<1|1]); } } void build(int l,int r,int rt){ if(l==r){ for(int i=1;i<=m;++i) scanf("%d",&mx[i][rt]); return ; } int m=(l+r)>>1; build(lson); build(rson); push_up(rt); } int query(int i,int L,int R,int l,int r,int rt){ if(L<=l&&r<=R) return mx[i][rt]; int m=(l+r)>>1; int maxx=-1; if(L<=m) maxx=max(maxx,query(i,L,R,lson)); if(m<R) maxx=max(maxx,query(i,L,R,rson)); return maxx; } bool ok(int len){ for(int p=1;p+len-1<=n;++p){ int sum=0; for(int i=1;i<=m;++i){ sum+=query(i,p,p+len-1,1,n,1); } if(sum<=k) return true; } return false; } int main() { scanf("%d%d%d",&n,&m,&k); build(1,n,1); int l=0,r=n+1; while(r-l>1){ int mid=(l+r)>>1; if(ok(mid)) l=mid; else r=mid; } for(int p=1;p+l-1<=n&&l;++p){ int sum=0; for(int i=1;i<=m;++i){ int tmp=query(i,p,p+l-1,1,n,1); res[i]=tmp; sum+=tmp; } if(sum<=k) break; } for(int i=1;i<=m;++i){ printf("%d ",res[i]); } printf("\n"); return 0; }
相关文章推荐
- Codeforces #291 (Div. 2) D. R2D2 and Droid Army(RMQ+二分)
- cf291 div2 D. R2D2 and Droid Army 二分+RMQ
- Codeforces Round #291 (Div. 2)-D. R2D2 and Droid Army(RMQ)
- 【打CF,学算法——四星级】CodeForces 514D R2D2 and Droid Army (RMQ+二分)
- Codeforces Round #291 (Div. 2) D R2D2 and Droid Army(线段树+二分)
- 文章标题 coderforces 514D : R2D2 and Droid Army (二分+RMQ预处理)
- Codeforces Round #291 (Div. 2) D. R2D2 and Droid Army RMQ/单调队列/尺取法
- Codeforces 514 D R2D2 and Droid Army(RMQ+二分)
- D. R2D2 and Droid Army 线段树+二分 Codeforces Round #291 (Div. 2)
- Codeforces 514D R2D2 and Droid Army【二分+RMQ】
- Codeforces Round #291 (Div. 2)D. R2D2 and Droid Army (线段树+二分)
- RMQ -- ST算法 Codeforces Round #291 (Div. 2) D. R2D2 and Droid Army
- R2D2 and Droid Army - CodeForces 514 D 二分
- Codeforces 514D R2D2 and Droid Army RMQ问题
- Codeforces Round #291 (Div. 2)---D. R2D2 and Droid Army
- 【Cf #291 B】R2D2 and Droid Army(二分,线段树)
- D. R2D2 and Droid Army(二分加多维线段树查询区间最大值)
- 线段树+二分(Codeforces Round #291 (Div. 2)D. R2D2 and Droid Army)
- Codeforces Round #291 (Div. 2)D. R2D2 and Droid Army
- CodeForces - 514D :R2D2 and Droid Army(二分、暴力)