威士忌(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. hdu_2837_Calculation(欧拉函数,快速幂求指数循环节)

    Assume that f(0) = 1 and 0^0=1. f(n) = (n%10)^f(n/10) for all n bigger than zero. Please calculate f ...

  2. PHP开发环境搭建一:PHP集成环境XAMPP 的安装与配置

    1. XMAPP简介 XAMPP(Apache+MySQL/MariaDB+PHP+Perl)开头的X代表X-OS,代表可以在任何常见操作系统下使用,包括Windows.Mac.Linux,开源平台. ...

  3. 图解HTTP总结(3)——HTTP报文内的HTTP信息

    HTTP通信过程包括从客户端发往服务端的请求及从服务器端返回客户端的响应. 用于HTTP协议交互的信息被称为HTTP报文.客户端的HTTP报文叫做请求报文,服务器端的叫做响应报文.HTTP报文本身是多 ...

  4. ZOJ3329 概率DP

    One Person Game Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge There is a very ...

  5. hdoj 1237 模拟

    计算器 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值.   Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过 ...

  6. Git-Git库管理

    对象和引用哪里去了? 从GitHub上克隆一个示例版本库,这个版本库在"历史穿梭"一章就已经克隆过一次了,现在要重新克隆一份.为了和原来的克隆相区别,克隆到另外的目录.执行下面的命 ...

  7. PHP代码审计3-SQL注入,CSRF,动态函数执行与匿名函数执行,unserialize 反序列化漏洞,变量覆盖,文件管理,文件上传

    SQL注入 审计语句 [输入参数] SELECT,DELETE,UPDATE,INSERT 防御 转义: 1.开启gpc:判断解析用户提示的数据 2.mysql_real_escape_string( ...

  8. 2599: [IOI2011]Race

    2599: [IOI2011]Race 链接 分析 被memset卡... 点分治,对于重心,遍历子树,记录一个数组T[i],表示以重心为起点的长度为i的路径中最少的边数是多少.然后先遍历子树,更新答 ...

  9. HTTPClient和HttpURLConnection实例对比

    HttpURLConnection是java的标准类,什么都没封装. HTTPClient是个开源框架,封装了访问http的请求头,参数,内容体,响应等等. 简单来说,HTTPClient就是一个增强 ...

  10. Ubuntu设置root密码[repost]

    From: http://hi.baidu.com/busybox/item/283e7d31433db7179cc65ef3 安装完Ubuntu后在终端使用命令:su -然后输入密码,总是不正确.原 ...