COGS传送门

【题目描述】

给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<ji<ji且ai<ajai<aja_i且bi<bjbi<bjb_i且ci<cjci<cjc_i的数对(i,j)(i,j)(i,j)的个数。

【输入格式】

第一行一个整数nnn,表示序列长度。

第二行n" role="presentation" style="position: relative;">nnn个整数,分别表示a1∼ana1∼ana_1\sim a_n。

第三行nnn个整数,分别表示b1∼bn" role="presentation" style="position: relative;">b1∼bnb1∼bnb_1\sim b_n。

第四行nnn个整数,分别表示c1∼cn" role="presentation" style="position: relative;">c1∼cnc1∼cnc_1\sim c_n。

【输出格式】

一个整数,表示答案。

【样例输入】

5
1 5 3 4 2
2 5 3 4 1
1 2 5 3 4

【样例输出】

3

【样例解释】

满足条件的(i,j)(i,j)(i,j)共有以下三对:

(1,2)(1,2)(1,2)

(1,3)(1,3)(1,3)

(1,4)(1,4)(1,4)

【数据范围与约定】

对于30%的数据,n≤5000n≤5000n\leq 5000。

对于100%的数据,1≤n≤500001≤n≤500001\leq n\leq 50000,保证所有的ai、bi、ciai、bi、cia_i、b_i、c_i分别组成三个1∼n1∼n1\sim n的排列。

【来源】

HZOI 2016

解题分析

四维偏序模板题…

我们当然可以CDQCDQCDQ套树套树, 但是在这里介绍一种CDQCDQCDQ套CDQCDQCDQ的写法。

第一维:我们通过排序解决。(在这里就是输入顺序)

第二维:我们CDQCDQCDQ在bufbufbuf数组里实现对其的排序, 递归处理。 同时处理[lef,rig][lef,rig][lef,rig]区间时, 将[lef,mid][lef,mid][lef,mid]区间打上标记表示其第一维较小。

第三维:我们CDQCDQCDQ在buf2buf2buf2数组里实现对其的排序。 当然buf2buf2buf2是基于bufbufbuf得到的。

第四维:BITBITBIT维护前缀和即可。 注意修改、查询的条件是第一维第二维都较小。 这时我们就可以利用打的标记来判定了。

如果还是不懂的同学可以看代码…

#include <cstdio>
#include <cmath>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define R register
#define IN inline
#define W while
#define gc getchar()
#define MX 50050
#define File freopen("partial_order.in", "r", stdin), freopen("partial_order.out", "w", stdout)
#define lbt(i) (i & -i)
template <class T>
IN void in(T &x)
{x = 0; R char c = gc;W (!isdigit(c)) c = gc;W (isdigit(c))x = (x << 1) + (x << 3) + c - 48, c = gc;
}
struct Node
{int a, b, c, d;bool typ;
}eve[MX], buf[MX], buf2[MX];
int dot, tree[MX];
long long ans;
namespace BIT
{IN void clear(R int now){W (now <= dot)if(tree[now]) tree[now] = 0, now += lbt(now);else return;}IN void add(R int now){W (now <= dot) ++tree[now], now += lbt(now);}IN int query(R int now){int ret = 0;W (now) ret += tree[now], now -= lbt(now);return ret;}
}
void cdq2(const int &lef, const int &rig)
{if(lef == rig) return;int mid = lef + rig >> 1;cdq2(lef, mid), cdq2(mid + 1, rig);//先递归保证左右区间c单增, 并且左区间b值小于右区间b值int lb = lef, rb = mid + 1, cur = lef;W (lb <= mid && rb <= rig){if(buf[lb].c < buf[rb].c){if(!buf[lb].typ) BIT::add(buf[lb].d);//必须a值更小才能更新buf2[cur++] = buf[lb++];}else{if(buf[rb].typ) ans += BIT::query(buf[rb].d);//必须a值更大才能计入结果buf2[cur++] = buf[rb++];}}W (lb <= mid) buf2[cur++] = buf[lb++];W (rb <= rig){if(buf[rb].typ) ans += BIT::query(buf[rb].d);buf2[cur++] = buf[rb++];}for (R int i = lef; i <= mid; ++i) if(!buf[i].typ) BIT::clear(buf[i].d);for (R int i = lef; i <= rig; ++i) buf[i] = buf2[i];
}
void cdq1(const int &lef, const int &rig)//处理b
{if(lef == rig) return;int mid = lef + rig >> 1;cdq1(lef, mid), cdq1(mid + 1, rig);//先递归保证左右区间b单增int lb = lef, rb = mid + 1, cur = lef;W (lb <= mid && rb <= rig){if(eve[lb].b < eve[rb].b) buf[cur++] = eve[lb++], buf[cur - 1].typ = false;else buf[cur++] = eve[rb++], buf[cur - 1].typ = true;}W (lb <= mid) buf[cur++] = eve[lb++], buf[cur - 1].typ = false;W (rb <= rig) buf[cur++] = eve[rb++], buf[cur - 1].typ = true;for (R int i = lef; i <= rig; ++i) eve[i] = buf[i];cdq2(lef, rig);
}
int main(void)
{File;in(dot);for (R int i = 1; i <= dot; ++i) in(eve[i].b), eve[i].a = i;for (R int i = 1; i <= dot; ++i) in(eve[i].c);for (R int i = 1; i <= dot; ++i) in(eve[i].d);cdq1(1, dot);printf("%lld", ans);
}

