R2D2 and Droid Army CodeForces - 514D (rmq+二分)

R2D2 and Droid Army CodeForces - 514D
题意:n个机器人,所有机器人每个都有m种属性。有m种,你可以选择一种武器攻击一种属性,使所有机器人的这个属性-1.当机器人的所有属性小于等于0时,算做击败。有k次攻击机会。求能连续击败的机器人最多时,如何选择武器。

解题思路:可以发现,一个区间里的机器人是否被击败,只与这个区间的最大值属性有关。所以可以用rmq储存区间属性最大值。最后使用2分查找合法(消灭这个区间里的机器人且费用不超过k)且区间最长的武器分配方案。感觉讲的不是很明白,配合代码应该能理解透彻。。

错误原因:训练赛的时候不知道为什么,把这个想成了dp,01背包,取或不取。但是这道题显然不是01背包。但显然,如果这道题要用01背包去做的话,k那么大,而且无法离散化,是会me的。然后自己就一直在想dp怎么去做。其实如果这种情况完全可以重新想的。然后自己敲的时候很丢人地调了很久的二分orz。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define LL long long
#define MT(a,b) memset(a,b,sizeof(a))
const int mod=10007;
const int maxn=5e4+5;
const int ONF=-0x3f3f3f3f;
const int INF=0x3f3f3f3f;
int n,m,k;
int flag_l,flag_r;
int dp[100005][5][20];
void rmq(){
    MT(dp,0);
    for (int i=1;i<=n;i++){
        for (int j=1;j<=m;j++){
            scanf("%d",&dp[i][j][0]);
        }
    }
    for (int j=1;(1<<j)<=n;j++){
        for (int i=1;i+(1<<j)-1<=n;i++){
            for (int t=1;t<=m;t++){
                dp[i][t][j]=max(dp[i][t][j-1],dp[i+(1<<(j-1))][t][j-1]);
            }
        }
    }
}

int search(int l,int r){
    int p=log2(r-l+1);
    int ans=0;
    for (int j=1;j<=m;j++){
        ans+=max(dp[l][j][p],dp[r-(1<<p)+1][j][p]);
    }
    return ans;
}

void Print(int l,int r){
    int p=log2(r-l+1);
    for (int j=1;j<=m;j++){
        printf("%d ",max(dp[l][j][p],dp[r-(1<<p)+1][j][p]));
    }
    printf("\n");
}
int main (){
    while (~scanf("%d%d%d",&n,&m,&k)){
        rmq();
        int ans=0;
        for (int i=1;i<=n;i++){
           int l=1,r=i;
           while (l<=r){
               int mid=(l+r)>>1;
               int tmp=search(mid,i);
               if (tmp<=k){
                   if (ans<(i-mid+1)){
                       ans=i-mid+1;
                       flag_l=mid,flag_r=i;
                   }
                   r=mid-1;
               } else{
                   l=mid+1;
               }
           }
        }
        Print(flag_l,flag_r);
    }
    return 0;
}

你可能感兴趣的:(R2D2 and Droid Army CodeForces - 514D (rmq+二分))