威士忌(whiskey)

题目描述

Alan 喝了假威士忌,想问你一个问题:

nvliu66 推荐大家读三本书《百年孤独》、《城市发展史》、《美国大城市的生与死》,三本书的总页数分别为p,q,rp,q,r。现有nn个nvliu66 的粉丝,作为nvliu66的粉丝,想必每本书都至少读过一页,其中第ii个粉丝读过aiai页《百年孤独》、bibi页《城市发展史》、cici页《美国大城市的生与死》(1≤ai≤p,1≤bi≤q,1≤ci≤r)(1≤ai≤p,1≤bi≤q,1≤ci≤r)。如果粉丝xx有不少于两本书阅读过的页数都严格多余粉丝yy,即当ax>ay,bx>by,cx>cyax>ay,bx>by,cx>cy三个条件中有至少两个成立时,那么称xx比yy更“博闻强识”。

Alan 作为nvliu66 的粉丝,也决定去读a0a0页《百年孤独》、b0b0页《城市发展史》、c0c0页《美国大城市的生与死》(1≤a0≤p,1≤b0≤q,1≤c0≤r)(1≤a0≤p,1≤b0≤q,1≤c0≤r)。如果Alan 比nn个粉丝都要博闻强识,那么他就会感到很奴比。Alan 想知道自己有多少种不同的读书方案使自己会很奴比,两个读书方案不同当且仅当存在一本书读取的页数不同。

输入

第一行,四个整数n,p,q,rn,p,q,r。

接下来nn行,每行三个整数ai,bi,ciai,bi,ci。


solution

考虑枚举一位a

分情况考虑:

1.ai>a

那么我们一定要保证bc都小于a

这个可以预处理很方便求出max

2.ai<a

那么我们要保证b或c至少有一维要更大

把所有(b,c)抽象成点,那么我们的选择不能在任何一个以bc为右上角的矩形内。

注意到矩形的并y是递减的

我们可以用线段树维护这些矩形面积的并。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 500005
#define ll long long
using namespace std;
int n;
ll P,Q,R,mc[maxn],mb[maxn];
ll ans;
struct node{
ll a,b,c;
}s[maxn];
struct no{
int l,r,len;
ll v,Max,bj;
}tree[maxn*4];
bool cmp(node a,node b){
return a.a<b.a;
}
void wh(int k){
tree[k].Max=max(tree[k*2].Max,tree[k*2+1].Max);
tree[k].v=tree[k*2].v+tree[k*2+1].v;
}
void build(int k,int l,int r){
tree[k].l=l;tree[k].r=r;tree[k].len=r-l+1;
if(l==r){tree[k].v=R;return;}
int mid=l+r>>1;
build(k*2,l,mid);build(k*2+1,mid+1,r);
wh(k);
}
void down(int k){
ll &v=tree[k].bj,up=R-tree[k].bj;
if(v!=0){
tree[k*2].Max=tree[k*2+1].Max=v;
tree[k*2].v=1LL*tree[k*2].len*up;
tree[k*2+1].v=1LL*tree[k*2+1].len*up;
tree[k*2].bj=tree[k*2+1].bj=v;
v=0;
}
}
int find(int k,int pl){
if(tree[k].l==tree[k].r)return tree[k].l;
down(k);
if(tree[k*2+1].Max>=pl)return find(k*2+1,pl);
else return find(k*2,pl);
}
ll ask(int k,ll li,ll ri){
if(li>ri)return 0;
if(tree[k].l>=li&&tree[k].r<=ri){
return tree[k].v;
}
down(k);
int mid=tree[k].l+tree[k].r>>1;
ll tmp=0;
if(li<=mid)tmp+=ask(k*2,li,ri);
if(ri>mid)tmp+=ask(k*2+1,li,ri);
return tmp;
}
void ch(int k,int li,int ri,ll v,ll up){
if(li>ri)return;
if(tree[k].l>=li&&tree[k].r<=ri){
tree[k].Max=v;tree[k].v=1LL*tree[k].len*up;
tree[k].bj=v;
return;
}
down(k);
int mid=tree[k].l+tree[k].r>>1;
if(li<=mid)ch(k*2,li,ri,v,up);
if(ri>mid)ch(k*2+1,li,ri,v,up);
wh(k);
}
int main()
{
cin>>n>>P>>Q>>R;
for(int i=1;i<=n;i++)scanf("%lld%lld%lld",&s[i].a,&s[i].b,&s[i].c);
sort(s+1,s+n+1,cmp);
for(int i=n;i>=1;i--)mb[i]=max(mb[i+1],s[i].b),mc[i]=max(mc[i+1],s[i].c);
build(1,1,Q);ll la=1;
for(int i=1;i<=n;i++){
ll nb=mb[i]+1,nc=mc[i]+1;
ll pl=find(1,nc);if(tree[1].Max<nc)pl=0;
ll tmp=0;
if(!pl){
tmp=tmp+(Q-nb+1)*(R-nc+1);
}
else {
tmp=ask(1,nb,pl);
ll t=max(nb,pl+1);
tmp+=1LL*(Q-t+1)*(R-nc+1);
}
tmp=tmp*(s[i].a-la+1);
ans=ans+tmp;
la=s[i].a+1;
ll ap=find(1,s[i].c);
if(tree[1].Max<s[i].c)ap=0;
ch(1,ap+1,s[i].b,s[i].c,R-s[i].c);
}
ll tmp=ask(1,1,Q);
tmp=tmp*(P-la+1);
ans=ans+tmp;
cout<<ans<<endl;
return 0;
}

