BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治

原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html

题目传送门 - BZOJ4553

题目传送门 - 洛谷P4093

题解

  设$Li$表示第$i$个位置最小值,$Ri$表示最大值$vi$表示原值。

  那么如果$i$能到$j$这个位置,则满足:

  $i<j$

  $rj\leq xi$

  $xi\leq li$

  于是CDQ分治水过。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <bits/stdc++.h>
using namespace std;
const int N=100005;
struct Node{
    int id,v,L,R,res,x,y;
    void get(){
        scanf("%d",&v),L=R=v,res=1;
    }
}a[N];
bool cmp(Node a,Node b){
    if (a.x!=b.x)
        return a.x<b.x;
    if (a.y!=b.y)
        return a.y<b.y;
    return a.id<b.id;
}
bool cmpid(Node a,Node b){
    return a.id<b.id;
}
int n,m,tree[N];
int lowbit(int x){
    return x&-x;
}
void add(int x,int y){
    for (;x<=100000;x+=lowbit(x))
        tree[x]=max(tree[x],y);
}
void clr(int x){
    for (;x<=100000;x+=lowbit(x))
        tree[x]=0;
}
int sum(int x){
    int ans=0;
    for (;x>0;x-=lowbit(x))
        ans=max(ans,tree[x]);
    return ans;
}
 
void CDQ(int L,int R){
    if (L==R)
        return;
    int mid=(L+R)>>1;
    CDQ(L,mid);
    for (int i=L;i<=mid;i++)
        a[i].x=a[i].R,a[i].y=a[i].v;
    for (int i=mid+1;i<=R;i++)
        a[i].x=a[i].v,a[i].y=a[i].L;
    sort(a+L,a+R+1,cmp);
    for (int i=L;i<=R;i++)
        if (a[i].id<=mid)
            add(a[i].y,a[i].res);
        else
            a[i].res=max(a[i].res,sum(a[i].y)+1);
    for (int i=L;i<=R;i++)
        if (a[i].id<=mid)
            clr(a[i].y);
    sort(a+L,a+R+1,cmpid);
    CDQ(mid+1,R);
}
int main(){
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
        a[i].get(),a[i].id=i;
    for (int i=1,x,y;i<=m;i++){
        scanf("%d%d",&x,&y);
        a[x].L=min(a[x].L,y);
        a[x].R=max(a[x].R,y);
    }
    memset(tree,0,sizeof tree);
    CDQ(1,n);
    int ans=0;
    for (int i=1;i<=n;i++)
        ans=max(ans,a[i].res);
    printf("%d",ans);
    return 0;
}

  

 

posted @   zzd233  阅读(305)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App

点击右上角即可分享
微信分享提示