Codeforces 1321E World of Darkraft: Battle for Azathoth
题意
有\(n\)个武器,第\(i\)个武器攻击力为\(a_i\),价值\(ca_i\)。
有\(m\)个防具,第\(i\)个防具防御力为\(b_i\),价值\(cb_i\)。
有\(p\)个怪,第\(i\)个怪攻击力为\(x_i\),防御力为\(y_i\),价值\(z_i\)。
可以选择\(1\)个武器和\(1\)个防具,假设选择第\(i\)个武器和第\(j\)个防具,那么你需要花费\(a_i+b_j\),且可以杀死所有满足攻击力小于\(a_i\)且防御力小于\(b_j\)的怪,并获得这些怪物的价值。
问怎么选择从而使收益最大。
注意必须选择1个武器和1个防具。
解题思路
用权值线段树维护防具,表示选择防御力为\(i\)的防具的收益,初始值为代价的负数。
枚举攻击力,将所有攻击力小于当前枚举值的怪都加入到权值线段树中,加入是为区间加操作,范围是\(\left[当前怪的防御力+1,防御力的最大值\right]\)。注意这里怪可以按照攻击力升序排序以降低复杂度。
现在,权值线段树中的最大值减去选择当前攻击力的代价就是选择当前攻击力的最大收益。在枚举攻击力的过程中更新最大收益即可。
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define endl '\n'
const double PI=acos(-1.0);
namespace IO{
bool REOF = 1;//为0表示文件结尾
inline char nc() {
static char buf[100000], *p1 = buf, *p2 = buf;
return p1 == p2 && REOF && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? (REOF = 0, EOF) : *p1++;
}
template<class T>
inline bool read(T &x) {
if(!REOF)return false;
char c = nc();bool f = 0; x = 0;
while (c<'0' || c>'9')c == '-' && (f = 1), c = nc();
while (c >= '0'&&c <= '9')x = (x << 3) + (x << 1) + (c ^ 48), c = nc();
if(f)x=-x;
return true;
}
template<typename T, typename... T2>
inline bool read(T &x, T2 &... rest) {
if(!REOF)return false;
read(x);
return read(rest...);
}
inline bool need(char &c) { return ((c >= 'a') && (c <= 'z')) || ((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'Z')); }
// inline bool need(char &c) { return ((c >= 'a') && (c <= 'z')) || ((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'Z')) || c==' '; }
inline bool read_str(char *a) {
if(!REOF)return false;
while ((*a = nc()) && need(*a) && REOF)++a; *a = '\0';
return true;
}
inline bool read_dbl(double &x){
if(!REOF)return false;
bool f = 0; char ch = nc(); x = 0;
while(ch<'0'||ch>'9') {f|=(ch=='-');ch=nc();}
while(ch>='0'&&ch<='9'){x=x*10.0+(ch^48);ch=nc();}
if(ch == '.') {
double tmp = 1; ch = nc();
while(ch>='0'&&ch<='9'){tmp=tmp/10.0;x=x+tmp*(ch^48);ch=nc();}
}
if(f)x=-x;
return true;
}
template<class TH> void _dbg(const char *sdbg, TH h){ cerr<<sdbg<<'='<<h<<endl; }
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
while(*sdbg!=',')cerr<<*sdbg++;
cerr<<'='<<h<<','<<' '; _dbg(sdbg+1, a...);
}
template<class T> ostream &operator<<(ostream& os, vector<T> V) {
os << "["; for (auto vv : V) os << vv << ","; return os << "]";
}
template<class L, class R> ostream &operator<<(ostream &os, pair<L,R> P) {
return os << "(" << P.st << "," << P.nd << ")";
}
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
}
using namespace IO;
const int maxn=2e5+5;
const int maxv=1e6+5;
const int mod=998244353; // 998244353 1e9+7
const ll INF=0x3f3f3f3f3f3f3f3f; // 1e9+7 0x3f3f3f3f 0x3f3f3f3f3f3f3f3f
const double eps=1e-12;
int dx[4]={0,1,0,-1};
//int dx[8]={1,0,-1,1,-1,1,0,-1};
int dy[4]={1,0,-1,0};
//int dy[8]={1,1,1,0,0,-1,-1,-1};
#define ls (x<<1)
#define rs (x<<1|1)
#define mid ((l+r)>>1)
#define lson ls,l,mid
#define rson rs,mid+1,r
/**
* ********** Backlight **********
* 仔细读题
* 注意边界条件
* 记得注释输入流重定向
* 没有思路就试试逆向思维
* 加油,奥利给
*/
int n,m,p;
struct weapon{
int a,ca;
}a[maxn];
ll A[maxv];
struct armor{
int b,cb;
}b[maxn];
ll B[maxv];
struct monster{
int x,y,z;
bool operator<(const monster& r){
if(x==r.x)return y<r.y;
return x<r.x;
}
}c[maxn];
ll ma[maxv<<2],tag[maxv<<2];
void change(int x,int val){
ma[x]+=val; tag[x]+=val;
}
void push_up(int x){
ma[x]=max(ma[ls],ma[rs]);
}
void push_down(int x){
if(tag[x]){
change(ls,tag[x]); change(rs,tag[x]);
tag[x]=0;
}
}
void build(int x,int l,int r){
if(l==r){
ma[x]=-B[l];
return;
}
build(lson); build(rson);
push_up(x);
}
void update(int x,int l,int r,int L,int R,int val){
if(l==L && r==R){
change(x,val);
return;
}
push_down(x);
if(R<=mid)update(lson,L,R,val);
else if(L>mid)update(rson,L,R,val);
else{
update(lson,L,mid,val);
update(rson,mid+1,R,val);
}
push_up(x);
}
void solve(){
read(n,m,p);
for(int i=1;i<=n;i++)read(a[i].a,a[i].ca);
for(int i=1;i<=m;i++)read(b[i].b,b[i].cb);
for(int i=1;i<=p;i++)read(c[i].x,c[i].y,c[i].z);
sort(c+1,c+1+p);
memset(A,0x3f,sizeof(A));
for(int i=1;i<=n;i++)A[a[i].a]=min(A[a[i].a],(ll)a[i].ca);
memset(B,0x3f,sizeof(B));
for(int i=1;i<=m;i++)B[b[i].b]=min(B[b[i].b],(ll)b[i].cb);
for(int i=maxv-2;i>=1;i--)B[i]=min(B[i],B[i+1]);
build(1,1,maxv-1);
ll ans=-INF;
for(int i=1,j=1;i<=1e6;i++) if(A[i]!=INF){
while(j<=p && c[j].x<i){
update(1,1,maxv-1,c[j].y+1,maxv-1,c[j].z);
j++;
}
ans=max(ans,ma[1]-A[i]);
}
printf("%lld\n",ans);
}
int main()
{
// freopen("in.txt","r",stdin);
// ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
// int _T; read(_T); for(int _=1;_<=_T;_++)solve();
// while(read(n))solve();
solve();
return 0;
}
Codeforces 1321E World of Darkraft: Battle for Azathoth的更多相关文章
- CF1320C World of Darkraft: Battle for Azathoth
线段树 又是熟悉的感觉,又是E题写完了,没调完,不过还好上了紫 CF1295E 可以发现可以打败怪兽的关系类似二维偏序 那么首先考虑第一维(武器)以攻击值($a_{i}$)进行排序 把所有的怪兽以防御 ...
- 【42.86%】【Codeforces Round #380D】Sea Battle
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- Codeforces 138D World of Darkraft(Multi-Nim)
[题目链接] http://codeforces.com/problemset/problem/138/D [题目大意] H*W的棋盘中每个点都是L.R.X三者之一,两人轮流选一个点, 若为L则向左下 ...
- Codeforces 138D World of Darkraft
有一个n*m 的棋盘,每个点上标记了L,R,X 中的一个每次能选择一个没有被攻击过的点(i,j),从这个点开始发射线,射线形状为:1. 若字符是 L,向左下角和右上角发,遇到被攻击过的点就停下来2. ...
- Codeforces Round #625 (1A - 1D)
A - Journey Planning 题意: 有一列共 n 个城市, 每个城市有美丽值 b[i], 要访问一个子序列的城市, 这个子序列相邻项的原项数之差等于美丽值之差, 求最大的美丽值总和. ...
- Solution -「线段树」题目集合
T1 无聊的数列 来自:Link flag 帖先从水题入手. 首先分析题目,它是以等差数列为原型进行的修改.等差数列一大性质就是其差分数列的值除第一项以外均相等. 于是不难想到使用差分数列进行维护. ...
- 【Virt.Contest】CF1321(div.2)
第一次打虚拟赛. CF 传送门 T1:Contest for Robots 统计 \(r[i]=1\) 且 \(b[i]=0\) 的位数 \(t1\) 和 \(r[i]=0\) 且 \(b[i]=1\ ...
- 2018省赛赛第一次训练题解和ac代码
第一次就去拉了点思维很神奇的CF题目 2018省赛赛第一次训练 # Origin Title A CodeForces 607A Chain Reaction B CodeForces ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
随机推荐
- JVM系列之:从汇编角度分析Volatile
目录 简介 重排序 写的内存屏障 非lock和LazySet 读的性能 总结 简介 Volatile关键字对熟悉java多线程的朋友来说,应该很熟悉了.Volatile是JMM(Java Memory ...
- Python3中,map()函数、filter()函数、reduce()函数的比较
1.map(function,iterable):function为函数,或者lambda表达式,iterable是可迭代的序列,即对iterable中的每个item执行一遍function或者lam ...
- CSS可见格式化模型
1.盒模型 1.1 盒子大小 盒模型描述了元素如何显示,以及如何相互作用.相互影响. 页面中的所有元素都被看作一个矩形盒子,这个盒子包含元素的内容.内边距.边框和外边距. 给元素应用的背景会作用于元素 ...
- OpenCV之高斯平滑(Python实现)
假设一个列数为W,行数为H的高斯卷计算子gaussKernel,其中W,H均为奇数,描点位置在((H-1)/2 ,(W-1)/2),构建高斯卷积核的步骤如下 1.计算高斯矩阵 \[gaussMatri ...
- 6.深入k8s:守护进程DaemonSet
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 最近也一直在加班,处理项目中的事情,发现问题越多越是感觉自己的能力不足,希望自己能多学点 ...
- Java—io流之打印流、 commons-IO
打印流 打印流根据流的分类: 字节打印流 PrintStream 字符打印流 PrintWriter /* * 需求:把指定的数据,写入到printFile.txt文件中 * * 分析: * 1, ...
- C#LeetCode刷题之#345-反转字符串中的元音字母(Reverse Vowels of a String)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3935 访问. 编写一个函数,以字符串作为输入,反转该字符串中的元 ...
- Clion C++ 乱码,debug乱码
Clion新建项目,默认是使用UTF-8 Clion点击运行图标,使用的terminal不能正常显示UTF-8,因为其使用的是GBK编码 所以只要将源文件编码改为GBK就好了 1.界面右下角,有个UT ...
- day1 计算机的组成
1.计算机,是用于高速计算的电子机器,具有数值计算, 逻辑判断,储存记忆的功能. 2.计算机由硬件系统和软件系统组成构成. 3.计算机中所有的运行程序都是在内存中进行的,暂时存放在CPU中的运算数据 ...
- 计算itable的大小
在ClassFileParser::parseClassFile()函数中计算vtable和itable所需要的大小,之前已经介绍过vtable大小的计算,这一篇将详细介绍itable大小的计算过程. ...