[bzoj5158][Tjoi2014]Alice and Bob

好羞愧啊最近一直在刷水。。。

题意:给定序列$c$的$a_i$,构造出一个序列$c$使得$\sum b_i$最大。

其中$a_i$表示以$c_i$结尾的最长上升子序列长度,$b_i$表示以$c_i$为开头的最长下降子序列长度。

首先$a_i = x$一定是从一个$a_j = x-1$转移而来的。这里让$a_i$从所有$a_j = x-1$的$a_j$里$c_j$最小的转移而来,一定不会有更优的转移。

因为这样它还可以和其它$a_j$做出至少1的贡献。那么我们由$i$向$j$连边。这样会形成一棵以0为根的树,后连边的点先遍历,令$c_j $等于dfs序。这样得到的序列就可以满足题意。求一遍$b$就行了。

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
inline int read(){
    int r=0,c=getchar();
    while(!isdigit(c))c=getchar();
    while(isdigit(c))
    r=r*10+c-‘0‘,c=getchar();
    return r;
}
struct Edge{
    int to,nxt;
}e[N*2];
int head[N],cnt=1;
void add(int u,int v){
    e[cnt]=(Edge){v,head[u]};
    head[u]=cnt++;
}
int a[N],las[N],n,dc;
void dfs(int u){
    a[u]=++dc;
    for(int i=head[u];i;i=e[i].nxt)
    dfs(e[i].to);
}
int b[N],c[N];
void upd(int x,int v){
    for(int i=x;i<=n;i+=i&-i)
    c[i]=max(c[i],v);
}
int ask(int x){
    int ret=0;
    for(int i=x;i;i-=i&-i)
    ret=max(ret,c[i]);
    return ret;
}
int main(){
    n=read();
    for(int i=1;i<=n;i++){
        int x=read();
        add(las[x-1],i);
        las[x]=i;
    }
    dfs(0);
    long long ans=0;
    for(int i=n;i;i--){
        b[i]=ask(a[i]-1)+1;
        ans+=1ll*b[i];
        upd(a[i],b[i]);
    }
    cout<<ans;
}

原文地址:https://www.cnblogs.com/orzzz/p/8444149.html

时间: 2024-10-17 05:43:03

[bzoj5158][Tjoi2014]Alice and Bob的相关文章

[TJOI2014]Alice and Bob[拓扑排序+贪心]

题意 给出一个序列的以每一项结尾的 \(LIS\) 的长度a[],求一个序列,使得以每一项为开头的最长下降子序列的长度之和最大. \(n\leq 10^5\) . 分析 最优解一定是一个排列,因为如果两个数字的大小相同,完全可以区别他们的大小,以得到更多的贡献. 考虑的 \(a\) 给定的限制,显然对于所有的相同大小的 \(a\) ,前一项 \(a_{p_1}\) 要大于后一项 \(a_{p_2}\),否则一定会产生更长的上升子序列.连边\(p_2\rightarrow p_1\)表示 \(p_

关于TJOI2014的一道题——Alice and Bob

B Alice and Bob ?输入输出文件: alice.in/alice.out ?源文件名: alice.cpp/alice.c/alice.pas ? 时间限制: 1s 内存限制: 128M 题目描述 Alice 和 Bob 发明了一个新的游戏.给定一个序列{x0,x1,··· ,xn?1}.Alice得 到一个序列 {a0,a1,··· ,an?1},其中 ai 表示以 xi 结尾的最长上升子序列的长 度:Bob 得到一个序列 {b0,b1,··· ,bn?1},其中 bi 表示以

codeforces_346A Alice and Bob(数学)

题目链接:http://codeforces.com/problemset/problem/346/A 参考链接:http://blog.csdn.net/loy_184548/article/details/50174615 感受到数学在博弈论中的强大. 考虑最后终止状态的序列-无法取出任意两个数他们的差值不存在这个序列中:那么这必定是个首项等于公差的等差序列 而这个序列是 d 2d 3d....,因此可以通过a[1] a[2] a[3] ...的最大公约数得到 然后计算有几个数没在数组中,判

HDU4268 Alice and Bob 【贪心】

Alice and Bob Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2869    Accepted Submission(s): 926 Problem Description Alice and Bob's game never ends. Today, they introduce a new game. In this

博弈问题-Alice与Bob拿牌游戏

Description Bob and Alice play a game, and Bob will play first. Here is the rule of the game: 1) There are N stones at first; 2) Bob and Alice take turns to remove stones. Each time, they can remove p^k stones. p is prime number, such as 2, 3, 5, ...

Alice and Bob

Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Description It is so boring in the summer holiday, isn't it? So Alice and Bob have invented a new game to play. The rules are as follows. First, they get a se

HDU 4111 Alice and Bob (博弈)

Alice and Bob Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1799    Accepted Submission(s): 650 Problem Description Alice and Bob are very smart guys and they like to play all kinds of games i

HDU 4268 Alice and Bob(贪心+multiset)

HDU 4268 题意:Alice与Bob在玩卡片游戏,他们每人有n张卡片,若Alice的一张卡片长与宽都不小于Bob的一张卡片,则Bob的卡片就会被盖住,一张卡片只可以使用一次,且不可旋转求Alice最多可以盖住多少张Bob的卡片. 思路:记录两人卡片情况,并按照长度将两人卡片分别降序排序.遍历两人的卡片,将长度小于Alice的卡片长度的Bob卡片的宽度插入multiset中,在multiset中找到小于等于Alice卡片宽度的第一个数,将这个数给消去且答案+1.//贪心法自行发挥即可. co

HDU 4268 Alice and Bob(贪心+Multiset的应用)

 题意: Alice和Bob有n个长方形,有长度和宽度,一个矩形可以覆盖另一个矩形的条件的是,本身长度大于等于另一个矩形,且宽度大于等于另一个矩形,矩形不可旋转,问你Alice最多能覆盖Bob的几个矩形? 思路:贪心,先按照h将Alice和Bob的矩形排序,对于Alice的每个矩形,如果Bob的矩形的h小于Alice的h,将Bob的w插入到集合中. 然后,在集合中找到不大于Alice矩形d的最大的Bob的d,那么这样做肯定是最优的. #include<cstdio> #include<