4553: [Tjoi2016&Heoi2016]序列

原创 2017年01月02日 22:00:13

挺一般的思路,转变为三维偏序,然后cdq分治维护dp值就可以了
想了10min左右,写了20min左右,调了60min左右。。。
都是sb错误(只有1.5k啊,非得生成数据对拍才能看出吗?)
谨以此文,纪念debug能力越来越弱的自己

#include<bits/stdc++.h>
#define rep(i,k,n) for(int i=k;i<=n;i++)
#define rep2(i,k,n) for(int i=k;i>=n;i--)
#define ls x<<1
#define rs x<<1|1
using namespace std;
const int N=4e5+7;
int n,a[N],mx[N],mi[N],m,dp[N],b[N],M[N],len=0;
bool cmp_a(int x,int y){
    return a[x]<a[y];
}
bool cmp_mx(int x,int y){
    return mx[x]<mx[y];
}
void ch(int x,int l,int r,int pos,int d){
    if(l==r){if(!d)M[x]=0;else M[x]=max(M[x],d);return;}
    int mid=(l+r)>>1;
    if(pos<=mid)ch(ls,l,mid,pos,d);
    else ch(rs,mid+1,r,pos,d);
    M[x]=max(M[ls],M[rs]);
}
int Q(int x,int l,int r,int pos){
    if(r<=pos)return M[x];
    int mid=(l+r)>>1;
    if(pos<=mid)return Q(ls,l,mid,pos);
    else return max(M[ls],Q(rs,mid+1,r,pos));
}
void solve(int l,int r){
    if(l>=r)return;
    int mid=(l+r)>>1;
    solve(l,mid);
    rep(i,l,r)b[i]=i;
    sort(b+l,b+mid+1,cmp_mx);
    sort(b+mid+1,b+r+1,cmp_a);
    int pos=mid+1;
    rep(i,l,mid){
        ch(1,1,len,a[b[i]],dp[b[i]]);

        for(;pos<=r && a[b[pos]]<mx[b[i]];pos++); ////

        for(;pos<=r && a[b[pos]]>=mx[b[i]] && (a[b[pos]]<mx[b[i+1]] || i==mid);pos++){
            dp[b[pos]]=max(dp[b[pos]],Q(1,1,len,mi[b[pos]])+1);
        }
    }
    rep(i,l,mid)ch(1,1,len,a[b[i]],0);

    solve(mid+1,r);
}
int main(){
    scanf("%d%d",&n,&m);
    rep(i,1,n)scanf("%d",&a[i]),mx[i]=mi[i]=a[i],dp[i]=1,len=max(len,a[i]);
    int x,y;
    rep(i,1,m){
        scanf("%d%d",&x,&y);
        mx[x]=max(mx[x],y);
        mi[x]=min(mi[x],y);
        len=max(len,y);
    }
    solve(1,n);
    int ans=0;
    rep(i,1,n)ans=max(ans,dp[i]);
    printf("%d\n",ans);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

BZOJ4553 [Tjoi2016&Heoi2016]序列

设一个数的原值为v[i],最小能变化的值为l[i],最大值为r[i],观察一下可发现,i可放在j后面当且仅当r[j] 然而我写了一发树套树T了,今天模拟,考了一道题,也是dp最长某某某条件子序列转化为...
  • neither_nor
  • neither_nor
  • 2016年05月16日 21:12
  • 831

BZOJ4553: [Tjoi2016&Heoi2016]序列

BZOJ4553蒟蒻拿到题只会n2n^{2}暴力,还把煞笔n2n^{2}打错了。。 其实将n2n^{2}优化一下,就是两个限制求最值了,什么乱七八糟的数据结构套来套去的反正我不会。。【代码】煞笔暴力...
  • Ep1C_HeReT1c
  • Ep1C_HeReT1c
  • 2017年04月07日 16:58
  • 228

[BZOJ4553][Tjoi2016&Heoi2016]序列 CDQ分治

令b[]为原序列,a[i]为修改过程中b[i]被修改到的历史最大值,c[i]为历史最小值 原题可转化为求最长的子序列,满足对于任意两项ii,jj,i...
  • di4CoveRy
  • di4CoveRy
  • 2017年01月30日 18:15
  • 194

bzoj 4553: [Tjoi2016&Heoi2016]序列

令L[i]表示i可以取到的最小值,R[i]表示i可以取到的最大值。 如果i可以成为子序列中j的前一项,必须满足 i...
  • heheda_is_an_OIer
  • heheda_is_an_OIer
  • 2016年05月06日 15:14
  • 673

BZOJ 4553: [Tjoi2016&Heoi2016]序列

我就不懂了怎么又是线段树啊(好吧其实可以写平衡树) f[i]可以从f[j](a[j] 观察条件发现就是某个矩阵里的权最大的点 权值线段树套权值线段树就可以n(logn)^2了,但是空间也是这么多...
  • nlj1999
  • nlj1999
  • 2016年05月20日 19:58
  • 386

BZOJ 4553 [Tjoi2016&Heoi2016]序列

分治+线段树记l[i]表示i可能变成的最小值(包括a[i]),同理r[i]最大值。显然i能从j转移当且仅当i#include #include #define cmin(u,v) ((u)>(v)?(...
  • ziqian2000
  • ziqian2000
  • 2017年04月02日 00:31
  • 188

4553: [Tjoi2016&Heoi2016]序列

4553: [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 428  Solved: 207 [Su...
  • CRZbulabula
  • CRZbulabula
  • 2016年11月27日 12:33
  • 314

【50.40%】【BZOJ 4553】[Tjoi2016&Heoi2016]序列

Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 371  Solved: 187 [Submit][Status][Discuss] Descr...
  • harlow_cheng
  • harlow_cheng
  • 2016年09月19日 21:13
  • 217

[Tjoi2016&Heoi2016]【BZOJ 4553】【JZOJ 4606】序列

Solution 先搞一个n2n^2的暴力, 设原序列为aia_i,变化的最大为BxiBx_i,最小为BiiBi_i, 枚举j转移过来,要满足在所有的变一个的情况下的不下降,那么肯定是当前的aj⩽...
  • HOWARLI
  • HOWARLI
  • 2016年07月14日 09:50
  • 299

bzoj 4553: [Tjoi2016&Heoi2016]序列 (CDQ分治+DP+树状数组)

题目描述传送门题目大意:有一个长为n的序列,m个变换,每次变换把x位置的权值变成v.求一个子序列满足在任意变换中都单调不降(任意变换不能同时进行),问子序列的最长长度。题解先考虑暴力DP。如果点j 可...
  • clover_hxy
  • clover_hxy
  • 2017年03月25日 18:31
  • 163
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:4553: [Tjoi2016&Heoi2016]序列
举报原因:
原因补充:

(最多只允许输入30个字)