首页 > 其他分享 >联训题单

联训题单

时间:2024-10-03 21:34:17浏览次数:1  
标签:srize int mid tor 联训 tol id 题单

总览

题单 进度 备注
数据结构1 3/24 -

数据结构 1

STEP

读假题了,读成下面这样了:

给定 01 序列,每次单点修改,查询最长的字符相同的连续段长度

这不是一眼线段树经典板子题,分别维护左右区间信息以及合并处的信息,然后尝试在中间合并来更新答案

十五分钟光速打完拉下样例来发现不对,然后才发现自己读假题了

随后发现这俩题难道不是一个做法吗,只不过你要找的是 01010 这样的而不是 11111 这样的,所以你只有在不同的时候才能合并左右区间

所以改了个符号就过了

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,q;
namespace stree{
    struct tree{
        int l,r;
        int maxsize;
        int slize,srize;
        bool lch,rch;
    }t[800001];
    #define tol (id*2)
    #define tor (id*2+1)
    #define mid(l,r) mid=((l)+(r))/2
    void pushup(int id){
        t[id].maxsize=
        max({t[tol].maxsize,t[tor].maxsize,
            t[tol].slize,t[tor].slize,
            t[tol].srize,t[tor].srize,});
        if(t[tol].rch!=t[tor].lch){
            t[id].maxsize=max(t[id].maxsize,t[tol].srize+t[tor].slize);
        }
        if(t[tol].slize==t[tol].r-t[tol].l+1 and t[tol].rch!=t[tor].lch){
            t[id].slize=t[tol].slize+t[tor].slize;
        }
        else{
            t[id].slize=t[tol].slize;
        }
        if(t[tor].srize==t[tor].r-t[tor].l+1 and t[tol].rch!=t[tor].lch){
            t[id].srize=t[tol].srize+t[tor].srize;
        }
        else{
            t[id].srize=t[tor].srize;
        }
        t[id].lch=t[tol].lch;
        t[id].rch=t[tor].rch;
    }
    void build(int id,int l,int r){
        t[id].l=l;t[id].r=r;
        if(l==r){
            t[id].maxsize=t[id].slize=t[id].srize=1;
            t[id].lch=t[id].rch=0;
            return;
        }
        int mid(l,r);
        build(tol,l,mid);
        build(tor,mid+1,r);
        pushup(id);
    }
    void change(int id,int p){
        if(t[id].l==t[id].r){
            int res=t[id].lch^1;
            t[id].lch=t[id].rch=res;
            return;
        }
        if(p<=t[tol].r) change(tol,p);
        else change(tor,p);
        pushup(id);
    }
    inline int ask(){
        return t[1].maxsize;
    }
}
int main(){
    scanf("%d %d",&n,&q);
    stree::build(1,1,n);
    while(q--){
        int x;
        scanf("%d",&x);
        stree::change(1,x);
        printf("%d\n",stree::ask());
    }
}

三元上升子序列

设 \(f2_i\) 表示以 \(i\) 结束的二元上升子序列个数,\(f3_i\) 表示以 \(i\) 结束的三元上升子序列个数,则不难有转移方程

\[f2_i=\sum_{\{j|j\lt i,a_j\lt a_i\}}1 \]

\[f3_i=\sum_{\{j|j\lt i,a_j\lt a_i\}}f2_j \]

对于内层的处理直接开一个值域线段树,从前到后在对应值域处插入答案,查询直接插 \(1\) 到当前值前缀和即可

因为有俩方程所以开了两颗线段树

要注意判当 \(a_i=1\) 时 \(a_i-1=0\) 的问题,我懒得判了直接全部都加一了,整体平移答案不变

不开 long long 见祖宗

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[30001];
int f2[30001],f3[30001];
int ans=0;
struct stree{
    struct tree{
        int l,r;
        int sum;
    }t[400001];
    #define tol (id*2)
    #define tor (id*2+1)
    #define mid(l,r) mid=((l)+(r))/2
    void build(int id,int l,int r){
        t[id].l=l;t[id].r=r;
        if(l==r){
            return;
        }
        int mid(l,r);
        build(tol,l,mid);
        build(tor,mid+1,r);
    }
    void change(int id,int p,int val){
        if(t[id].l==t[id].r){
            t[id].sum+=val;
            return;
        }
        if(t[tol].r>=p) change(tol,p,val);
        else change(tor,p,val);
        t[id].sum=t[tol].sum+t[tor].sum;
    }
    int ask(int id,int l,int r){
        if(l<=t[id].l and t[id].r<=r){
            return t[id].sum;
        }
        if(r<=t[tol].r){
            return ask(tol,l,r);
        }
        else if(l>=t[tor].l){
            return ask(tor,l,r);
        }
        int mid(t[id].l,t[id].r);
        return ask(tol,l,mid)+ask(tor,mid+1,r);
    }
};
stree x,y;
signed main(){
    scanf("%d",&n);
    x.build(1,1,100004);
    y.build(1,1,100004);
    for(int i=1;i<=n;++i){
        scanf("%lld",&a[i]);a[i]++;
    }
    for(int i=1;i<=n;++i){
        ans+=y.ask(1,1,a[i]-1);
        x.change(1,a[i],1);
        y.change(1,a[i],x.ask(1,1,a[i]-1));
    }
    cout<<ans;
}

