北京网赛I题 hiho1391 (树状数组、区间覆盖最大值问题)
题目链接:http://hihocoder.com/problemset/problem/1391
题意:A国和B国向对方分别投射N枚和M枚导弹(发射时间,飞行时间,伤害值),同时两国各自都有防御系统,导弹碰到防御系统会发生反弹。B国防御时间固定,求A国受到的最小伤害。
思路:对于从A国发射的导弹,判断到达B时(a+b)是否在B国防御区间[x , x + Tb]内,如果不在就不用管了,在的话计算出导弹区间[l , r],如果A国防御区间不能覆盖导弹区间,将受到伤害。对B国发射的导弹同理。
处理出每枚导弹的属性后按右区间r排序,将伤害值d存入左端点l中,树状数组维护一下。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define lowbit(x) x&(-x)
using namespace std;
const int N = 2e4 + 10;
int c[N],t[N];
map<int,bool> vis;
struct node
{
int l,r,d;
}q[N];
bool cmp(node a,node b)
{
return a.r < b.r;
}
void update(int pos,int k,int n)
{
while(pos <= n)
{
c[pos] += k;
pos += lowbit(pos);
}
}
int sum(int pos)
{
int res = 0;
while(pos)
{
res += c[pos];
pos -= lowbit(pos);
}
return res;
}
int main()
{
int Ta,Tb,x,n,m;
while(scanf("%d %d %d %d %d",&Ta,&Tb,&x,&n,&m) != EOF)
{
int num = 1, sum0 = 0, num0 = 1, ans = 0;
memset(c,0,sizeof(c));
memset(t,0,sizeof(t));
vis.clear();
for(int i = 1; i <= n; i++)
{
int a,b,d;
scanf("%d %d %d",&a,&b,&d);
if(a + b >= x && a + b <= x + Tb)
{
q[num].l = a + 2*b;
q[num].r = a + 2*b + (x + Tb - a - b)/(2*b) * (2*b);//后半项表示在B国防御系统形成的区间长度(不大于x+Tb-(a+b)且为周期2b的倍数)
q[num].d = d;
if(!vis[q[num].l])
{
t[num0++] = q[num].l;
vis[q[num].l] = 1;
}
sum0 += d;
num++;
}
}
for(int i = 1; i <= m; i++)
{
int a,b,d;
scanf("%d %d %d",&a,&b,&d);
q[num].l = a + b;
if(a + 2*b < x || a + 2*b > x + Tb)
q[num].r = a + b;
else
q[num].r = a + 3*b + (x + Tb - a - 2*b)/(2*b) * (2*b);
q[num].d = d;
if(!vis[q[num].l])
{
t[num0++] = q[num].l;
vis[q[num].l] = 1;
}
sum0 += d;
num++;
}
sort(q + 1, q + num, cmp);
sort(t + 1, t + num0);
for(int i = 1; i < num; i++)
{
int tmp1 = lower_bound(t + 1, t + num0, q[i].r - Ta) - t - 1;
int tmp2 = upper_bound(t + 1, t + num0, q[i].r) - t - 1;
int tmp3 = lower_bound(t + 1, t + num0, q[i].l) - t;
update(tmp3, q[i].d, num0 - 1);
ans = max(ans, sum(tmp2) - sum(tmp1));
}
printf("%d\n",sum0 - ans);
}
return 0;
}
北京网赛I题 hiho1391 (树状数组、区间覆盖最大值问题)的更多相关文章
- 2016北京网络赛 hihocoder 1391 Countries 树状数组
Countries 描述 There are two antagonistic countries, country A and country B. They are in a war, and ...
- 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询
题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...
- hdu 1754 I Hate It(树状数组区间求最值)2007省赛集训队练习赛(6)_linle专场
题意: 输入一行数字,查询第i个数到第j个数之间的最大值.可以修改其中的某个数的值. 输入: 包含多组输入数据. 每组输入首行两个整数n,m.表示共有n个数,m次操作. 接下来一行包含n个整数. 接下 ...
- HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意:n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- 【poj2155】Matrix(二维树状数组区间更新+单点查询)
Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...
- 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询
题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...
- hdu 4638 树状数组 区间内连续区间的个数(尽可能长)
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
随机推荐
- Hibernate的关联映射——单向1-N关联
Hibernate的关联映射--单向1-N关联 单向1-N关联的持久化类里需要使用集合属性.因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现.从这个意义上来看,1-N(实际上还包括N ...
- Redis哈希表的实现要点
Redis哈希表的实现要点 哈希算法的选择 针对不同的key使用不同的hash算法,如对整型.字符串以及大小写敏感的字符串分别使用不同的hash算法: 整型的Hash算法使用的是Thomas Wang ...
- PHP-----数据类型,运算符
文件解析流程: 基本语法: 和Javascript很像.Ps:变量名可以使用关键字,但是最好不建议使用.关于PHP和HTML的混编,写起来可能比较方便,但是不便于阅读. 数据类型: 其中的资源类型是一 ...
- 《BI项目笔记》无法解密受保护的 XML 节点“DTS:Password” 解决办法
说明: 无法解密受保护的 XML 节点“DTS:Password”,错误为 0x8009000B“该项不适于在指定状态下使用.”.可能您无权访问此信息.当发生加密错误时会出现此错误.请确保提供正确的密 ...
- rest版的webservice
为了学习app做打算 今天就自学了下webservice,rest应该是其中一种 还有种就是soap,目前就先举个rest的demo吧 准备ws的jar和spring的jar,如何要连接数据的话就自行 ...
- java 获取项目绝对路径
String classPath = Thread.currentThread().getContextClassLoader().getResource("").getPath( ...
- javascript复习总结
改变HTML内容:document.getElementById(id).innerHTML = new HTML; 改变HTML属性:document.getElementById(id).inne ...
- ios基础篇(十一)——UINavgationController的使用(二)页面切换
上篇说到了添加UIBarButtonItem,接下来说说界面切换: 1.首先我们在刚才的RootViewController中添加一个按钮用来实现跳转: 打开RootViewController.m( ...
- iOS开发UI篇—UITableviewcell的性能优化和缓存机制
iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...
- Android的学习——ubuntu下android5.1源码的make编译
在repo sync下载源码后,经历了漫长的时间,终于可以进行下一步了. 在进行make之前还需要三个步骤. 1> source build/envsetup.sh:加载命令 ...