威士忌(whiskey)的更多相关文章

  1. [学习笔记]设计模式之Flyweight

    为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 Flyweight(享元)模式运用共享技术,可以有效地支持大量细粒度的对象.今天我们会去参观小霍比特人们的酿酒工坊……等等,不是享元模 ...

  2. 越狱Season 1- Episode 16

    Season 1, Episode 16 -Burrows:Don't be. It's not your fault. 不要,不是你的错 -Fernando: Know what I like? 知 ...

  3. linux命令单次或组合样例

    ###解压命令.tar.gz    格式解压为    tar   -zxvf   xx.tar.gz.tar.bz2   格式解压为     tar   -jxvf    xx.tar.bz2 ### ...

  4. Google员工自述:在哈佛教书和在Google工作的差别

    感谢伯乐在线的投递编者按:2003年到2010年期间,原文作者Matt Welsh 是哈佛大学工程和应用科学学院的计算机科学系教授.2010年加入Google,是一名高级工程师.他当前的工作重点是广域 ...

  5. 2076. The Drunk Jailer

    Problem A certain prison contains a long hall of n cells, each right next to each other. Each cell h ...

  6. ACM Steps 2.1.4

    Largest prime factor   Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  7. 经典创意slogan大全

    一句好的广告语,能强烈的激发人的感情,产生心理认同感.对于广告人来说,无论走到哪里,最敏感的就是广告语.一句广告语,可能只有短短几个字或一两句话,却是一个品牌的精华所在.能不能第一时间吸引受众眼球,抓 ...

  8. THE DRUNK JAILER 分类: POJ 2015-06-10 14:50 13人阅读 评论(0) 收藏

    THE DRUNK JAILER Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24918   Accepted: 1563 ...

  9. 越狱Season 1-Episode 8: The Old Head

    Season 1, Episode 8: The Old Head -Michael: 17 days from now they strap my brother to an electric ch ...

随机推荐

  1. Windows Subsystem for Linux(WSL)安装记录

    什么是WSL Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层.它是由微软与Canoni ...

  2. linux基础目录

    第1章 linux目录结构 1.1 linux目录结构的特点 一切皆文件 1)倒挂的树状结构   一切从根开始 2)linux每个目录可以挂载在不同的设备(磁盘)上.windows不容易做到. /da ...

  3. ELK+kafka日志处理

    此次使用kafka代替redis,elk集群搭建过程请参考:https://www.cnblogs.com/dmjx/p/9120474.html kafka名词解释: 1.话题(Topic):是特定 ...

  4. NFS文件系统存储服务部署

    1 NFS介绍 1.1 什么是NFS? NFS是Network File System的缩写,中文名称是网络文件系统.它的主要功能是通过网络让不用的主机系统之间可以共享文件或者目录.NFS客户端通过挂 ...

  5. 事件监听和window.history以及自定义创建事件

    1.事件监听window.addEventListener方法: Window.addEventListener(event, function, useCapture); useCapture:表示 ...

  6. python——内建模块instance的学习

    python中内建函数isinstance的用法 语法:isinstance(object,type) 作用:来判断一个对象是否是一个已知的类型. 其第一个参数(object)为对象,第二个参数(ty ...

  7. linux epoll用法

    epoll 是 linux 特有的 I/O 复用函数.它是把用户关心的文件描述符事件放在内核的一个事件列表中,故而,无须像select和poll一样每次调用都重复传入文件描述符或事件集.但是, epo ...

  8. poj 2965 枚举+DFS

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25343 ...

  9. STM32遇到的问题

    1.GPIO输出实验的时候,原来的库和现成的源代码有出入?导致实验现象不同,delay_ms,主要集中在这个函数上面 2.按键输入的时候,LED和KEY 初始化全部放在主函数,有按下按键以后,灯闪烁不 ...

  10. 10.2 ajax

    Ajax Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互 ...