威士忌(whiskey)
威士忌(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)的更多相关文章
- [学习笔记]设计模式之Flyweight
		为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 Flyweight(享元)模式运用共享技术,可以有效地支持大量细粒度的对象.今天我们会去参观小霍比特人们的酿酒工坊……等等,不是享元模 ... 
- 越狱Season 1- Episode 16
		Season 1, Episode 16 -Burrows:Don't be. It's not your fault. 不要,不是你的错 -Fernando: Know what I like? 知 ... 
- linux命令单次或组合样例
		###解压命令.tar.gz 格式解压为 tar -zxvf xx.tar.gz.tar.bz2 格式解压为 tar -jxvf xx.tar.bz2 ### ... 
- Google员工自述:在哈佛教书和在Google工作的差别
		感谢伯乐在线的投递编者按:2003年到2010年期间,原文作者Matt Welsh 是哈佛大学工程和应用科学学院的计算机科学系教授.2010年加入Google,是一名高级工程师.他当前的工作重点是广域 ... 
- 2076.   The Drunk Jailer
		Problem A certain prison contains a long hall of n cells, each right next to each other. Each cell h ... 
- ACM Steps 2.1.4
		Largest prime factor Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ... 
- 经典创意slogan大全
		一句好的广告语,能强烈的激发人的感情,产生心理认同感.对于广告人来说,无论走到哪里,最敏感的就是广告语.一句广告语,可能只有短短几个字或一两句话,却是一个品牌的精华所在.能不能第一时间吸引受众眼球,抓 ... 
- 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 ... 
- 越狱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 ... 
随机推荐
- 网页更换主题以及绘制图形js代码实现
			HTML代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ... 
- struts2属性驱动模型
			属性驱动模型的作用: 因为struts2与servlet API 实现了解耦,无法直接使用HttpServlet Request对象获取表单提交的参数,但Struts2提供了属性驱动模型机制来解决这个 ... 
- RabbitMQ (1) 环境安装
			1.下载erlang, 设置系统的环境变量 下载地址:http://www.erlang.org/downloads ERLANG_HOME=D:\Program\erl9.3 Path = %ERL ... 
- 【Python 2 到 3 系列】 print 是函数
			v3.0 以前,print一直作为语法结构存在,他是python语法的一部分:这个理解起来可能有点蹩脚,但的确是这样. print 一直被定以为一个statement,也就是说,他跟return/tr ... 
- 彻底搞定C指针--“函数名与函数指针”
			函数名与函数指针 一 通常的函数调用 一个通常的函数调用的例子: //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); 点击打开链 ... 
- PHP生成特定长度的纯字母字符串
			PHP中,md5().uniqid()函数可以返回32位和13位不重复的字符串,但是这些字符串都可能包含有数字.如果需要纯字母的字符串,而且长度不定,比如8位,那么直接用这两个函数无法达到效果. 这时 ... 
- Git的基本命令介绍
			Git的安装 进入官网下载系统所需要的版本 官网地址:https://git-scm.com/downloads 点击下载按钮官方网站一般会根据操作系统的自动下载所需要的Git版本. 下载完成后,点 ... 
- 使用shell脚本依据分区信息分批次的下载hive表格数据
			今天的业务场景大概是这样的,我想把hive表格下载到本地文件系统,然后把这个文件传送到另一个服务器上. 但是这个业务场景一个核心问题就是说我本地机器内存有限,hive表格大概是70G,我是不可能全部下 ... 
- 007---Django的视图层
			视图函数 一个视图函数,简称视图,是一个简单的python函数.它接收web请求并且返回web响应. 1.一张网页的HTML内容 2.一个重定向 3.一个404错误 4.一个xml文档 5.一个字符串 ... 
- Android面试收集录4 Fragment详解
			1.什么是Fragment? 你可以简单的理解为,Fragment是显示在Activity中的Activity. 它可以显示在Activity中,然后它也可以显示出一些内容. 因为它拥有自己的生命周期 ... 
