题目:http://hihocoder.com/problemset/problem/1391

题目大意:

  A和B两个国家互射导弹,每个国家都有一个防御系统,在防御系统开启的时间内可以将到达本国的导弹反弹回去(掉头,防御系统不能开开关关)。

  现在已知:Ta、Tb为A、B两国导弹防御能开启的持续时间,X为B国开启导弹防御系统的时刻(持续时间为[X,Tb+X],包含端点)

  A向B发射N枚导弹,B向A发射M枚导弹。每枚导弹有3个值:发射时间,从A到B或从B到A的飞行时间,伤害值。

  现在A可以在任意时刻开启防御系统,求A所受到的最小伤害值。

题目思路:

  【预处理+排序+堆】

  首先预处理,求出每枚导弹不会打到A需要A国防御系统开启的时间段[st,et],只有A开启防御的时间段[Y,Y+Ta]包含[st,et]那么这枚导弹不会打到A。

  预处理之后将每枚导弹按照et从小到大排序。

  从1到n+m枚导弹,对于当前这枚导弹,如果需要被防御,那么A防御系统的结束时间就为et,那么开启时间就为et-Ta

  那么将之前已经被防御的导弹中st<et-Ta的移除出去,表示这些导弹不能在当前决策中被防御。

  可以开个STL的优先队列或者堆记录之前被防御的导弹序号,按照st从小到大存,每次比较最小的st和开启时间et-Ta。并在过程中增减伤害值,并记录最小伤害。

 //#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<bitset>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define mem(a,b) memset(a,b,sizeof(a))
#define eps (1e-10)
#define J 10000
#define mod 1000000007
#define MAX 0x7f7f7f7f
#define PI 3.14159265358979323
#define N 20004
using namespace std;
typedef long long LL;
double anss;
LL aans;
int cas, cass;
int n, m, lll, ans;
int Ta, Tb, X, sum;
struct xxx
{
LL st, ct, et, d;
}a[N], b[N];
struct cmp1
{
bool operator ()(const int &aa, const int &bb)
{
return a[aa].st > a[bb].st;
}
};
bool cmp(xxx aa, xxx bb)
{
return aa.et < bb.et;
}
int main()
{
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
int i, j, k;
int x, y, z;
while (~scanf("%d%d", &Ta, &Tb))
{
lll = ; ans = MAX; sum = ;
scanf("%d%d%d", &X, &n, &m);
for (i = ; i <= n; i++)
{
scanf("%d%d%d", &b[i].st, &b[i].ct, &b[i].d);
b[i].et = b[i].st + b[i].ct;
if (b[i].et >= X && b[i].et <= X + Tb)
{
sum += b[i].d;
a[++lll].st = b[i].et + b[i].ct;
j = Tb + X - a[lll].st;
j = j % ( * b[i].ct);
a[lll].et = Tb + X - j;
a[lll].d = b[i].d;
if (j >= b[i].ct)a[lll].et += b[i].ct + b[i].ct;
if (a[lll].st + b[i].ct<X || a[lll].st>Tb + X)a[lll].et = a[lll].st;
}
}
for (i = ; i <= m; i++)
{
scanf("%d%d%d", &b[i].st, &b[i].ct, &b[i].d);
b[i].et = b[i].st + b[i].ct;
sum += b[i].d;
a[++lll].st = b[i].et;
j = Tb + X - a[lll].st;
j = j % ( * b[i].ct);
a[lll].et = Tb + X - j;
a[lll].d = b[i].d;
if (j >= b[i].ct)a[lll].et += b[i].ct + b[i].ct;
if (a[lll].st + b[i].ct<X || a[lll].st>Tb + X)a[lll].et = a[lll].st;
}
sort(a + , a + lll + , cmp);
priority_queue<int, vector<int>, cmp1>q; for (i = ; i <= lll; i++)
{
q.push(i); y = a[i].et;
sum -= a[i].d;
x = q.top();
while (y - a[x].st > Ta && !q.empty())
{
sum += a[x].d;
q.pop(); x = q.top();
}
ans = min(ans, sum);
}
printf("%d\n", ans);
}
return ;
}

