[COGS 2479] [HZOI 2016] 偏序
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)的个数。
【输入格式】
第二行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
【样例解释】
【数据范围与约定】
对于30%的数据,n≤5000n≤5000n\leq 5000。
【来源】
解题分析
我们当然可以CDQCDQCDQ套树套树, 但是在这里介绍一种CDQCDQCDQ套CDQCDQCDQ的写法。
第三维:我们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] 偏序相关推荐
- Cogs 2382. [HZOI 2016]最佳序列
Cogs 2382. [HZOI 2016]最佳序列 ★☆ 输入文件:bestseq.in 输出文件:bestseq.out 简单对比 时间限制:1 s 内存限制:128 MB [题目 ...
- 2199. [HZOI 2016] 活动投票
★★ 输入文件:hztp.in 输出文件:hztp.out 简单对比 时间限制:0.5 s 内存限制:2 MB [题目描述] 衡中活动很多,人也很多,一次活动有n个学生参与投票,现已知 ...
- [COGS2426][HZOI 2016]几何
[COGS2426][HZOI 2016]几何 题目大意: 给定平面坐标系内\(n\)个整点,求这些整点能构成的正多边形的边数的最大值. 思路: 一个基本结论:平面直角坐标系内能够形成的正多边形一定是 ...
- 【CJOJ2616】 【HZOI 2016】偏序 I(cdq分治,树状数组)
传送门 CJOJ Solution 考虑这是一个四维偏序对吧. 直接cdq套在一起,然后这题有两种实现方法(树状数组的更快!) 代码实现1(cdq+cdq+cdq) /*mail: mleautoma ...
- cogs 2320. [HZOI 2015]聪聪的世界题解
2320. [HZOI 2015]聪聪的世界 时间限制:6 s 内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1-an,完成以 ...
- 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 ...
- COGS 2274. [HEOI 2016] tree
★☆ 输入文件:heoi2016_tree.in 输出文件:heoi2016_tree.out 简单对比 时间限制:1 s 内存限制:128 MB 这道题数据弱到炸了 . 第一次做用树 ...
- [HZOI 2016][Tyvj 1729]文艺平衡树 这道题我真是哭了,调了一下午,一晚上
[题目描述] 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 [ ...
- CDQ分治学习及例题总结
文章目录 1.**使用cdq分治的条件:** 2.**cdq分治的性质:** 3. **cdq使用步骤:** 4.**自己对cdq分治学习的一些感悟:** 5. cdq分治的详细讲解(转自[stdca ...
- 省选前的计划(日更,然而你们天天吊打我)
还有17天就省选了,不能再颓废了! 总结篇(不定期更新) 网络流基本 计算几何基本 字符串入门+基础 斜率优化dp 日记篇(日更) 3.18 今天做了一些题目吧. 考试的题目也做了一道题目. 方格取数 ...
最新文章
- 平面设计要掌握的实用技巧
- htc desire 10 pro android 8.0,HTC Desire 10 pro手机:可能是Desire系列最好的手机
- Rider EAP17带来了许多改进但缺乏.NET Core调试功能
- Openjudge-计算概论(A)-求分数序列和
- 浅析php学习的路线图
- unix高级环境编程-基础知识
- 如何在windows机器上安装apache ab
- JavaScript Array(数组)对象
- matlab fullfile函数
- 训练集,测试集和验证集
- java 大数四则运算_Java中的大数运算
- C语言基础入门:C-Free5新建C语言工程
- P1436 棋盘分割
- 阿里云服务平台,分布式架构云平台解决方案
- 安卓或苹果IOS的APP应用如何取名字?好的名字技巧?
- vs2017旗舰版_2017年的所有旗舰手机都有明显的妥协。 这是他们告诉我们有关设计的信息。...
- ZOJ Yukari's Birthday
- 斧乃木余接win10主题分享
- 计算机二级编程题题库
- babylonjs 分部加载模型_基于Babylonjs自制WebGL3D模型编辑器