【题目链接】:http://codeforces.com/contest/514/problem/D

【题意】



给你每个机器人的m种属性p1..pm

然后r2d2每次可以选择m种属性中的一种,进行一次攻击;

攻击过后每个机器人的该种属性都减少1;

可以最多攻击k次;

机器人只有m种属性都变为0之后才死掉;

然后问你如何分配这k次攻击,每次攻击时选择的属性;

使得连续的死掉的机器人的区间长度最长;

【题解】



对于选择的一个区间[l..r]

如果要使得这个区间的机器人全都死掉;

则需要攻击的次数就为

max(a[l..r][1])+max(a[l..r][2])+...+max(a[l..r][m])

因为某一种属性的在这个区间的最大值如果都变成0了,那么其他的也就变成0了;

则问题就是RMQ问题了;

然后写个二分;

枚举左端点,二分右端点;

上面那个值小于等于k就符合,增大右端点

否则减小右端点

写了个ST算法的。没写线段树



【Number Of WA】



0



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define ps push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)
#define ms(x,y) memset(x,y,sizeof x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1e5+100;
const int M = 5+3;
const int maxpow = 20; int n,m,k;
int a[M][N],two[maxpow];
int f[M][N][maxpow],need[N];
int ans[M],len,temp[M]; int main()
{
//freopen("F:\\rush.txt","r",stdin);
rei(n),rei(m),rei(k);
rep1(i,1,n)
rep1(j,1,m)
rei(a[j][i]);
two[0] = 1;
rep1(i,1,17)
two[i] = two[i-1]*2;
need[1] = 0;
int now = 1;
rep1(i,2,100000)
if (i==two[now])
{
now++;
need[i]=need[i-1]+1;
}
else
need[i]=need[i-1];
rep1(i,1,m)
rep1(j,1,n)
f[i][j][0] = a[i][j];
rep1(k,1,m)
{
for (int l = 1;two[l]<=n;l++)
{
rep1(i,1,n)
{
if (i+two[l]-1>n) break;
int j = i+two[l]-1;
f[k][i][l] = max(f[k][i][l-1],f[k][j-two[l-1]+1][l-1]);
}
}
}
rep1(i,1,n)
{
int l = i,r = n;
while (l <= r)
{
int mid = (l+r)>>1;
//i..mid
int cd = need[mid-i+1],cost = 0;
rep1(j,1,m)
{
temp[j] = max(f[j][i][cd],f[j][mid-two[cd]+1][cd]);
cost+=temp[j];
}
if (cost<=k)
{
if (mid-i+1>len)
{
rep1(j,1,m)
ans[j] = temp[j];
len = mid-i+1;
}
l = mid+1;
}
else
r = mid-1;
}
}
rep1(i,1,m)
printf("%d ",ans[i]);
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}

【codeforces 514D】R2D2 and Droid Army的更多相关文章

  1. 【Cf #291 B】R2D2 and Droid Army(二分,线段树)

    因为题目中要求使连续死亡的机器人最多,令人联想到二分答案. 考虑如何检验这之中是否存在一段连续的长度为md的区间,其中花最多k步使得它们都死亡. 这个条件等价于区间中m个最大值的和不超过k. 枚举起点 ...

  2. Codeforces 514 D R2D2 and Droid Army(RMQ+二分法)

    An army of n droids is lined up in one row. Each droid is described by m integers a1, a2, ..., am, w ...

  3. Codeforces 514 D R2D2 and Droid Army(Trie树)

    题目链接 大意是判断所给字符串组中是否存在与查询串仅一字符之差的字符串. 关于字符串查询的题,可以用字典树(Trie树)来解,第一次接触,做个小记.在查询时按题目要求进行查询. 代码: #define ...

  4. Codeforces Round #291 (Div. 2) D. R2D2 and Droid Army [线段树+线性扫一遍]

    传送门 D. R2D2 and Droid Army time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  5. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  6. R2D2 and Droid Army(多棵线段树)

    R2D2 and Droid Army time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. 【codeforces 546E】Soldier and Traveling

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  8. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  9. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

随机推荐

  1. iOS开发】之CocoaAsyncSocket使用

    本文介绍了CocoaAsyncSocket库中GCDAsyncSocket类的使用.粘包处理以及时间延迟测试. 一.CocoaAsyncSocket介绍 CocoaAsyncSocket中主要包含两个 ...

  2. BZOJ 3343: 教主的魔法(分块+二分查找)

    BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved:  ...

  3. 洛谷P1193 洛谷团队训练VS传统团队训练

    题目背景 "在中学的信息学教育领域,洛谷无疑是一个相当受欢迎的辅助网站.同时有百余所学校正在通过洛谷进行信息学竞赛(以后简称OI)的教育.洛谷之所以如此受欢迎,是因为洛谷创新的将OI教育的几 ...

  4. jQuery的jsop,jsonp跨域请求

    https://www.cnblogs.com/chiangchou/p/jsonp.html

  5. PCB SQL Server 触发器应用实例

    这里以实际例子对触发器的应用对触发器的理解与应用来得更实际 一.更新触发器(Update) 临时表:inserted表有数据(新数据)     Deleted表有数据(旧数据) 实例说明:当表更新时, ...

  6. hdu1814Peaceful Commission(2-SAT)

    Peaceful Commission Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  7. Akka源码分析-Event Bus

    akka中的EventBus其实是不常用,也最容易被忽略的一个组件. 但如果你深入Cluster的实现就会发现,这个东西其实还挺有用的,而且它是ActorSystem系统中所有事件消息的一个横切面,通 ...

  8. Java经典算法之冒泡排序(Bubble Sort)

    原理:比较相邻的两个值,将值大的元素交换至右端 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数 ...

  9. Scaffold-DbContext-EFCore DB First

    在使用 Scaffold-DbContext迁移数据库的时候会遇到两个问题. 一.文件已存在,其实报错很明显,增加 -force即可. 二.大小写转换,不和数据库一样了,如果要保持和数据库一致.增加  ...

  10. 开始玩qt,使用代码修改设计模式生成的菜单

    之前制作菜单时,不是纯代码便是用设计模式 直接图形化完成. 今天我就是想用代码修改已经存在的菜单项,如果是用代码生成的可以直接调用指针完成: 但通过设计模式完成的没有暴露指针给我,至少我没发现. 在几 ...