首页 > 其他分享 >11.1

11.1

时间:2023-11-01 22:13:24浏览次数:33  
标签:count ch 11.1 value nx tot mod

四个小时T1硬是没想到双指针。只能说学啥就嗯对着啥输出。

T1

挺简单一个题。发现区间右端点向右的同时,左端点不向左,就可以用双指针。\(r\) 一直向右,如果当前区间不合法 \(l\) 也向右直到合法。

建一个权值线段树维护两个端点之间的区间的最长连续段(常规),然后每次给答案加上区间长度的贡献。

点击查看代码
#include<bits/stdc++.h>
typedef int count ;
typedef long long value;
inline value read(){
    count f(1);
    value x(0);
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
    for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
    return f*x;
}
void write(value x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
#define debug(x) std::cout<<"###"<<x<<std::endl;

#define maxn 200010
count n,k;
value a[maxn],ans;

#define lc (hao<<1)
#define rc (hao<<1 | 1)
struct tree{
    count l,r;
    value lm,rm,maxx,cnt;
} shu[maxn<<2];
inline void pushup(count hao){
    shu[hao].maxx=std::max({shu[lc].maxx,shu[rc].maxx,shu[lc].rm+shu[rc].lm});
    shu[hao].lm=shu[lc].lm+(shu[lc].lm==shu[lc].r-shu[lc].l+1)*shu[rc].lm;
    shu[hao].rm=shu[rc].rm+(shu[rc].rm==shu[rc].r-shu[rc].l+1)*shu[lc].rm;
}
void insert(count hao,count l,count r,count pos){
    shu[hao].l=l,shu[hao].r=r;
    if(l==r){
        shu[hao].cnt++;
        shu[hao].lm=shu[hao].rm=shu[hao].maxx=1;
        return ;
    }
    count mid=(l+r)>>1;
    if(pos<=mid) insert(lc,l,mid,pos);
    else insert(rc,mid+1,r,pos);
    pushup(hao);
}
void del(count hao,count pos){
    if(shu[hao].l==shu[hao].r){
        shu[hao].cnt--;
        if(!shu[hao].cnt){
            shu[hao].lm=shu[hao].rm=shu[hao].maxx=0;
        }
        return ;
    }
    count mid=(shu[hao].l+shu[hao].r)>>1;
    if(pos<=mid) del(lc,pos);
    else del(rc,pos);
    pushup(hao);
}
tree ask(count hao,count l,count r){
    if(shu[hao].l>=l && shu[hao].r<=r){
        return shu[hao];
    }
    count mid=(shu[hao].l+shu[hao].r)>>1;
    tree now={0,0,0,0,0,0};

    if(l<=mid && r>mid){
        tree le=ask(lc,l,r);
        tree ri=ask(rc,l,r);
        now.maxx=std::max({le.maxx,ri.maxx,le.rm+ri.lm});
        now.lm=le.lm+(le.lm==le.r-le.l+1)*ri.lm;
        now.rm=ri.rm+(ri.rm==ri.r-ri.l+1)*le.rm;
        return now;
    }
    if(l<=mid){
        return ask(lc,l,r);
    }
    return ask(rc,l,r);
}

int main(){
    freopen("set.in","r",stdin);
    freopen("set.out","w",stdout);

    n=read(),k=read();
    for(count i=1;i<=n;i++){
        a[i]=read();
    }

    for(count l=1,r=1;r<=n;r++){
        insert(1,1,n,a[r]);
        while(ask(1,1,n).maxx>k){
            del(1,a[l]);
            l++;
        }
        ans+=r-l+1;
    }

    write(ans),putchar('\n');
    return 0;
}


T2 差后队列

咱也不知道这个名字是啥含义。

赛时读了读发现是概率期望就直接跳了。好吧其实也没啥时间做了,T1之外的题我总共投入了不到15min的时间。

每次弹空都只是

发现弹数大小还是比较好维护的。先把最大值挑出来,不考虑弹出,剩下的就直接维护当前所有元素的平均值。弹出的时候相当于均匀减少了,乘上 \(\dfrac{cnt-1}{cnt}\),\(cnt\) 为删前总数。

对于弹出时间不太好维护,对于期望,比较直接的,最大值一定最后弹出;其他的值都是在进入后到弹空前都有可能弹出。可以直接倒着扫一遍,记录一个 \(now\) 表示可能时间的总和。

这里有种特殊情况,就是原本一个数是最大值,又来了一个更大的,这就把原本这个顶掉了,后面的时间就应该记上。

可以整一个 \(nx\) 数组,找前一个前缀最大值,每次扫到后面的最大值就直接在上面改就好,非常方便。

最后一个问题。他可能pop操作不能排空。这时候就虚空加一堆1。上面操作完就直接操作这一步就好。这一步和上面大同小异,但是因为原本的右端点都能确定,所以最大值不用遍历到,直接修改就行。这时候我们不好知道最后一个时间是多少,就直接遍历完整区间。

一开始感觉太难了,理解了……也就那样

点击查看代码
#include<bits/stdc++.h>
typedef long long count ;
typedef long long value ;
#define int long long
inline value read(){
    count f(1);
    value x(0);
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
    for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
    return f*x;
}
void write(value x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
#define debug(x) std::cout<<"###"<<x<<std::endl;

#define mod  998244353
#define maxn 1000010
count n,duan,cnt;

inline value kuai(value base,value x){
    value val=1;
    while(x){
        if(x&1) val=val*base%mod;
        base=base*base%mod;
        x>>=1;
    }
    return val;
}

count nx[maxn];
value ans[maxn];

struct cun{
    count op;
    value val;
} a[maxn];

inline void jie(count l,count r){
    count ma=l,sum=0;
    value tot=0;
    for(count i=l+1;i<r;i++){
        if(a[i].op==0){
            if(a[ma].val<a[i].val){
                tot=(tot+a[ma].val)%mod;
                nx[i]=ma;
                ma=i;
            }else{
                tot=(tot+a[i].val)%mod;
            }
            sum++;
        }else{
            value ni=kuai(sum,mod-2);
            ans[i]=tot*ni%mod;
            tot=(tot*(sum-1)%mod*ni)%mod;
            sum--;
        }
    }
    ans[r]=a[ma].val;
    ans[ma]=r;

    sum=0;
    tot=0;
    for(count i=r-1;i>=l;i--){
        if(a[i].op==1){
            sum++;
            tot=(tot+i)%mod;
        }else{
            if(a[nx[i]].val==a[ma].val) continue;
            value ni=kuai(sum,mod-2);
            ans[nx[i]]=(ans[nx[i]]+tot*ni%mod)%mod;
            //不是最大值但原本被当做最大值,没算上贡献,现在补上
            tot=(tot*(sum-1)%mod*ni)%mod;
            sum--;
        }
    }
}

inline void jie2(count l,count r){
    if(l>r) return ;
    count  ma=l,sum=0;
    value tot=0;
    count cnt=1;
    for(count i=l+1;i<=r;i++){
        if(a[i].op==0){
            if(a[ma].val<a[i].val){
                tot=(tot+a[ma].val)%mod;
                nx[i]=ma;
                ma=i;
            }else{
                tot=(tot+a[i].val)%mod;
            }
            sum++;
            cnt++;
        }else{
            value ni=kuai(sum,mod-2);
            ans[i]=tot*ni%mod;
            tot=(tot*(sum-1)%mod*ni)%mod;
            sum--;
        }
    }

    cnt=(cnt-(r-l+1-cnt));
    sum=cnt-1;
    tot=0;
    for(count i=r;i>=l;i--){
        if(a[i].op==1){
            sum++;
            tot=(tot+i)%mod;
        }else{
            if(a[nx[i]].val==a[ma].val) continue;
            value ni=kuai(sum,mod-2);
            ans[nx[i]]=(ans[nx[i]]+tot*ni%mod)%mod;
            tot=(tot*(sum-1)%mod*ni)%mod;
            sum--;
        }
    }
}
main(){
    freopen("queue.in","r",stdin);
    freopen("queue.out","w",stdout);

    n=read();
    duan=1;

    // iota(nx+1,nx+1+n,1);
    for(count i=1;i<=n;i++){
        a[i].op=read();
        if(!a[i].op){
            a[i].val=read();
            cnt++;
        }else{
            cnt--;
        }

        if(!cnt){
            jie(duan,i);
            duan=i+1;
        }
    }
    
    jie2(duan,n);

    for(count i=1;i<=n;i++){
        write(ans[i]),putchar(' ');
    }
    return 0;
}

T3 摆

标签:count,ch,11.1,value,nx,tot,mod
From: https://www.cnblogs.com/eldenlord/p/17804234.html

相关文章

  • 刘铭诚:11.1-2美盘黄金行情涨跌走势解析及期货原油价格操作建议
    黄金行情走势分析——白盘波动不大,午间下跌预期给到1975一线入场多单,目前到达1983一线,短线拿到8个点。整体来看今日的波动振幅还没有打开,但是从相关美元指数来看比较利好美元,目前更是来到106.85.晚间有望向107水平关口发起冲锋,届时黄金还会承受打击下跌。昨日黄金受到多次......
  • 11.1打卡
    1.有效的数独(36)请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)classSol......
  • 11.1日记
    数据库设计 需求分析:即分析数据存储的要求,主要产出物有数据流图,数据字典,需求说明书。 概念结构设计:就是设计E-R图,即实体-属性图,与物理实现无关,说明有哪些实体,哪些属性, 逻辑结构设计:将E-R图转成关系模式,即转换为实际的表和表中的列属性。 物理设计:根据生成的表等概念,生成物理数......
  • 11.1每日总结
    今天完成了企业erp的所有子系统的流程图绘制,并且完成了软件构造的随堂那个实验和课下作业,并且做了软考的题,明天继续。 ......
  • 11.1
    此次期中考试,我只得了两分,缺少一个传值的方法,整个程序不能运行,只有单个的jsp页面可以在浏览器显示出来。总之就是我没有好好的学,在周六日也没有好好学习,就看了一下上次的代码程序,并看了看html页面单选框复选框什么的,和页面传值交互的语句,我很自信的认为在其中考试中能够及格,可实际......
  • 11.1学习总结
    importjava.io.FileWriter;importjava.io.IOException;importjava.util.HashSet;importjava.util.Random;importjava.util.Scanner;importjava.util.Set;publicclassMathExerciseGenerator{publicstaticvoidmain(String[]args){intnumExercises=......
  • 11.1算法
    递增的三元子序列给你一个整数数组 nums,判断这个数组中是否存在长度为3的递增子序列。如果存在这样的三元组下标(i,j,k) 且满足i<j<k,使得 nums[i]<nums[j]<nums[k],返回true;否则,返回false。 示例1:输入:nums=[1,2,3,4,5]输出:true解释:任何i<j<k......
  • VS2019安装PCL 1.11.1
    1.从官网下载PCL:https://github.com/PointCloudLibrary/pcl/releases 下载这两个文件就行2.安装运行下载好的exe进行安装,注意这一步要选第二个添加到系统变量,一直下一步安装到默认路径即可: 我这里安装的时候选成了第一个,但是没关系,安装好后再系统变量的Path里添加: 然......
  • 那些年,这些年……2011.12.16
    那些年我还是小屁孩,那些年我什么都不懂,那些年学习只是件有点兴趣的事,从没有想过为什么要学习,那些年刚刚听的流行歌曲是老鼠爱大米和一千年以后,那些年对于感情什么都不懂,也许早点懂或许能骗骗小女孩什么的,那些年母亲管我很严格,那些我很瘦说真的,那些年似乎我很优秀,那些年第一次......
  • win10 CUDA11.1安装torch1.9 / reformer_pytorch
    环境NVIDIA-SMI457.52DriverVersion:457.52CUDAVersion:11.1安装torch-gpucondacreate-ntorch1.9python=3.8pipinstalltorch==1.9.1+cu111torchvision==0.10.1+cu111torchaudio==0.9.1-fhttps://download.pytorch.org/whl/torch_stable.htmlc......