hihoCoder 1391 Countries【预处理+排序+优先队列】2016北京网络赛的更多相关文章

  1. 2016北京网络赛 hihocoder 1391 Countries 树状数组

    Countries   描述 There are two antagonistic countries, country A and country B. They are in a war, and ...

  2. 离线树状数组 hihocoder 1391 Countries

    官方题解: // 离线树状数组 hihocoder 1391 Countries #include <iostream> #include <cstdio> #include ...

  3. hihocoder1236(北京网络赛J):scores 分块+bitset

    北京网络赛的题- -.当时没思路,听大神们说是分块+bitset,想了一下发现确实可做,就试了一下,T了好多次终于过了 题意: 初始有n个人,每个人有五种能力值,现在有q个查询,每次查询给五个数代表查 ...

  4. HDU 5880 Family View (2016 青岛网络赛 C题,AC自动机)

    题目链接  2016 青岛网络赛  Problem C 题意  给出一些敏感词,和一篇文章.现在要屏蔽这篇文章中所有出现过的敏感词,屏蔽掉的用$'*'$表示. 建立$AC$自动机,查询的时候沿着$fa ...

  5. 2015北京网络赛 D-The Celebration of Rabbits 动归+FWT

    2015北京网络赛 D-The Celebration of Rabbits 题意: 给定四个正整数n, m, L, R (1≤n,m,L,R≤1000). 设a为一个长度为2n+1的序列. 设f(x ...

  6. 2015北京网络赛 J Scores bitset+分块

    2015北京网络赛 J Scores 题意:50000组5维数据,50000个询问,问有多少组每一维都不大于询问的数据 思路:赛时没有思路,后来看解题报告也因为智商太低看了半天看不懂.bitset之前 ...

  7. 2015北京网络赛 Couple Trees 倍增算法

    2015北京网络赛 Couple Trees 题意:两棵树,求不同树上两个节点的最近公共祖先 思路:比赛时看过的队伍不是很多,没有仔细想.今天补题才发现有个 倍增算法,自己竟然不知道.  解法来自 q ...

  8. hihoCoder 1391 Countries 【预处理+排序+堆】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)

    #1391 : Countries 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are two antagonistic countries, countr ...

  9. hihoCoder #1388 : Periodic Signal ( 2016 acm 北京网络赛 F题)

    时间限制:5000ms 单点时限:5000ms 内存限制:256MB 描述 Profess X is an expert in signal processing. He has a device w ...

随机推荐

  1. Access an instance through a console

    VNC or SPICE is used to view the console output of an instance, regardless of whether or not the con ...

  2. Oracle 级联删除

    alter table ForeignTable(附表)add constraint fk_MainTable_ForeignTable(关联表中的外键) foreign key(ForeignTab ...

  3. JQuery 遍历 - prev() 方法

    http://www.w3school.com.cn/jquery/traversing_prev.asp http://www.w3school.com.cn/jquery/jquery_ref_t ...

  4. ADO.NET中的五个主要对象

    Connection:主要是开启程序和数据库之间的连接.没有利用连接对象将数据库打开,是无法从数据库中取得数据的.Close和Dispose的区别,Close以后还可以Open,Dispose以后则不 ...

  5. 【leetcode】Fraction to Recurring Decimal

    Fraction to Recurring Decimal Given two integers representing the numerator and denominator of a fra ...

  6. Unity3d 鼠标拣选小功能集合

    最近在做一些优化工具,把鼠标拣选的功能单独抽出来. 可遍历所有选中的某类型资源,会递归文件夹 可编译所有prefab的某个Component,也是递归的 using UnityEngine; usin ...

  7. MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】

    概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...

  8. Maven 3.3.3 Win10环境下的使用实例(上)

    Maven是一个项目管理和构建自动化工具,在使用之前,请按照Apache官网提供的指南进行环境变量配置. 完成后在PowerShell中输入如下命令来验证Maven的部署情况: mvn -v 正常的响 ...

  9. shell脚本监控MySQL服务是否正常

    监控MySQL服务是否正常,通常的思路为:检查3306端口是否启动,ps查看mysqld进程是否启动,命令行登录mysql执行语句返回结果,php或jsp程序检测(需要开发人员开发程序)等等: 方法1 ...

  10. Centos 用户登录失败N次后锁定用户禁止登陆

    针对linux上的用户,如果用户连续3次登录失败,就锁定该用户,几分钟后该用户再自动解锁 Linux有一个pam_tally2.so的PAM模块,来限定用户的登录失败次数,如果次数达到设置的阈值,则锁 ...