[COGS 2479] [HZOI 2016] 偏序相关推荐

  1. Cogs 2382. [HZOI 2016]最佳序列

    Cogs 2382. [HZOI 2016]最佳序列 ★☆   输入文件:bestseq.in   输出文件:bestseq.out   简单对比 时间限制:1 s   内存限制:128 MB [题目 ...

  2. 2199. [HZOI 2016] 活动投票

    ★★   输入文件:hztp.in   输出文件:hztp.out   简单对比 时间限制:0.5 s   内存限制:2 MB [题目描述] 衡中活动很多,人也很多,一次活动有n个学生参与投票,现已知 ...

  3. [COGS2426][HZOI 2016]几何

    [COGS2426][HZOI 2016]几何 题目大意: 给定平面坐标系内\(n\)个整点,求这些整点能构成的正多边形的边数的最大值. 思路: 一个基本结论:平面直角坐标系内能够形成的正多边形一定是 ...

  4. 【CJOJ2616】 【HZOI 2016】偏序 I(cdq分治,树状数组)

    传送门 CJOJ Solution 考虑这是一个四维偏序对吧. 直接cdq套在一起,然后这题有两种实现方法(树状数组的更快!) 代码实现1(cdq+cdq+cdq) /*mail: mleautoma ...

  5. cogs 2320. [HZOI 2015]聪聪的世界题解

    2320. [HZOI 2015]聪聪的世界 时间限制:6 s   内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1-an,完成以 ...

  6. 2018.08.04 cogs2633. [HZOI 2016]数列操作e(线段树)

    传送门 支持区间加w(i−ql+1)2w(i−ql+1)2,将这个式子直接展开变成区间加wi2+w(ql−1)2+2w(1−ql)iwi2+w(ql−1)2+2w(1−ql)i,再选i做主元,会变成w ...

  7. COGS 2274. [HEOI 2016] tree

    ★☆   输入文件:heoi2016_tree.in   输出文件:heoi2016_tree.out   简单对比 时间限制:1 s   内存限制:128 MB 这道题数据弱到炸了 . 第一次做用树 ...

  8. [HZOI 2016][Tyvj 1729]文艺平衡树 这道题我真是哭了,调了一下午,一晚上

    [题目描述] 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 [ ...

  9. CDQ分治学习及例题总结

    文章目录 1.**使用cdq分治的条件:** 2.**cdq分治的性质:** 3. **cdq使用步骤:** 4.**自己对cdq分治学习的一些感悟:** 5. cdq分治的详细讲解(转自[stdca ...

  10. 省选前的计划(日更,然而你们天天吊打我)

    还有17天就省选了,不能再颓废了! 总结篇(不定期更新) 网络流基本 计算几何基本 字符串入门+基础 斜率优化dp 日记篇(日更) 3.18 今天做了一些题目吧. 考试的题目也做了一道题目. 方格取数 ...

最新文章

  1. 平面设计要掌握的实用技巧
  2. htc desire 10 pro android 8.0,HTC Desire 10 pro手机:可能是Desire系列最好的手机
  3. Rider EAP17带来了许多改进但缺乏.NET Core调试功能
  4. Openjudge-计算概论(A)-求分数序列和
  5. 浅析php学习的路线图
  6. unix高级环境编程-基础知识
  7. 如何在windows机器上安装apache ab
  8. JavaScript Array(数组)对象
  9. matlab fullfile函数
  10. 训练集,测试集和验证集
  11. java 大数四则运算_Java中的大数运算
  12. C语言基础入门:C-Free5新建C语言工程
  13. P1436 棋盘分割
  14. 阿里云服务平台,分布式架构云平台解决方案
  15. 安卓或苹果IOS的APP应用如何取名字?好的名字技巧?
  16. vs2017旗舰版_2017年的所有旗舰手机都有明显的妥协。 这是他们告诉我们有关设计的信息。...
  17. ZOJ Yukari's Birthday
  18. 斧乃木余接win10主题分享
  19. 计算机二级编程题题库
  20. babylonjs 分部加载模型_基于Babylonjs自制WebGL3D模型编辑器

热门文章

  1. 打开word后发现页面在左侧且只有72%。点击单页虽居中但大小也没法变动,调节右下角的大小变化但页面依然在左侧。
  2. Matlab如何提取fig文件中的数据
  3. JavaScript 身份证验证
  4. 最全最好的Tracker地址目录
  5. 到底什么是SPA、SEO、SSR?
  6. web前端——qq登录界面
  7. 使用python进行微博登陆
  8. 【信号隐藏】基于lsb算法实现音频水印嵌入提取matlab代码
  9. 很好的--张量(Tensor)的技术以及它在不同场景中的应用--转载贪心科技
  10. C++之struct