码迷,mamicode.com
首页 > 其他好文 > 详细

SRM12 T2

时间:2017-08-09 23:36:58      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:ide   closed   print   play   pac   分享   const   cli   pen   

技术分享
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=40010,inf=1e9;
struct poi{int max,delta;}tree[maxn*10];
int n,K,N,cnt;
int a[maxn],b[maxn],pre[maxn],root;
int f[maxn][51];
void read(int &k)
{
    int f=1;k=0;char c=getchar();
    while(c<0||c>9)c==-&&(f=-1),c=getchar();
    while(c<=9&&c>=0)k=k*10+c-0,c=getchar();
    k*=f;
}
inline int max(int a,int b){return a>b?a:b;}
inline void pushup(int x){tree[x].max=max(tree[x<<1].max,tree[x<<1|1].max);}
inline void pushdown(int x)
{
    if(!tree[x].delta)return;
    tree[x<<1].delta+=tree[x].delta;
    tree[x<<1|1].delta+=tree[x].delta;
    tree[x<<1].max+=tree[x].delta;
    tree[x<<1|1].max+=tree[x].delta;
    tree[x].delta=0;
}
void build(int x,int l,int r,int ty)
{
    if(l==r){tree[x].max=f[l-1][ty];tree[x].delta=0;return;}
    int mid=(l+r)>>1;tree[x].delta=0;
    build(x<<1,l,mid,ty);
    build(x<<1|1,mid+1,r,ty);
    pushup(x);
}
inline void add(int x,int l,int r,int cl,int cr)
{
    if(cl<=l&&r<=cr){tree[x].max++;tree[x].delta++;return;}
    pushdown(x);
    int mid=(l+r)>>1;
    if(cl<=mid)add(x<<1,l,mid,cl,cr);
    if(cr>mid)add(x<<1|1,mid+1,r,cl,cr);
    pushup(x);
}
inline void insert(int x,int l,int r,int cx,int delta)
{
    if(l==r){tree[x].max=delta;return;}
    int mid=(l+r)>>1;
    if(cx<=mid)insert(x<<1,l,mid,cx,delta);
    else insert(x<<1|1,mid+1,r,cx,delta);
    pushup(x);
}
inline int query(int x,int l,int r,int cl,int cr)
{
    if(cl<=l&&r<=cr)return tree[x].max;
    pushdown(x);
    int mid=(l+r)>>1,ans=0;
    if(cl<=mid)ans=query(x<<1,l,mid,cl,cr);
    if(cr>mid)ans=max(ans,query(x<<1|1,mid+1,r,cl,cr));
    return ans;
}
int main()
{
    freopen("camp.in","r",stdin);
    freopen("camp.ans","w",stdout);
    read(n);read(K);
    for(int i=1;i<=n;i++)read(a[i]),b[i]=a[i];N=n;
    N=unique(b+1,b+1+N)-b-1;sort(b+1,b+1+N);
    for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+n,a[i])-b;
    for(int j=1;j<=K;j++)
    {
        for(int i=1;i<=n;i++)
        {
            add(1,1,n+1,pre[a[i]]+1,i);
            f[i][j]=query(1,1,n+1,1,i);
            pre[a[i]]=i;
        }
        if(j==K)continue;
        build(1,1,n+1,j);for(int i=1;i<=n;i++)pre[a[i]]=0;
    }
    printf("%d\n",f[n][K]);
}
View Code

 

SRM12 T2

标签:ide   closed   print   play   pac   分享   const   cli   pen   

原文地址:http://www.cnblogs.com/Sakits/p/7327940.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!