首页 > 其他分享 >杂题随笔 10.31 两道LIS相关的题

杂题随笔 10.31 两道LIS相关的题

时间:2024-10-31 13:24:00浏览次数:1  
标签:10.31 get int auto vector LIS 序列 杂题

https://www.luogu.com.cn/problem/AT_abc354_f
题意:给定一个序列a,求出所有的i使得任意一个a的最长子序列包含i。
解法:我们先求这个序列的LIS的长度maxx,然后再去正着求一遍最长上升子序列和反着求一遍最长下降子序列即可,如果拼起来等于maxx那么说明i这个点是满足要求的点。
注意细节的处理,反着求最长下降子序列相当于把原序列取反后reverse一下然后再求一遍LIS。

vector<int> get(const std::vector<int> &a) {
    const int n = a.size();
    
    std::vector<int> f(n);
    std::vector<int> g;
    for (int i = 0; i < n; i++) {
        auto it = std::lower_bound(g.begin(), g.end(), a[i]);
        f[i] = it - g.begin();
        if (it == g.end()) {
            g.push_back(a[i]);
        } else {
            *it = a[i];
        }
    }
    return f;
}
void solve()
{
    int n;
    cin>>n;
    vector<int> a(n);
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    auto f = get(a);
    reverse(all(a));
    for(auto &x:a)
    {
        x*=-1;
    }
    auto g = get(a);
    reverse(all(g));
    for(int i=0;i<n;i++)
    {
        f[i]+=g[i];
    }
    int maxx = *max_element(all(f));
    vector<int> ans;
    for(int i=0;i<n;i++)
    {
        if(f[i]==maxx)
        {
            ans.push_back(i+1);
        }
    }
    cout<<(int)ans.size()<<"\n";
    for(auto x:ans)
    {
        cout<<x<<" ";
    }
    cout<<'\n';
}

https://www.luogu.com.cn/problem/AT_arc149_b
题意:给定两个序列a,b,选一个下标i,swap(a[i],a[i+1]) swap(b[i],b[i+1]),可以操作任意次,问LIS(a)+LIS(b)的值最大是多少。
解法:如果我们位于i,我们考虑三种情况:
1.换了之后LIS(a)+1,LIS(b)-1,那么这种操作对答案的贡献肯定没有影响,可以换
2.换了之后LIS(a)+1,LIS(b)+1 贡献为正,可以换
3.两者都是-1 ,贡献为负,不换。
考虑到交换操作是两序列同步进行的,那么若a序列以最好的可能交换,是不会减少两序列总体对答案的贡献的。因为两个序列都是排列,将b映射到a上,再将a从小到大排序即可。

int get(auto a)
{
   vector<int> f;
   for(auto x:a)
   {
       auto it = lower_bound(all(f),x);
       if(it==f.end())
       {
           f.push_back(x);
       }
       else 
       {
           *it = x;
       }
   }
   return f.size();
}
int main()
{
   ios::sync_with_stdio(false);
   cin.tie(0);
   cout.tie(0);
   cin>>n;
   vector<int> a(n),b(n);
   for(int i=0;i<n;i++)
   {
       cin>>a[i];
   }
   for(int i=0;i<n;i++)
   {
       cin>>b[a[i]-1];
   }
   int len = get(b);
   cout<<len+n<<'\n';
}

注意从下标为0输入,输入b[a[i]-1].

标签:10.31,get,int,auto,vector,LIS,序列,杂题
From: https://www.cnblogs.com/captainfly/p/18517522

相关文章

  • Day65 小贪心 & 自选杂题
    哎怎么必可公益赛被爆破了,怎么lifan还加了几道我们的训练题目作为补偿。CF不知道死了多久了,一上午都没有打成duel!今天上午精神状态明显好了很多,可能和咖啡有点关系吧。按照时间顺序写题吧。AT_arc070_b可以进行撤销背包,也可以算前后缀背包,都是记录方案数。不难的。AT_a......
  • Python中list列表的所有方法
    Python中list列表的所有方法方法描述返回值list.append()在列表末尾添加指定元素,如果增加的是序列会形成嵌套。无返回,直接修改。list.extend()在列表末尾逐个添加指定序列中的所有元素。无返回,直接修改。list.insert()将对象插入列表指定位置,如果增加的是序列会形成嵌套。无返......
  • 强连通分量学习笔记+杂题
    图论系列:前言:僕は明快さ故にアイロニー優柔不断なフォローミー後悔後悔夜の果て相关题单:戳我一.强连通分量相关定义基本摘自oiwiki,相关定义还是需要了解。(实际就是搬了个oiwiki)强连通分量主要在研究有向图可达性,针对的图类型为有向弱联通图。1.强连通定义强连通:对......
  • WPF重写了ListView的ItemsPanel,改用WrapPanel做容器。不能自动换行问题
    直接上正确代码:1<ListViewx:Name="lv_product"HorizontalContentAlignment="Stretch"ItemsSource="{BindingProducts}"2ScrollViewer.HorizontalScrollBarVisibility="Disabled"ScrollViewer.VerticalScrollB......
  • list(c++)
    list介绍list是STL容器中的容器,且元素在容器中的位置是分散的并与大小无关。list的底层是双向链表,其优势是在任意位置插入和删除元素的时间复杂度为O(1),但无法通过“下标[]”直接访问元素,需要通过从头(尾)遍历元素找到元素,多用于需要大量数据的插入和删除,且对数据的随机访问比......
  • vue2基础组件通信案例练习:把案例Todo-list改写成本地缓存
    @目录概述前端代码本人其他相关文章链接概述前面文章案例已经练习了父子组件之间的通信,这一节讲述如何把todos数组放进本地缓存中,因为实际开发场景中频繁查询的数据很有可能会用到本地缓存技术。思考:如何改成使用本地缓存,是写一堆按钮每次触发就是往本地缓存种get和set?答案......
  • 温故知新,基于播客形式学习英语之EnglishPod 365, 英语口语发音注意事项
    英语国际音标学习英语国际音标(IPA,InternationalPhoneticAlphabet)是掌握标准发音的有效途径。以下是学习国际音标的关键方法和具体音标的说明:1.音标基础知识元音和辅音:音标分为元音(vowels)和辅音(consonants),元音是发音时没有任何阻碍的,而辅音则包含部分阻碍发音的动作。长......
  • Android实现ListView嵌套Checkbox真正的多选、全选、反选 (附完整源码)
    Android实现ListView嵌套Checkbox真正的多选、全选、反选1.创建项目2.添加布局文件3.创建数据模型4.创建自定义Adapter5.实现MainActivity6.运行项目在Android中实现一个包含复选框的ListView,并支持多选、全选和反选的功能,可以按照以下步骤进行。我们将......
  • Java常见List面试题
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!获取一个类Class对象的方式有哪些?ArrayList和LinkedList的区别有哪些?用过ArrayList吗?说一下它有什么特点?有数组了为什么还要搞个ArrayList呢?说说什么是fail-fast?似乎有点模糊了,那就大概看一下Java基础面试......
  • zblog获取tag列表函数GetTagList参数和使用方法介绍说明
    函数位置:zblogphp.php文件,大约2641行。函数参数:$select:数组,获取指定数据。$where:数组,数据获取限制规则。$order:数组,数据获取排序规则。$limit:数组,获取数据数量限制。$option:数组,附加限制选项,可用来获取指定范围内的数据。函数输出:输出一个数组。示例:{......