CF815D
模拟赛遇到的题目。
看各位大佬的做法都不是很懂,于是自己一通乱搞搞出来了。
题意
做法
为了方便叙述,我们将每个给出的三元组表示成 \((a_i,b_i,c_i)\),所选的三元组表示成\((x,y,z)\)。
首先我们考虑如果 \(c_i\) 相等(设为 \(c\))怎么做:
直接做看起来很麻烦,于是我们考虑正难则反,由算可行解数量改为算不可行解数量,并维护对于每一个 \(y\) 可选的 \(x\) ,显然对于每一个\(y\),\(x\)的选择满足单调性。
然后我们分类讨论一下 \(z\) 和 \(c_i\) 的大小关系
当 \(z \le c\) 时,对于每一个三元组,当 \(y \in [1,b_i]\) 时, \(x>p\);当 $y \in (b_i,q] \(时,\)x>a_i$。
当 \(z>c\) 时,对于每一个三元组,只需满足当 \(y \in [1,b_i]\)时,\(x>a_i\) 即可。
拿个线段树维护一下就可以了。
然后我们将这种做法拓展一下,我们先把原序列按 \(c_i\) 从大到小排序,可以轻易发现此时当 \(z \in (c_i,c_{i+1}]\) 时,每一个 \(z\) 贡献都是一样的
对于每一个区间\((c_i,c_{i+1}]\),我们考虑上面的做法来算贡献,显然对于前 \(i\) 个三元组,满足 \(z>c\) 的条件,对于后面的三元组,满足 \(z \le c\) 的条件。
且显然 \(z \le c\) 的条件是比 \(z > c\) 完全严格的,所以每次修改的时候把 \(z > c\)的条件给当前枚举到的三元组加上去就好了。
然后关于这个线段树,我们需要维护区间最大值,区间求和,这个可以自行百度解决(相信做到这道题的大佬都会)。
#include <bits/stdc++.h>
#define int long long
#define INF 2147483647
#define N 1000005
#define mkp make_pair
#define pii pair<int,int>
#define pb push_back
using namespace std;
int n,A,B,C,ans=0;
struct Y{int a,b,c;}a[N];
int cmp(Y x,Y y){return x.c>y.c;}
struct Ji_seg{
struct Tr{
int mn,tag,t,se,sum;
}tr[N<<2];
int ls(int nw){return nw*2;}
int rs(int nw){return nw*2+1;}
void change(int nw,int l,int r,int k){//对nw节点的区间进行区间取max
if(k<=tr[nw].mn)return;
if(k<tr[nw].se){
tr[nw].sum+=(k-tr[nw].mn)*tr[nw].t;
tr[nw].mn=k;tr[nw].t=max(tr[nw].t,1ll);tr[nw].tag=max(tr[nw].tag,k);
return;
}
int mid=(l+r)/2;
change(ls(nw),l,mid,k);change(rs(nw),mid+1,r,k);push_up(nw);
}
void push_down(int nw,int l,int r){
if(tr[nw].tag){
int mid=(l+r)/2;
change(ls(nw),l,mid,tr[nw].tag);
change(rs(nw),mid+1,r,tr[nw].tag);
tr[nw].tag=0;
}
}
void push_up(int nw){
tr[nw].sum=tr[ls(nw)].sum+tr[rs(nw)].sum;
if(tr[ls(nw)].mn==tr[rs(nw)].mn){
tr[nw].mn=tr[ls(nw)].mn;
tr[nw].t=tr[ls(nw)].t+tr[rs(nw)].t;
tr[nw].se=min(tr[ls(nw)].se,tr[rs(nw)].se);
return;
}
if(tr[ls(nw)].mn<tr[rs(nw)].mn){tr[nw].mn=tr[ls(nw)].mn;tr[nw].t=tr[ls(nw)].t;tr[nw].se=min(tr[ls(nw)].se,tr[rs(nw)].mn);}
else {tr[nw].mn=tr[rs(nw)].mn;tr[nw].t=tr[rs(nw)].t;tr[nw].se=min(tr[rs(nw)].se,tr[ls(nw)].mn);}
}
void build(int nw,int l,int r){
if(l==r){
tr[nw].sum=0;tr[nw].mn=0;tr[nw].se=INF;tr[nw].t=1;tr[nw].tag=0;
return;
}
int mid=(l+r)/2;
build(ls(nw),l,mid);
build(rs(nw),mid+1,r);
push_up(nw);
}
void update(int nw,int l,int r,int x,int y,int k){
if(x>y)return;
if(x<=l&&r<=y){
change(nw,l,r,k);
return;
}
int mid=(l+r)/2;push_down(nw,l,r);
if(x<=mid)update(ls(nw),l,mid,x,y,k);
if(y>mid)update(rs(nw),mid+1,r,x,y,k);
push_up(nw);
}
}T;
signed main() {
scanf("%lld %lld %lld %lld",&n,&A,&B,&C);
for(int i=1;i<=n;i++)scanf("%lld %lld %lld",&a[i].a,&a[i].b,&a[i].c);
sort(a+1,a+n+1,cmp);a[0]=Y{0,0,C};a[n+1]=Y{0,0,0};
T.build(1,1,B);
for(int i=1;i<=n;i++)T.update(1,1,B,1,a[i].b,a[i].a);
for(int i=0;i<=n;i++){
T.update(1,1,B,1,a[i].b,A);T.update(1,1,B,a[i].b+1,B,a[i].a);
ans+=(a[i].c-a[i+1].c)*(A*B-T.tr[1].sum);
}
printf("%lld\n",ans);
return 0;
}
CF815D的更多相关文章
- CF815D Karen and Cards
CF815D Karen and Cards 固定一维c,然后(a,b)看成坐标,矩形区域求交 1.Segment tree Beats! 2.改成不合法的区域就是求并,c反向枚举,区域只增不减且完全 ...
- 【CF815D】Karen and Cards 单调栈+扫描线
[CF815D]Karen and Cards 题意:一张卡片有三个属性a,b,c,其上限分别为A,B,C,现在有n张卡片,定义一张卡片能打败另一张卡片当且仅当它的至少两项属性要严格大于另一张的对应属 ...
- CF815D Karen and Cards 官方题解翻译
看到这道题,网上没有中文版的官方题解,于是就自己翻译了一遍. 不是机器翻译,是一个字一个字纯手翻译的,如果有错误欢迎指正. 比如我们有一张卡片,三个参数分别是 a1 = 4, b1 = 2, c1 = ...
- [学习笔记]Segment Tree Beats!九老师线段树
对于这样一类问题: 区间取min,区间求和. N<=100000 要求O(nlogn)级别的算法 直观体会一下,区间取min,还要维护区间和 增加的长度很不好求.... 然鹅, 从前有一个来自杭 ...
随机推荐
- java基础———标识符和关键字
标识符以字母开头 (A-Z)或(a-z) 美元符($) 下划线(_) 不能以关键字作为变量名或者方法名 标识符大小写不能混淆 可以中文(不建议) 常用的关键字
- Java 解析Tiff深入研究
最近在读取客户发过来的tiff文件是,底层竟然报错了,错误:bandOffsets.length is wrong! 没办法,因为错误消息出现在tiff的read中,因此就对 底层序中tiff读取 ...
- k8s中ingress,service,depoyment,pod如何关联
k8s中pod通过label标签名称来识别关联,它们的label name一定是一样的.ingress,service,depoyment通过selector 中app:name来关联 1.查询发布 ...
- 【gRPC】C++异步服务端客户端API实例及代码解析
对于同步API而言,程序的吞吐量并不高.因为在每次发送一个gRPC请求时,会阻塞整个线程,必须等待服务端的ack回到客户端才能继续运行或者发送下一个请求,因此异步API是提升程序吞吐量的必要手段. g ...
- NLP新手入门指南|北大-TANGENT
开源的学习资源:<NLP 新手入门指南>,项目作者为北京大学 TANGENT 实验室成员. 该指南主要提供了 NLP 学习入门引导.常见任务的开发实现.各大技术教程与文献的相关推荐等内容, ...
- ingress-nginx自带认证功能【nginx自带】
问题:通过nginx可以给某些web网站设置登录使用的用户名和密码,现在网站部署到k8s中,通过配置nginx-ingress->service->pod来访问的,怎么给这个网站再配置上访 ...
- shell脚本中执行source命令不生效的解决办法
一个shell脚本文件中有一个source命令,使用bash a.sh命令执行后source命令进行验证没有生效. 这是因为在shell脚本中执行source会看到效果,但是shell脚本执行完后再次 ...
- aardio + Python 可视化快速开发桌面程序,一键生成独立 EXE
网络上大家分享的 aardio + Python 混合开发的文章很多,不得不说 aardio 与 Python 混合开发是真的简单 ! 快速入门 推荐几个快速上手教程:< aardio + P ...
- TF-GNN踩坑记录(二)
引言 最近在尝试构建GraphTensor时,尝试把默认的特征名hidden_state改成其他时,出现了奇怪的报错. 报错 WARNING:tensorflow:Gradients do not e ...
- ULID规范解读与实现原理
前提 最近发现各个频道推荐了很多ULID相关文章,这里对ULID的规范文件进行解读,并且基于Java语言自行实现ULID,通过此实现过程展示ULID的底层原理. ULID出现的背景 ULID全称是Un ...