首页 > 其他分享 >CF 1860 C【最大上升子序列】

CF 1860 C【最大上升子序列】

时间:2023-09-07 19:11:28浏览次数:46  
标签:typedef ll CF tot cin 1860 ans 序列

C. Game on Permutation

这道题需要求出先手必胜

通过分析可知,每个位置结尾的最大上升子序列长度为2的点为先手必胜点,≥3的点为先手必败点。即只需要求出以每个位置为结尾的最大上升子序列长度为2的点的数量即可求出答案。

本题目的n (1≤n≤3⋅105),所以无法使用O(n2)的方法,因此可使用树状数组进行优化为O(nlogn)的时间复杂度。

代码

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;

const ll N = 3e5 + 10;
ll t, n;
ll p[N];
ll c[N];
ll f[N];
set<PII> st;
void add(ll x, ll p)
{
    for(;x <= n;x += x & -x)
    {
        c[x] = max(p, c[x]);
    }
}

ll query(ll x)
{
    ll tot = 0;
    for(;x > 0;x -= x & -x)
    {
        tot = max(tot, c[x]);
    }
    return tot;
}


signed main()
{
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> t;
    while(t--)
    {
        stack<ll> stk;
        cin >> n;
        ll tot = 0;
        ll now = 0;
        for(ll i = 1;i <= n;i++)
        {
            c[i] = 0;
        }
        for(ll i = 1;i <= n;i++)
        {
            cin >> p[i];
            int ans = query(p[i]);
            if(ans == 1)
            {
                tot++;
            }
            add(p[i], ans + 1);
        }
        cout << tot << endl;
    }
    return 0;
}

标签:typedef,ll,CF,tot,cin,1860,ans,序列
From: https://www.cnblogs.com/tongluosao/p/17685849.html

相关文章

  • CF893F
    CF893F首先,我们发现,这个题只需要子树内的答案,且只需要维护最小值。注意到对于两个点\(i,j\),若\(dep_i>dep_j\),且\(val_i\geval_j\),则对于\(lca(i,j)\)及其它的父亲,\(i\)都是一个无用的点。注意到\(n\le10^5,m\le10^6\),这启发我们进行预处理以做到\(O(\logn)\)单次......
  • 中国科教工作者协会与CCF PTA联合认证学习须知
    中国科教工作者协会与CCFPTA联合认证学习须知1、参与认证人员需在科技学堂(www.sciclass.cn)上进行课程学习,然后在PTA官网(pta.ccf.org.cn)报名并参加认证考试,考试及课程学习达标者,即可获得由中国青少年科技教育工作者协会与中国计算机学会联合颁发的认证证书。具体报名流程及认......
  • CF1374E2 Reading Books(hard version) 题解
    CF1374E2ReadingBooks(hardversion)这道题是在CF1374E1ReadingBooks(easyversion)的基础上出的,而且仅仅增加了一个\(m\)的限制,下面的做法也是基于简单版的思路而想到的。建议先尝试简单版,然后尝试此题。题意简述:有\(n\)本书,每本书有一个阅读时间\(t_i\),和属性\(......
  • 9.6 CF1830 题解
    9.6CF1830题解A.CopilCopacDrawsTrees链接真弱智题不用讲B.TheBOSSCanCountPairs题意每组数据给你一个\(n\)和两个序列\(a,b\)。求有多少个数对\((i,j)\)满足\(1\lei<j\len\)且\(a_i\timesa_j=b_i+b_j\)。题解考虑\(a_i\timesa_j=b_i......
  • CF665F
    题目链接description给定\(n\leq10^{11}\)求1到\(n\)中恰有4个因数的数的个数。solution这个数据范围容易想到筛子。题目相当于让求1到\(n\)中可以表示成\(p^3\)或\(p_1p_2\)(\(p,p_1,p_2\)都是质数)的数的个数。对于形如\(p^3\)的,直接枚举\(p\);对于......
  • 剑指 Offer 57 - II. 和为s的连续正数序列
    输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 示例1:输入:target=9输出:[[2,3,4],[4,5]]示例2:输入:target=15输出:[[1,2,3,4,5],[4,5,6],[7,8]]classSolution{publici......
  • Prufer 序列 - 无根树的序列化
    定义一种将带标号的树用一个唯一的整数序列表示的方法。Prufer序列可以把一颗带标号的\(n\)个节点的树序列化为一个长度为\(n-2\)的唯一的序列。也就相当于完全图的生成树与数列之间的双射。构造方式每次选择一个编号最小的叶节点并删掉它,然后在序列中记录下它连接到......
  • CF1036F
    题目链接description\(10^5\)次询问每次给定\(n\leq10^{18}\),求2到\(n\)内质因子分解结果为\(p_{a_1}^{b_1}p_{a_2}^{b_2}...\),且\(\gcd(b1,b2...)=1\)的数的个数。solution显然答案为\(\sum\limits_{i=1}\mu(i)\lfloor\sqrt[i]{n}-1\rfloor\)。直接用cmath......
  • CF1174E
    题目链接description给定\(n\leq10^6\),求有多少个\(1\)到\(n\)的排列,对于一个1到\(n\)的排列\(p\),\(f(p)\)表示\(p\)的任意前缀内的元素的最大公约数构成的集合的大小。求有多少个排列\(p_0\)满足\(f(p_0)=\max\{f(p)\}\)。模大质数。solution容易发现,这......
  • fakit: 一个处理fasta序列的小工具 (二)
    上一篇博文中写到出了这个小工具,现在更新到0.2.4了,新增了一些子命令。有seqtk,seqkit等好用的工具珠玉在前,还写这个主要是学习和熟悉rust这门语言的基础语法了,写出来自己玩儿咯。reop:https://github.com/sharkLoc/fakitinstall:cargoinstallfakitusage:fakit:asimplepr......