UVALive - 6667 Longest Chain CDQ3维问题
题意:现在有一个点堆, 一开始先给你m个点,然后再用题目中的rand函数生成剩下的n个点,问在这个点堆中可以找到的最长严格递增序列的长度是多少。
题解:
很常见的一个3维CDQ。
先按照z轴 sort 一遍,然后对于当前的序列去cdq分治。对于CDQ的每一层来说,都是用左边的点的值去更新右边点的值,对于每一层来说, 我们按照x轴sort, sort的时候注意,当同x的时候,一定是右边的询问点要在左边的修改点前面, 不然就不能保证前面的都是合法点, 对于每一个添加点来说,我们在其y轴对应的位置更新他的长度值, 对于每一个询问点来说, 我们在查询其y轴对应的位置的下面的地方去询问最长值。
但是题目中要求的是严格递增序列。
我们发现,会有中间的那一部分存在同z值的情况导致,中间偏左的点不能去更新中间偏右的点,但是我们可以发现,这个情况只会出现一个位置,对于每一次分治来说,那么我们开2个树状数组,去维护这个东西,一个梳妆数组存下左边的所有的更新点的值, 另一个梳妆数组维护 除去前面中间偏左不能维护中间偏右的那些点以外的值。
代码:
#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL mod = (int)1e9+;
const int N = 3e5 + ;
int ans[N];
int a, b, C = ~(<<), M = (<<)-;
int r(){
a = * (a & M) + (a >> );
b = * (b & M) + (b >> );
return (C&((a<<)+b)) % ;
}
struct Node{
int id, x, y, z;
}q[N], tmp[N];
bool cmp1(Node & n1, Node & n2){
return n1.z < n2.z;
}
bool cmp2(Node & n1, Node & n2){
if(n1.x != n2.x) return n1.x < n2.x;
return n1.id > n2.id;
}
int yyy[N];
int tree[][N];
void Add(int x, int val, int op){
for(int i = x; i < N; i+=i&(-i))
tree[op][i] = max(tree[op][i], val);
return ;
}
int query(int x, int op){
int ret = ;
for(int i = x; i > ; i -= i&(-i))
ret = max(tree[op][i], ret);
return ret;
}
void Clear(int x, int op){
for(int i = x; i < N; i+=i&(-i))
tree[op][i] = ;
return ;
}
void cdq(int l,int r){
if(l == r) {
ans[l] = max(ans[l], );
return ;
}
int m = l+r >> ;
cdq(l, m);
for(int i = l; i <= r; i++)
tmp[i] = q[i];
int midz = q[m+].z;
sort(tmp+l, tmp+r+, cmp2);
for(int i = l; i <= r; i++){
if(tmp[i].id <= m){
Add(tmp[i].y,ans[tmp[i].id],);
if(tmp[i].z != midz) Add(tmp[i].y,ans[tmp[i].id],);
}
else{
int val;
if(tmp[i].z != midz) val = query(tmp[i].y-, );
else val = query(tmp[i].y-,);
ans[tmp[i].id] = max(ans[tmp[i].id], val+);
}
}
for(int i = l; i <= r; i++){
if(tmp[i].id <= m){
Clear(tmp[i].y, );
if(tmp[i].z != midz) Clear(tmp[i].y,);
}
}
cdq(m+, r);
}
int main(){
int m, n, A, B;
while(~scanf("%d%d%d%d", &n, &m, &A, &B) && n+m+A+B){
a = A, b = B;
for(int i = ; i <= n; i++){
scanf("%d%d%d", &q[i].x, &q[i].y, &q[i].z);
yyy[i] = q[i].y;
}
for(int i = n+; i <= n+m; i++){
q[i].x = r(); q[i].y = r(); q[i].z = r();
yyy[i] = q[i].y;
}
sort(yyy+, yyy++n+m);
sort(q+, q++n+m, cmp1);
int ysz = unique(yyy+,yyy++n+m) - yyy - ;
for(int i = ; i <= n+m; i++){
q[i].id = i;
q[i].y = lower_bound(yyy+,yyy++ysz,q[i].y) - yyy;
ans[i] = ;
}
cdq(, n+m);
int fans = ;
for(int i = ; i <= n+m; i++)
fans = max(fans, ans[i]);
printf("%d\n", fans);
}
return ;
}
UVALive - 6667 Longest Chain CDQ3维问题的更多相关文章
- UvaLive 6667 Longest Chain (分治求三元组LIS&树状数组)
题目链接: here 题意: 和hdu4742类似.差别就是一部分三元组是直接给出的.另一部分是用他给的那个函数生成的.还有就是这里的大于是严格的大于a>b必须ax>bx,ay>by ...
- 2Sigma OA prepare: Longest Chain
DP use HashMap: 根据string的长度sort,然后维护每个string的longest chain,default为1,如果删除某个char生成的string能提供更长的chain, ...
- UVALive - 7374 Racing Gems 二维非递减子序列
题目链接: http://acm.hust.edu.cn/vjudge/problem/356795 Racing Gems Time Limit: 3000MS 问题描述 You are playi ...
- LeetCode 1048. Longest String Chain
原题链接在这里:https://leetcode.com/problems/longest-string-chain/ 题目: Given a list of words, each word con ...
- (Problem 14)Longest Collatz sequence
The following iterative sequence is defined for the set of positive integers: n n/2 (n is even) n 3n ...
- [LeetCode] Maximum Length of Pair Chain 链对的最大长度
You are given n pairs of numbers. In every pair, the first number is always smaller than the second ...
- [Swift]LeetCode646. 最长数对链 | Maximum Length of Pair Chain
You are given n pairs of numbers. In every pair, the first number is always smaller than the second ...
- 646. Maximum Length of Pair Chain(medium)
You are given n pairs of numbers. In every pair, the first number is always smaller than the second ...
- 646. Maximum Length of Pair Chain 最长的链条长度
[抄题]: You are given n pairs of numbers. In every pair, the first number is always smaller than the s ...
随机推荐
- WPF滑块控件(Slider)的自定义样式
前言 每次开发滑块控件的样式都要花很久去读样式代码,感觉有点记不牢,所以特此备忘. 自定义滑块样式 首先创建项目,添加Slider控件. 然后获取Slider的Window样式,如下图操作. 然后弹出 ...
- String常量池和intern方法
String s1 = "Hello"; String s2 = "Hello"; String s3 = "Hel" + "lo ...
- 【一些小常识】Linux文件目录的通配符用法/*
在使用linux命令的时候,一时有点搞不清*的用法,于是整理记录下,在做jenkins 持续集成时还是很有用的 “*”在通配符中是最常用的一种,主要整理下在使用Linux命令时,文件夹目录的用法. 1 ...
- MyBatis 一级缓存、二级缓存全详解(一)
目录 MyBatis 一级缓存.二级缓存全详解(一) 什么是缓存 什么是MyBatis中的缓存 MyBatis 中的一级缓存 初探一级缓存 探究一级缓存是如何失效的 一级缓存原理探究 还有其他要补充的 ...
- JVM系列(1)- JVM常见参数及堆内存分配
常见参数配置 基于JDK1.6 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收模式 -XX:+PrintGCDetails 打印更详细的GC日志 ...
- C# Quartz结合控制台实现定时任务
前言: Quartz一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,基于C#写成,可应用于winform.asp.net.asp.net core应用中.提 ...
- Java连载14-补码简介&浮点型整数
一.补码简介 1.计算机中的符号数有三种表示方式,即为:原码.反码.补码.三种表示方法均有符号位和数值位,符号位都是0表示正数,符号位都是1表示负数. 2.计算机中的数字的存储方式:在计算机系统中,数 ...
- 为什么建立数据仓库需要使用ETL工具?
在做项目时是不是时常让客户有这样的困扰: 1.开发时间太长 2.花费太多 3.需要太多资源 4.集成多个事务系统数据总是需要大量人力成本 5.找不到合适的技能和经验的人 6.一旦建立,数据仓库无法足够 ...
- 消息中间件-activemq安全机制
activemq作为消息中间件这样一个独立的个体存在,连通用户和服务器.如果没有一套完备的安全机制去设置用户权限设置消息分发机制可想后果是非常严重.ActiveMQ如果不加入安全机制的话,任何人只要知 ...
- 设计一个完美的http缓存策略
1.前言 作为一个前端,了解http缓存是非常必要,它不仅是面试的必要环节,也更是实战开发中必不可少需要了解的知识点,本文作者将从缓存的概念讲到如何在业务中设计一个合理的缓存架构,带你一步一步解开ht ...