bzoj5158 [TJOI2014]Alice and Bob

原创 2018年04月16日 23:23:06

http://www.elijahqi.win/archives/3112
题目描述

Alice和Bob发明了一个新的游戏。给定一个序列{x0,x1,…,xn-1}。Alice得到一个序列{a0,a1,…,an-1},其中a;表示以x;结尾的最长上升子序列的长度;Bob得到一个序列{b0,b1,…,bn-1},其中bi表示以xi开头的最长下降子序列的长度。 Alice的得分是序列{a0,a1,…,an-1}的和,Bob的得分是{b0,b1,…,bn-1}的和。

输入输出格式

输入格式:

输入的第一行是n,第二行是序列{a0,a1,……’,an-1}。数据保证序列a可以由至少一个1到n的排列得到

输出格式:

输出包含一行,表示Bob能得到的最高分数

输入输出样例

输入样例#1: 复制

4
1 2 2 3
输出样例#1: 复制

5
输入样例#2: 复制

4
1 1 2 3
输出样例#2: 复制

5
说明

数据范围
对于 30% 的数据,N ≤ 1000

对于 100% 的数据,N ≤ 10^5

真是sb 树状数组求dp都yy了很久 直接到这来做思维难度直线下降

考虑贪心的去构造方案 模拟nlog(n) 求最长上升子序列的方法 这时候如果a相同 那么我必然让他们的c的权值递降更好 这样显然会对我b的答案产生更多帮助所以就每次记录一下最后一次出现的位置 然后直接从0开始dfs一下即可 因为加边..的顺序是反的.. 然后就构造出了c 然后求最长下降子序列 用树状数组倒序求即可

#include<cstdio>
#include<cctype>
#include<algorithm>
#define ll long long
using namespace std;
inline char gc(){
    static char now[1<<16],*S,*T;
    if(S==T){T=(S=now)+fread(now,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();}
    while(isdigit(ch)) x=x*10+ch-'0',ch=gc();
    return x*f;
}
const int N=1e5+10;
struct node{
    int y,next;
}data[N<<1];
int num,h[N],last[N],c[N],s[N],n;ll ans;
inline void insert1(int x,int y){
    data[++num].y=y;data[num].next=h[x];h[x]=num;
}
inline void dfs(int x){
    c[x]=++num;
    for (int i=h[x];i;i=data[i].next) dfs(data[i].y);
}
inline void add(int x,int v){while(x<=n+1) s[x]=max(s[x],v),x+=x&-x;}
inline int query(int x){static int tmp;
    tmp=0;while(x) tmp=max(tmp,s[x]),x-=x&-x;return tmp;
}
int main(){
    //freopen("bzoj5158.in","r",stdin);
    n=read();
    for (int i=1;i<=n;++i){
        static int x;x=read();
        insert1(last[x-1],i);last[x]=i;
    }num=-1;dfs(0);
    //for (int i=1;i<=n;++i) printf("%d ",c[i]);
    for (int i=n;i;--i){static int tmp;
        tmp=query(c[i])+1;ans+=tmp;add(c[i],tmp);
    }
    printf("%lld\n",ans);
    return 0;
}
版权声明:辣鸡蒟蒻的blog https://blog.csdn.net/elijahqi/article/details/79968426

[JZOJ3743] 【TJOI2014】Alice and Bob

Description N
  • hzj1054689699
  • hzj1054689699
  • 2017-04-05 19:55:30
  • 551

zoj3529 A Game Between Alice and Bob

A Game Between Alice and Bob Time Limit: 5 Seconds Memory Limit: 262144 KB Alice and Bob pl...
  • u010422038
  • u010422038
  • 2013-10-04 22:09:28
  • 1053

【TJOI2014】Alice and Bob

Description 数据保证a可以由至少一个n的排列得到 对于100%的数据,N
  • lyd_7_29
  • lyd_7_29
  • 2017-04-02 17:13:30
  • 519

【2016杭电女生赛1007】【博弈 打表找规律】Alice and Bob 可走k步斜对角线的胜负态

#include #include #include #include #include #include #include #include #include #include #include ...
  • snowy_smile
  • snowy_smile
  • 2016-05-22 23:36:08
  • 1048

bzoj5154~bzoj5159 【TJOI2014】

bzoj5154 (Day1T1)匹配 【题意】 左右各nnn个点的二分图,求完美匹配的交集 【数据范围】 n≤80n≤80n\leq80 【思路】 求出一个完美匹配,再枚举完美匹配上每条...
  • leolyun
  • leolyun
  • 2018-02-12 10:57:40
  • 1365

XTU_1168 Alice and Bob

http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1168 Alice and Bob合作完成一个游戏,首先有n个石子,ali...
  • u012773338
  • u012773338
  • 2014-09-02 12:01:43
  • 419

[TJOI2014]Alice and Bob

题目描述: 定义一个序列 x1,x2...xnx1,x2...xn{x_1,x_2...x_n} a序列a1,a2...ana1,a2...an{a_1,a_2...a_n}表示以i为结尾的最长上...
  • qq_35914587
  • qq_35914587
  • 2018-04-09 18:51:15
  • 15

JZOJ3743. 【TJOI2014】Alice and Bob

Description题解对于每个以xix_i结尾的最长上升序列长度aia_i一定是从i前面某个最长上升序列长度是ai−1a_i-1的位置转移过来的。 我们需要求的是以xix_i开头的最长下降序列长...
  • lijf2001
  • lijf2001
  • 2017-04-07 19:41:58
  • 183

[2013山东ACM省赛] Alice and Bob

Alice and Bob Time Limit: 1000MS Memory limit: 65536K 题目描述     Alice and Bob like playing...
  • sr19930829
  • sr19930829
  • 2014-05-04 15:35:24
  • 2135
收藏助手
不良信息举报
您举报文章:bzoj5158 [TJOI2014]Alice and Bob
举报原因:
原因补充:

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