传送门

\(\color{green}{solution}\)

贪心

/**************************************************************
    Problem: 5158
    User: MiEcoku
    Language: C++
    Result: Accepted
    Time:420 ms
    Memory:5980 kb
****************************************************************/

#include <bits/stdc++.h>
using namespace std;

const int maxn = 100010;

struct Edge {
    int v; Edge *next;
    Edge (int v, Edge *next) : v(v), next(next) {}
    Edge () {}
}*head[maxn], pool[maxn << 1], *pis = pool;

int val[maxn], rd[maxn], top[maxn], n, cnt;
long long ans;
inline void link(int a, int b) {
    head[a] = new (pis ++)Edge(b, head[a]); rd[b]++;
}
priority_queue<int> q;
int tr[maxn << 2];
inline void modify(int c, int l, int r, int L, int o) {
    if( l == r) { tr[c] = o; return;}
    int mid = l + r >> 1;
    if( L <= mid) modify(c << 1, l, mid, L, o);
    else modify(c << 1|1, mid+1, r, L, o);
    tr[c] = max(tr[c << 1], tr[c << 1|1]);
}
int qry(int c, int l, int r, int L) {
    if( r <= L) return tr[c];
    int mid = l + r >> 1;
    if( L <= mid) return qry(c << 1, l, mid, L);
    return max(tr[c << 1], qry(c << 1|1, mid+1, r, L));
}
int main() {
    scanf("%d", &n);
    for ( register int i = 1, x; i <= n; ++ i) {
        scanf("%d", &x); if( (x-1)) link(top[x-1], i);
        if( top[x]) link(i, top[x]); top[x] = i;
    }
    for ( register int i = 1; i <= n; ++ i)
        if( !rd[i]) q.push(i);
    while ( !q.empty()) {
        int u = q.top(); q.pop();
        val[u] = ++cnt;
        for ( Edge *now = head[u]; now; now = now->next)
            if( !(--rd[now->v])) q.push(now->v);
    }
    for ( register int i = n, ret; i; -- i) {
        ret = 1 + qry(1, 1, n, val[i]);
        modify(1, 1, n, val[i], ret); ans += ret;
    }
    printf("%lld\n", ans);
}

[BZOJ 5158][Tjoi2014]Alice and Bob的更多相关文章

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

    题意 给出一个序列的以每一项结尾的 \(LIS\) 的长度a[],求一个序列,使得以每一项为开头的最长下降子序列的长度之和最大. \(n\leq 10^5\) . 分析 最优解一定是一个排列,因为如果 ...

  2. [bzoj5158][Tjoi2014]Alice and Bob

    好羞愧啊最近一直在刷水... 题意:给定序列$c$的$a_i$,构造出一个序列$c$使得$\sum b_i$最大. 其中$a_i$表示以$c_i$结尾的最长上升子序列长度,$b_i$表示以$c_i$为 ...

  3. BZOJ5158 [Tjoi2014]Alice and Bob 【贪心 + 拓扑】

    题目链接 BZOJ5158 题解 题中所给的最长上升子序列其实就是一个限制条件 我们要构造出最大的以\(i\)开头的最长下降子序列,就需要编号大的点的权值尽量小 相同时当然就没有贡献,所以我们不妨令权 ...

  4. [TJOI2014] Alice and Bob

    非常好的一道思维性题目,想了很久才想出来qwq(我好笨啊) 考虑a[]数组有什么用,首先可以yy出一些性质 (设num[i]为原来第i个位置的数是什么 , 因为题目说至少有一个排列可以满足a[],所以 ...

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

    B Alice and Bob •输入输出文件: alice.in/alice.out •源文件名: alice.cpp/alice.c/alice.pas • 时间限制: 1s 内存限制: 128M ...

  6. UOJ #266 【清华集训2016】 Alice和Bob又在玩游戏

    题目链接:Alice和Bob又在玩游戏 这道题就是一个很显然的公平游戏. 首先\(O(n^2)\)的算法非常好写.暴力枚举每个后继计算\(mex\)即可.注意计算后继的时候可以直接从父亲转移过来,没必 ...

  7. 2016中国大学生程序设计竞赛 - 网络选拔赛 J. Alice and Bob

    Alice and Bob Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  8. bzoj4730: Alice和Bob又在玩游戏

    Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...

  9. Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)

    Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...

随机推荐

  1. Git自动补全

    一.简介 假使你使用命令行工具运行Git命令,那么每次手动输入各种命令是一件很令人厌烦的事情.为了解决这个问题,你可以启用Git的自动补全功能,完成这项工作仅需要几分钟.   二.操作步骤 1) cd ...

  2. [C++] Virtual Destructor(虚析构函数)

    Without Virtual Destructor(虚析构函数) class A{ public: ; A() { cout <<"A()..."<< e ...

  3. 最近公共祖先 LCA Tarjan算法

    来自:http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html 对于一棵有根树,就会有父亲结点,祖先结点,当然最近公共祖先就是这两个 ...

  4. 关于设置了setMaxAge(0)而浏览器未成功删除Cookie的注意事项

    最近做了个系统,其中涉及到对Cookie的操作.当用户登录时,设置一些数据到Cookie中,用户登出系统的时候删除写入浏览器中的对应Cookie.问题就出在登出系统时,在firebug中看到需要删除的 ...

  5. 数据库SQL优化大总结之 百万级数据库优化方案(转)

    出处:http://www.cnblogs.com/yunfeifei/p/3850440.htm 网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不 ...

  6. [GO]gomaxprocs的使用

    package main import ( "runtime" "fmt" ) func main() { n := runtime.GOMAXPROCS()/ ...

  7. C++11之Lambda特性探析

    目录 目录 1 1. 什么是Lambda? 1 2. 语法格式 1 2.1. 语法格式 1 2.2. 最简定义 2 3. 应用示例 2 4. capture列表 3 4.1. 基本形式 3 4.2.  ...

  8. Python Selenium 之常用API

    Selenium WebDriver下提供许多用来与浏览器.元素.鼠标.键盘.弹框.下拉菜单和列表的交互和设置方法.这些是计算机模拟人工进行自动化测试所必要依赖的方法.下面将用列表的方式总结出常用的A ...

  9. SOAP协议初级指南 (一)

    SOAP(Simple Object Access Protocal) 技术有助于实现大量异构程序和平台之间的互操作性,从而使存在的应用能够被广泛的用户所访问.SOAP是把成熟的基于HTTP的WEB技 ...

  10. numpy数组与python的list互转,然后用json写入文件与c交互

    1.对于numpy的tofile方法,一个一维数组可以直接写成二进制形式,用c语言或者numpy.fromfile()可以读出来内容.而如果数组超过一维,tofile并不区分,也就是arr1=[1,2 ...