[HZOI2016]偏序&[HZOI2015]偏序II K维偏序问题
description
Cogs:
[HZOI2016]偏序
[HZOI2015]偏序 II
data range
\]
solution
嵌套\(CDQ\)的应用
前面的\(CDQ\)用来对前面的维度进行合并和标记
最后一个\(CDQ\)统计答案
一开始用的\(4\)重嵌套\(CDQ\),要\(3.7s\)...
const int K=5;//K维偏序
int n,ans;
struct node{int d[K],tg[K];}Q[K][N];
bool cmp(node x,node y,int k){
if(k==K-1)return x.d[k]<y.d[k];
return x.d[k]<y.d[k]||(x.d[k]==y.d[k]&&x.d[k+1]==y.d[k+1]);
}
il int pd(node x,int v){
for(RG int i=1;i<K-1;i++)if(x.tg[i]!=v)return 0;return 1;
}
void cdq(int l,int r,int k){
if(l==r)return;RG int mid=(l+r)>>1;cdq(l,mid,k);cdq(mid+1,r,k);
for(RG int i=l,p1=l,p2=mid+1,sum=0;i<=r;i++)
if(p2>r||(p1<=mid&&cmp(Q[k-1][p1],Q[k-1][p2],k))){
if(k==K-1&&pd(Q[k-1][p1],0))sum++;
Q[k][i]=Q[k-1][p1++];Q[k][i].tg[k]=0;
}
else{
if(k==K-1&&pd(Q[k-1][p2],1))ans+=sum;
Q[k][i]=Q[k-1][p2++];Q[k][i].tg[k]=1;
}
for(RG int i=l;i<=r;i++)Q[k-1][i]=Q[k][i];if(k!=K-1)cdq(l,r,k+1);
}
之后无奈地把一重\(CDQ\)换成了\(BIT\),只要\(1.6s\),看来\(BIT\)常数要小些
const int K=5;//K维偏序
int n,ans;
struct node{int d[K],tg[K];}Q[K][N];
bool cmp(node x,node y,int k){
if(k==K-2)return x.d[k]<y.d[k];
return x.d[k]<y.d[k]||(x.d[k]==y.d[k]&&x.d[k+1]==y.d[k+1]);
}
il int pd(node x,int v){
for(RG int i=1;i<K-2;i++)if(x.tg[i]!=v)return 0;return 1;
}
int t[N];
il void insert(int i){for(i;i<=n;i+=(i&-i))t[i]++;}
il void clear(int i){for(i;i<=n;i+=(i&-i))t[i]=0;}
il int query(int i){int r=0;for(i;i;i-=(i&-i))r+=t[i];return r;}
void cdq(int l,int r,int k){
if(l==r)return;RG int mid=(l+r)>>1;cdq(l,mid,k);cdq(mid+1,r,k);
for(RG int i=l,p1=l,p2=mid+1,sum=0;i<=r;i++)
if(p2>r||(p1<=mid&&cmp(Q[k-1][p1],Q[k-1][p2],k))){
if(k==K-2&&pd(Q[k-1][p1],0))insert(Q[k-1][p1].d[k+1]);
Q[k][i]=Q[k-1][p1++];Q[k][i].tg[k]=0;
}
else{
if(k==K-2&&pd(Q[k-1][p2],1))ans+=query(Q[k-1][p2].d[k+1]-1);
Q[k][i]=Q[k-1][p2++];Q[k][i].tg[k]=1;
}
for(RG int i=l;i<=r;i++)Q[k-1][i]=Q[k][i],clear(Q[k][i].d[k+1]);
if(k!=K-2)cdq(l,r,k+1);
}
code
切换题目只须修改\(K\)的值即可
#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define Cpy(x,y) memcpy(x,y,sizeof(x))
#define Set(x,y) memset(x,y,sizeof(x))
#define FILE "partial_order"
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const dd eps=1e-6;
const int mod=1e9+7;
const int N=50010;
const int M=1e6+10;
const int inf=2147483647;
const ll INF=1e18+1;
const ll P=100000;
namespace IO{
const int maxn=(1<<21)+1;
char ibuf[maxn],*iS,*iT,c;int f;
inline char getc(){
return iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,maxn,stdin),iS==iT?EOF:*iS++):*iS++;
}
template<class T>inline void read(T &x){
for(f=1,c=getc();(c<'0'||c>'9');c=getc())f=c=='-'?-1:1;
for(x=0;(c>='0'&&c<='9');c=getc())x=(x<<1)+(x<<3)+(c^48);
x*=f;
}
}
using IO::read;
il void file(){
srand(time(NULL)+rand());
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
}
const int K=5;//K维偏序
int n,ans;
struct node{int d[K],tg[K];}Q[K][N];
bool cmp(node x,node y,int k){
if(k==K-2)return x.d[k]<y.d[k];
return x.d[k]<y.d[k]||(x.d[k]==y.d[k]&&x.d[k+1]==y.d[k+1]);
}
il int pd(node x,int v){
for(RG int i=1;i<K-2;i++)if(x.tg[i]!=v)return 0;return 1;
}
int t[N];
il void insert(int i){for(i;i<=n;i+=(i&-i))t[i]++;}
il void clear(int i){for(i;i<=n;i+=(i&-i))t[i]=0;}
il int query(int i){int r=0;for(i;i;i-=(i&-i))r+=t[i];return r;}
void cdq(int l,int r,int k){
if(l==r)return;RG int mid=(l+r)>>1;cdq(l,mid,k);cdq(mid+1,r,k);
for(RG int i=l,p1=l,p2=mid+1,sum=0;i<=r;i++)
if(p2>r||(p1<=mid&&cmp(Q[k-1][p1],Q[k-1][p2],k))){
if(k==K-2&&pd(Q[k-1][p1],0))insert(Q[k-1][p1].d[k+1]);
Q[k][i]=Q[k-1][p1++];Q[k][i].tg[k]=0;
}
else{
if(k==K-2&&pd(Q[k-1][p2],1))ans+=query(Q[k-1][p2].d[k+1]-1);
Q[k][i]=Q[k-1][p2++];Q[k][i].tg[k]=1;
}
for(RG int i=l;i<=r;i++)Q[k-1][i]=Q[k][i],clear(Q[k][i].d[k+1]);
if(k!=K-2)cdq(l,r,k+1);
}
int main()
{
file();read(n);
for(RG int k=0;k<K;k++)
for(RG int i=1;i<=n;i++){
if(k)read(Q[0][i].d[k]);
else Q[0][i].d[k]=i;
Q[0][i].tg[k]=-1;
}
cdq(1,n,1);
printf("%d\n",ans);
return 0;
}
[HZOI2016]偏序&[HZOI2015]偏序II K维偏序问题的更多相关文章
- 牛客网 牛客练习赛4 A.Laptop-二维偏序+离散化+树状数组
A.Laptop 链接:https://ac.nowcoder.com/acm/contest/16/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其 ...
- [luogu4479][BJWC2018]第k大斜率【二维偏序+二分+离散化+树状数组】
传送门 https://www.luogu.org/problemnew/show/P4479 题目描述 在平面直角坐标系上,有 n 个不同的点.任意两个不同的点确定了一条直线.请求出所有斜率存在的直 ...
- 树状数组 二维偏序【洛谷P3431】 [POI2005]AUT-The Bus
P3431 [POI2005]AUT-The Bus Byte City 的街道形成了一个标准的棋盘网络 – 他们要么是北南走向要么就是西东走向. 北南走向的路口从 1 到 n编号, 西东走向的路从1 ...
- 2015北京网络赛 J Clarke and puzzle 求五维偏序 分块+bitset
Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc20 ...
- CDQ分治嵌套模板:多维偏序问题
CDQ分治2 CDQ套CDQ:四维偏序问题 题目来源:COGS 2479 偏序 #define LEFT 0 #define RIGHT 1 struct Node{int a,b,c,d,bg;}; ...
- hiho#1513 : 小Hi的烦恼 五维偏序
hiho#1513 : 小Hi的烦恼 五维偏序 链接 hiho 思路 高维偏序用bitset,复杂度\((\frac{n^2}{32})\) 代码 #include <bits/stdc++.h ...
- N维偏序:cdq分治
cdq(陈丹琦)分治,是一种类似二分的算法.基本思想同分治: 递归,把大问题划分成若干个结构相同的子问题,直到(L==R): 处理左区间[L,mid]对右区间[mid+1,R]的影响: 合并. 它可以 ...
- HihoCoder - 1513 bitset处理五维偏序
题意:给出\(n<3e4\)个有序组\((a,b,c,d,e)\),求对第\(i\)个有序组有多少个\(j\)满足\((a_j<a_i,b_j<b_i,c_j<c_i,d_j& ...
- 二维偏序+树状数组【P3431】[POI2005]AUT-The Bus
Description Byte City 的街道形成了一个标准的棋盘网络 – 他们要么是北南走向要么就是西东走向. 北南走向的路口从 1 到 n编号, 西东走向的路从1 到 m编号. 每个路口用两个 ...
随机推荐
- Windows Server 2008 R2 安装域
在Windows Server 2008 R2里面安装域. 1.首先在"服务"里面添加"角色": 2.选择对应的域角色 3.安装完成后要启动配置向导 4.选择新 ...
- C语言灵魂--指针
什么是指针?理解指针之前得知道什么是地址. 1.数据在计算机中的存储形式: 数据在计算机中是以二进制的形式存储的.计算机的存储器是用半导体集成电路构成的,有N多个二极管元件组成. 每一个二极管元件就如 ...
- java 浅复制 深复制
1.浅复制 只是复制引用,对引用的操作会影响之前复制的对象. 2.深复制 复制一个完全独立的对象,复制对象与被复制对象相互之间不影响. 只是概念性东西....
- Qt-序列号生成器
一直想做一个序列号的生成器,今天终于有了开始了,目前只有读取硬件生成,还没有做生成序列号的规则. 目前实现的功能就是读取系统磁盘卷加上CPU ID 和自己的加密字符串,在利用MD5加密,转换成标准32 ...
- python+selenium 环境配置
配置环境: python:3.5 selenium:3.3.0 安装方式:python pip install -u selenium windows: 10 firefox:52 因为firefox ...
- flex布局笔记
flex布局: 容器: 容器主轴方向: 项目的主轴对齐方式: space-between:两端对齐,项目之间的间隔都相等. space-around:每个项目两侧的间隔相等.所以,项目之间的间隔比项目 ...
- opencv-学习笔记(5)形态学转变
opencv-学习笔记(4)形态学转变 本章讲了几种形态学操作 腐蚀erode 膨胀dilate 开运算MORPH_OPEN 闭运算MORPH_CLOSE 形态学梯度MORPH_GRADIENT 礼帽 ...
- Document对象内容集合
document 文挡对象 - JavaScript脚本语言描述———————————————————————注:页面上元素name属性和JavaScript引用的名称必须一致包括大小写否则会提示你一 ...
- nodejs在linux环境下安装更新方式
#检查是否已经安装 rpm -qa | grep python #查版本 python #最好是重新安装 Python推荐版本( >= v2.5.0 & < 3.0.0 ),否则影 ...
- Thunder团队第三周 - Scrum会议4
Scrum会议4 小组名称:Thunder 项目名称:i阅app Scrum Master:邹双黛 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...