标签:srize,int,mid,tor,联训,tol,id,题单
From: https://www.cnblogs.com/HaneDaCafe/p/18445931

相关文章

  • [39] (多校联训) A层冲刺NOIP2024模拟赛01
    你们不感觉最近机房网越来越慢了吗,现在下个10M的东西要用三分钟,而且期间访问不了网站整个机房分1000Mbps的带宽为啥只能分这么一点,huge拿我电脑挖矿了?本来以为多校就是多校的,结果是真的多校,一百一十多个人在一块考huge:参加的都是咱们北方这几个强校你说得对,但是广东......
  • 洛谷题单指南-分治与倍增-P6648 [CCC2019] Triangle: The Data Structure
    原题链接:https://www.luogu.com.cn/problem/P6648题意解读:在一个n行的数字三角形中,求所有边长为k的正三角形最大值之和。解题思路:1、枚举法枚举每一个边长为k的三角形,在其中求max,然后累加,n最多3000,时间复杂度是n^4,显然超时。2、倍增和ST思想此题非常类似于RMQ问题,也就是求区......
  • 2024-2025专题二题单 - 题解
    A-MoneyinHand(记忆化搜索)原题链接题解B-GoodGraph(并查集)原题链接题解C-IceSkating(dfs求连通块)原题链接题解D-TheLakes(dfs求连通块,连通块内累加,多组数据注意初始化)原题链接题解E-LearningLanguages(建图,dfs统计连通块个数,答案为个数-1)原题链接题......
  • 洛谷题单指南-分治与倍增-P4155 [SCOI2015] 国旗计划
    原题链接:https://www.luogu.com.cn/problem/P4155题意解读:在m个点的环上,有n个区间,且各个区间之间没有包含关系,计算从每个区间开始,最少要多少个区间能覆盖环上所有m个点。解题思路:本质上是一个区间覆盖问题!1、破环成链由于题目中是一个环,对于环的问题,在区间DP中介绍过,经典处理......
  • 冲刺CSP联训模拟1
    A.几何设\(f_{i,j,k}\)表示前\(i\)个字符,分为两部分,分别为\(x\)的几倍加\(x\)的前\(j\)位,\(y\)的几倍加\(y\)的前\(k\)位,是否合法分别判断下一位\(i+1\)能否与\(x\)的下一位\(j+1\)和\(y\)的下一位\(k+1\)匹配,匹配上了就转移.最终答案就是\(f_{|s|......
  • 洛谷题单指南-分治与倍增-P3517 [POI2011] WYK-Plot
    原题链接:https://www.luogu.com.cn/problem/P3517题意解读:有n个连续的点p1,p2,...,pn,将这n个点分成不超过m堆,每堆点连续,每一堆都缩成一个点qi,要使得原来的点p1~ps距离qi的最大值最小(最相似),求这个相似度,并计算一共分成几堆,以及每堆缩到的点qi的坐标。解题思路:要使得若干点缩到一......
  • [34](CSP 集训)CSP-S 联训模拟 1
    A几何重复若干次->不能重叠,因此考虑直接暴力DP设\(f_{i,j,k}\)表示主串匹配到第\(i\)位(将前\(i\)位分别归为两类),其中\(x\)在重复了若干次后,又匹配到了第\(j\)位,\(y\)在重复了若干次后,又匹配到了第\(k\)位转移非常好写,枚举\(i\),尝试把\(s_{i}\)分别与\(x_......
  • 『模拟赛』冲刺CSP联训模拟1
    Rank我的我要爆了A.几何上来思路就假了,不知道,样例全过,本来就算假也能拿点,结果绑包了,妈的。正解dp,设\(f_{i,j,k}\)表示串\(s\)匹配到\(i\)位,模式串\(x\)拼接至\(j\)位,\(y\)拼接至\(k\)位是否可行,滚动数组优化,复杂度\(\mathcal{O(|s||x||y|)}\),不太能过,位运......
  • 2024-2025专题一题单 - 题解
    A-Virus原题链接题解B-Coverage原题链接题解C-Sensors原题链接题解D-MakeTakahashiHappy原题链接题解E-Don’tbecycle原题链接题解F-AlmostEqual原题链接题解G-StepUpRobot原题链接题解H-SnukeMaze原题链接题解I-MEX原题链接......
  • 洛谷题单指南-分治与倍增-P3509 [POI2010] ZAB-Frog
    原题链接:https://www.luogu.com.cn/problem/P3509题意解读:n个点,每个点上有一只青蛙每次跳到距离自己第k近的点,m次之后跳到哪个点。解题思路:1、计算距离每个点第k近的点,存入ne[N]给定一个点i,距离i第k近的点一定在长度为k+1个点的窗口内,窗口包括i并且,第k近的点只能是左端点或者......