R2D2 and Droid Army(多棵线段树)
R2D2 and Droid Army
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
An army of n droids is lined up in one row. Each droid is described by m integers a1, a2, …, am, where ai is the number of details of the i-th type in this droid’s mechanism. R2-D2 wants to destroy the sequence of consecutive droids of maximum length. He has m weapons, the i-th weapon can affect all the droids in the army by destroying one detail of the i-th type (if the droid doesn’t have details of this type, nothing happens to it).
A droid is considered to be destroyed when all of its details are destroyed. R2-D2 can make at most k shots. How many shots from the weapon of what type should R2-D2 make to destroy the sequence of consecutive droids of maximum length?
Input
The first line contains three integers n, m, k (1 ≤ n ≤ 105, 1 ≤ m ≤ 5, 0 ≤ k ≤ 109) — the number of droids, the number of detail types and the number of available shots, respectively.
Next n lines follow describing the droids. Each line contains m integers a1, a2, …, am (0 ≤ ai ≤ 108), where ai is the number of details of the i-th type for the respective robot.
Output
Print m space-separated integers, where the i-th number is the number of shots from the weapon of the i-th type that the robot should make to destroy the subsequence of consecutive droids of the maximum length.
If there are multiple optimal solutions, print any of them.
It is not necessary to make exactly k shots, the number of shots can be less.
Sample test(s)
Input
5 2 4
4 0
1 2
2 1
0 2
1 3
Output
2 2
Input
3 2 4
1 2
1 3
2 2
Output
1 3
Note
In the first test the second, third and fourth droids will be destroyed.
In the second test the first and second droids will be destroyed.
**题意:有n*m的矩阵,然后你有k发子弹。现在你可以朝着任意列发射子弹,每一发子弹都会使该列上的数值-1,最小减少到0。
现在问你连续最长的行数,在k发子弹内,使得这些行上的数值全部为0.**
思路:以每一列为一颗线段树(m<6),在查找每一个列的某个区间的最大值和与k进行比较,暴力选出最大的区间,并记录这个区间的各列的区间最大值
#include <set>
#include <map>
#include <list>
#include <stack>
#include <cmath>
#include <queue>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define PI cos(-1.0)
#define RR freopen("input.txt","r",stdin)
using namespace std;
typedef long long LL;
const int MAX = 1e5;
int Tree[6][4*MAX];
int n,m,k;
int QMax[6];
int Ans[6];
void Update(int pos,int L,int R,int site,int s,int ans)//建树
{
if(L==R)
{
Tree[pos][site]=ans;
return ;
}
int mid = (L+R)>>1;
if(s<=mid)
{
Update(pos,L,mid,site<<1,s,ans);
}
else
{
Update(pos,mid+1,R,site<<1|1,s,ans);
}
Tree[pos][site]=max(Tree[pos][site<<1],Tree[pos][site<<1|1]);
}
void Query(int L,int R,int l,int r,int site)//查询
{
if(l<=L&&r>=R)
{
for(int i=1;i<=m;i++)
{
QMax[i]=max(QMax[i],Tree[i][site]);
}
return ;
}
int mid=(L+R)>>1;
if(l<=mid)
{
Query(L,mid,l,r,site<<1);
}
if(r>mid)
{
Query(mid+1,R,l,r,site<<1|1);
}
}
int main()
{
int data;
scanf("%d %d %d",&n,&m,&k);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&data);
Update(j,1,n,1,i,data);
}
}
int l=1,r=1,Max=0;
bool flag;
for(r=1;r<=n;r++)
{
flag=false;
while(!flag)
{
memset(QMax,0,sizeof(QMax));
Query(1,n,l,r,1);
LL sum=0;
for(int i=1;i<=m;i++)
{
sum+=QMax[i];
}
if(sum<=k)
{
flag=true;
}
else
{
l++;
}
}
if(Max<(r-l+1))
{
memcpy(Ans,QMax,sizeof(Ans));
Max=(r-l+1);
}
}
for(int i=1;i<=m;i++)
{
printf("%d ",Ans[i]);
}
return 0;
}
R2D2 and Droid Army(多棵线段树)的更多相关文章
- 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 ...
- cf276E 两棵线段树分别维护dfs序和bfs序,好题回头再做
搞了一晚上,错了,以后回头再来看 /* 对于每次更新,先处理其儿子方向,再处理其父亲方向 处理父亲方向时无法达到根,那么直接更新 如果能达到根,那么到兄弟链中去更新,使用bfs序 最后,查询结点v的结 ...
- UVA - 12424 Answering Queries on a Tree(十棵线段树的树链剖分)
You are given a tree with N nodes. The tree nodes are numbered from 1 to N and have colors C1, C2,. ...
- CodeForces - 960F Pathwalks —— 主席树(n棵线段树)
题目链接:https://vjudge.net/problem/CodeForces-960F You are given a directed graph with n nodes and m ed ...
- Codeforces J. A Simple Task(多棵线段树)
题目描述: Description This task is very simple. Given a string S of length n and q queries each query is ...
- 【Cf #291 B】R2D2 and Droid Army(二分,线段树)
因为题目中要求使连续死亡的机器人最多,令人联想到二分答案. 考虑如何检验这之中是否存在一段连续的长度为md的区间,其中花最多k步使得它们都死亡. 这个条件等价于区间中m个最大值的和不超过k. 枚举起点 ...
- 【codeforces 514D】R2D2 and Droid Army
[题目链接]:http://codeforces.com/contest/514/problem/D [题意] 给你每个机器人的m种属性p1..pm 然后r2d2每次可以选择m种属性中的一种,进行一次 ...
- hdu4267线段树段更新,点查找,55棵线段树.
题意: 给你N个数,q组操作,操作有两种,查询和改变,查询就是查询当前的这个数上有多少,更改是给你a b k c,每次从a到b,每隔k的数更改一次,之间的数不更改,就相当于跳着更新. 思路: ...
- hdu 5861 Road 两棵线段树
传送门:hdu 5861 Road 题意: 水平线上n个村子间有 n-1 条路. 每条路开放一天的价格为 Wi 有 m 天的操作,每天需要用到村子 Ai~Bi 间的道路 每条路只能开放或关闭一次. ( ...
随机推荐
- PHP判断手机号码是否合法
<html> <head> <script language="JavaScript"> function checkMobile(input) ...
- ACM常用算法及练习(2)
ACM常用算法及练习 知识类型 重要度 容易度 应掌握度 典型题 其他 数据结构(5) 链表 ★★☆ ★★★ ★★☆ 栈 stack ★★★ ★★★ ★★★ HLoj120 ...
- Java基础(5):试用Array类对数据进行操作(Sort和toString方法)
Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等 1. 排序 语法: Arrays.sort(数 ...
- extjs 常见的小问题
今天,小白就来总结下extjs的使用的时候的各种小问题或者说是小技巧.希望能够给各位刚接触extjs的朋友一点帮助. 1.当存在store的各种组件的store的autoload属性为false的时候 ...
- PHP中的赋值运算符
PHP的赋值运算符有两种,分别是: (1)“=”:把右边表达式的值赋给左边的运算数.它将右边表达式值复制一份,交给左边的运算数.换而言之,首先给左边的运算数申请了一块内存,然后把复制的值放到这个内存中 ...
- linux for java programer
http://www.kancloud.cn/digest/javaxviii/126781 .查找文件 find / -name filename.txt根据名称查找/目录下的filename.tx ...
- docker 批量删除容器
docker rm `docker ps -a |awk '{print $1}' | grep [0-9a-z]`
- PAT乙级 1023. 组个最小数 (20)
1023. 组个最小数 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定数字0-9各若干个.你可以以 ...
- zw·准专利·高保真二值图细部切分算法
zw·准专利·高保真二值图细部切分算法 高保真二值图细部切分算法,是中国字体协会项目的衍生作品. 说准专利算法,是因为对于图像算法的标准不了解,虽然报过专利,但不是这方面的,需要咨询专 ...
- 对EV-Globe5.0资源体系的简单理解
如果直接从OpenGL或DirectX底层做起的话,根本就不存在资源管理这一个思想.所谓的资源,就是说内容要从文件读取为我所用的那些文件,所以我们看到的更多的是模型.骨骼.材质.着色器. ...