线段树

又是熟悉的感觉,又是E题写完了,没调完,不过还好上了紫

CF1295E


可以发现可以打败怪兽的关系类似二维偏序

那么首先考虑第一维(武器)以攻击值($a_{i}$)进行排序

把所有的怪兽以防御力($x_{i}$)进行排序

然后用双指针维护到目前遍历到的武器,可以打败的怪兽

然后考虑防具和怪兽的攻击力也就是第二维

首先先定义$lb$数组,$lb[i]$表示所选防具至少为$i$的最少花费

可以用差分求出

可以发现如果选到防御力为$i$的防具,那么所有当前可以打败的怪兽中,只要攻击力小于$i$都可以累加到答案中

那么考虑$mx[i]$表示维护防御力最大为$i$的最大获利(包含防具的开支,武器的开支在最后计算)

对于一只新增的怪兽只要$i$大于其防御力,那么$mx[i]$都可以加上这只怪兽的获利

线段树维护即可

还要注意武器和防具里必选,不能不选

 1 #include <bits/stdc++.h>
2 #define inf 1e18
3 #define int long long
4 using namespace std;
5 const int N=2*1e5+100,NUM=1e6+100;
6 int n,m,p,lb[NUM],ans,mb;
7 struct tool
8 {
9 int f,cost;
10 };
11 tool a[N],b[N];
12 struct monsters
13 {
14 int x,y,z;
15 }c[N];
16 struct node
17 {
18 int MAX,lazy;
19 }sh[NUM*4];
20 bool cmp(tool a,tool b)
21 {
22 return a.f<b.f;
23 }
24 bool cmp1(monsters a,monsters b)
25 {
26 return a.x<b.x;
27 }
28 void pushup(int x)
29 {
30 sh[x].MAX=max(sh[x+x].MAX,sh[x+x+1].MAX);
31 }
32 void pushdown(int x)
33 {
34 if (sh[x].lazy!=0)
35 {
36 sh[x+x].lazy+=sh[x].lazy;
37 sh[x+x+1].lazy+=sh[x].lazy;
38 sh[x+x].MAX+=sh[x].lazy;
39 sh[x+x+1].MAX+=sh[x].lazy;
40 sh[x].lazy=0;
41 }
42 }
43 void build(int x,int l,int r)
44 {
45 if (l==r)
46 {
47 sh[x].MAX=-lb[l];//处理当前防具的价格
48 return;
49 }
50 int mid=(l+r)>>1;
51 build(x+x,l,mid);
52 build(x+x+1,mid+1,r);
53 pushup(x);
54 }
55 void change(int x,int l,int r,int ll,int rr,int v)//区间修改
56 {
57 if (ll<=l && r<=rr)
58 {
59 sh[x].MAX+=v;
60 sh[x].lazy+=v;
61 return;
62 }
63 int mid=(l+r)>>1;
64 pushdown(x);
65 if (ll<=mid) change(x+x,l,mid,ll,rr,v);
66 if (rr>mid) change(x+x+1,mid+1,r,ll,rr,v);
67 pushup(x);
68 }
69 signed main()
70 {
71 scanf("%lld%lld%lld",&n,&m,&p);
72 for (int i=1;i<=n;i++) scanf("%lld%lld",&a[i].f,&a[i].cost);
73 for (int i=1;i<=m;i++) scanf("%lld%lld",&b[i].f,&b[i].cost);
74 for (int i=1;i<=p;i++) scanf("%lld%lld%lld",&c[i].x,&c[i].y,&c[i].z);
75 sort(a+1,a+1+n,cmp);
76 sort(c+1,c+1+p,cmp1);
77 for (int i=1;i<=m;i++) mb=max(mb,b[i].f);
78 for (int i=1;i<=mb;i++) lb[i]=inf;
79 for (int i=1;i<=m;i++) lb[b[i].f]=min(lb[b[i].f],b[i].cost);
80 for (int i=mb-1;i>=1;i--) lb[i]=min(lb[i+1],lb[i]);//差分求出lb数组
81 ans=-inf;
82 build(1,1,mb);
83 for (int i=1,j=1;i<=n;i++)
84 {
85 while (c[j].x<a[i].f && j<=p)//双指针维护当前可以击败的怪兽
86 {
87 if (c[j].y+1<=mb)//在防御力最大的防具之内
88 change(1,1,mb,c[j].y+1,mb,c[j].z);//要严格大于
89 j++;
90 }
91 ans=max(ans,-a[i].cost+sh[1].MAX);//最后计算武器的代价
92 }
93 printf("%lld\n",ans);
94 }

