[bzoj4491]我也不知道题目名字是什么

本文介绍了一种解决给定序列中查询最长不上升或不下降子串的问题,通过线段树维护区间信息,实现高效的查询操作。适用于序列长度及查询次数均不超过50000的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来自FallDream的博客,未经允许,请勿转载,谢谢,


给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串

n,q<=50000

线段树维护区间左右是谁,从左端开始/到右端结束的最长上升/下降子串长度即可。

复杂度nlogn

#include<iostream>
#include<cstdio>
#define MN 50000
using namespace std;
inline int read()
{
    int x = 0 , f = 1; char ch = getchar();
    while(ch < '0' || ch > '9'){ if(ch == '-') f = -1;  ch = getchar();}
    while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}
    return x * f;
}

struct data{int l1,l2,r1,r2,ans,L,R,len;
    data(){}
    data(int x){l1=l2=r1=r2=ans=len=1;L=R=x;}
    friend data operator +(const data&a,const data&b)
    {
        data c;c.L=a.L;c.R=b.R;c.len=a.len+b.len;
        c.ans=max(max(a.ans,b.ans),max(a.r2,b.l2));
        if(b.L>=a.R) c.ans=max(c.ans,a.r1+b.l1);
        if(b.L<=a.R) c.ans=max(c.ans,a.r2+b.l2);
        c.l1=a.l1==a.len?a.l1+(b.L>=a.R?b.l1:0):a.l1;
        c.l2=a.l2==a.len?a.l2+(b.L<=a.R?b.l2:0):a.l2;
        c.r1=b.r1==b.len?b.r1+(b.L>=a.R?a.r1:0):b.r1;
        c.r2=b.r2==b.len?b.r2+(b.L<=a.R?a.r2:0):b.r2;
        return c;
    }
};
struct Tree{int l,r;data x;}T[MN*4+5];
int n,m,a[MN+5];

void build(int x,int l,int r)
{
    if((T[x].l=l)==(T[x].r=r)){T[x].x=data(a[l]);return;}
    int mid=l+r>>1;
    build(x<<1,l,mid);build(x<<1|1,mid+1,r);
    T[x].x=T[x<<1].x+T[x<<1|1].x;
}

data Query(int x,int l,int r)
{
    if(T[x].l==l&&T[x].r==r) return T[x].x;
    int mid=T[x].l+T[x].r>>1;
    if(r<=mid) return Query(x<<1,l,r);
    else if(l>mid) return Query(x<<1|1,l,r);
    else return Query(x<<1,l,mid)+Query(x<<1|1,mid+1,r);
}

int main()
{
    n=read();
    for(int i=1;i<=n;++i)a[i]=read();
    m=read();build(1,1,n);
    for(int i=1;i<=m;++i)
    {
        int l=read(),r=read();
        data x=Query(1,l,r);
        x.ans=max(x.ans,max(x.l1,x.l2));
        x.ans=max(x.ans,max(x.r1,x.r2));
        printf("%d\n",x.ans);
    }
    return 0;
}

转载于:https://www.cnblogs.com/FallDream/p/bzoj4491.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值