CF1320C World of Darkraft: Battle for Azathoth的更多相关文章

  1. Codeforces 1321E World of Darkraft: Battle for Azathoth

    题意 有\(n\)个武器,第\(i\)个武器攻击力为\(a_i\),价值\(ca_i\). 有\(m\)个防具,第\(i\)个防具防御力为\(b_i\),价值\(cb_i\). 有\(p\)个怪,第\ ...

  2. Codeforces Round #625 (1A - 1D)

      A - Journey Planning 题意: 有一列共 n 个城市, 每个城市有美丽值 b[i], 要访问一个子序列的城市, 这个子序列相邻项的原项数之差等于美丽值之差, 求最大的美丽值总和. ...

  3. Solution -「线段树」题目集合

    T1 无聊的数列 来自:Link flag 帖先从水题入手. 首先分析题目,它是以等差数列为原型进行的修改.等差数列一大性质就是其差分数列的值除第一项以外均相等. 于是不难想到使用差分数列进行维护. ...

  4. 【Virt.Contest】CF1321(div.2)

    第一次打虚拟赛. CF 传送门 T1:Contest for Robots 统计 \(r[i]=1\) 且 \(b[i]=0\) 的位数 \(t1\) 和 \(r[i]=0\) 且 \(b[i]=1\ ...

  5. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  6. Codeforces 738D. Sea Battle 模拟

    D. Sea Battle time limit per test: 1 second memory limit per test :256 megabytes input: standard inp ...

  7. Codeforces #380 div2 D(729D) Sea Battle

    D. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. The 2015 China Collegiate Programming Contest C. The Battle of Chibi hdu 5542

    The Battle of Chibi Time Limit: 6000/4000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Othe ...

  9. get a new level 25 battle pet in about an hour

    If you have 2 level 25 pets and any level 1 pet, obviously start with him in your lineup. Defeat all ...

随机推荐

  1. I2C 方式

    转自:http://www.cnblogs.com/lucky-apple/archive/2008/07/03/1234581.html 区别: SPI:高速同步串行口.3-4线接口,收发独立.可同 ...

  2. DX12龙书 00 - 环境配置:通过 Visual Studio 2019 运行示例项目

    0x00 安装 Visual Studio 2019 安装 Visual Studio 2019 以及相关组件. 注:安装组件时带的 Windows 10 SDK 可以在 Individual com ...

  3. tuple的增删改查

    dict = {"k1": "v1", "k2": "v2", "k3": "v3&quo ...

  4. 2016-12-04---tiny412平台下的iconv库的移植问题

    一.解决问题    在arm开发板上使用framebuff,在汉字显示时,因为只有gb2312的16*16的汉字字库,而ubuntu16.04默认    的编码方式时utf-8,因此需要进行转码(ut ...

  5. 多测师讲解html _链接标签004_高级讲师肖sir

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>链 ...

  6. 机器学习:集成学习:随机森林.GBDT

    集成学习(Ensemble Learning) 集成学习的思想是将若干个学习器(分类器&回归器)组合之后产生一个新学习器.弱分类器(weak learner)指那些分类准确率只稍微好于随机猜测 ...

  7. Linux系统编程—信号捕捉

    前面我们学习了信号产生的几种方式,而对于信号的处理有如下几种方式: 默认处理方式: 忽略: 捕捉. 信号的捕捉,说白了就是抓到一个信号后,执行我们指定的函数,或者执行我们指定的动作.下面详细介绍两个信 ...

  8. linux学习(一)--启动文件bootsect.s

     这是linux由BIOS加载后执行的第一段的启动程序代码,即文件 boot/bootsect.s  首先附图,简单介绍一下从开机加电到第一段linux代码执行的简要过程 1 .globl begte ...

  9. Python-selenium:鼠标键盘事件

    鼠标事件 # 每个模拟事件后需加.perform() 才会执行 # context_click() 右击 # double_click() 双击 # drag_and_drop(source, tar ...

  10. 第十七章 DNS原理

    一.DNS的相关介绍 1.主机名与IP地址映射需求 1)IP地址难于记忆 2)能否用便于记忆的名字来映射IP地址? 2.hosts文件 1)hosts文件记录了主机名和IP地址的对应信息 2)host ...