• ZJNU 2184


    ZJNU 2184 - 最长子串

    题面

    给出一个长度为(n)​​​的数列,(m)​​​个询问。

    (1 x)​​​​:找到([l,r])​​​使得对于所有的(lle ile r)(a[i]ge x)(r-l+1)最大

    (2 x y):令(a[x]=y)​​​

    (1lt nle 10^5, 1lt mle 10^4, 0le a[i]le 10^5)

    保证修改的次数不超过(10)


    思路

    修改的次数不超过(10)次,可以考虑每次修改后都预处理出所有答案,对于询问(O(1))处理

    对于答案的处理,考虑记录下每种数字的位置,放在vector中

    从大到小处理所有答案,假设当前处理到了值(x),先检查所有值为(x)​​的位置的左右两侧是否值比(x)大,如果是则借助并查集将其合并

    那么值(x)的答案也就是此时最大的集合的元素个数


    #include<bits/stdc++.h>
    #define closeSync ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
    #define multiCase int T;cin>>T;for(int t=1;t<=T;t++)
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i<(b);i++)
    #define per(i,a,b) for(int i=(a);i>=(b);i--)
    #define perr(i,a,b) for(int i=(a);i>(b);i--)
    #define all(a) (a).begin(),(a).end()
    #define SUM(a) accumulate(all(a),0LL)
    #define MIN(a) (*min_element(all(a)))
    #define MAX(a) (*max_element(all(a)))
    #define mst(a,b) memset(a,b,sizeof(a))
    #define pb push_back
    #define eb emplace_back
    #define fi first
    #define se second
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    const int INF=0x3f3f3f3f;
    const ll LINF=0x3f3f3f3f3f3f3f3f;
    const double eps=1e-12;
    const double PI=acos(-1.0);
    const ll mod=998244353;
    const int dx[8]={0,1,0,-1,1,1,-1,-1},dy[8]={1,0,-1,0,1,-1,1,-1};
    void debug(){cerr<<'
    ';}template<typename T,typename... Args>void debug(T x,Args... args){cerr<<"[ "<<x<< " ] , ";debug(args...);}
    mt19937 mt19937random(std::chrono::system_clock::now().time_since_epoch().count());
    ll getRandom(ll l,ll r){return uniform_int_distribution<ll>(l,r)(mt19937random);}
    ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
    ll qmul(ll a,ll b){ll r=0;while(b){if(b&1)r=(r+a)%mod;b>>=1;a=(a+a)%mod;}return r;}
    ll qpow(ll a,ll n){ll r=1;while(n){if(n&1)r=(r*a)%mod;n>>=1;a=(a*a)%mod;}return r;}
    ll qpow(ll a,ll n,ll p){ll r=1;while(n){if(n&1)r=(r*a)%p;n>>=1;a=(a*a)%p;}return r;}
    
    int a[100050];
    int n,m;
    int ans[100050];
    
    int gp[100050],siz[100050];
    vector<int> G[100050];
    
    int fnd(int p)
    {
        return p==gp[p]?p:(gp[p]=fnd(gp[p]));
    }
    int merge(int a,int b)
    {
        int ga=fnd(a),gb=fnd(b);
        if(ga==gb)
            return 0;
        if(ga>gb)
            swap(ga,gb);
        siz[ga]+=siz[gb]; //记录集合大小
        siz[gb]=0;
        gp[gb]=ga;
        return siz[ga];
    }
    
    void deal()
    {
        rep(i,0,100000)
            G[i].clear();
        rep(i,1,n)
        {
            gp[i]=i;
            siz[i]=1;
            G[a[i]].pb(i);
        }
        per(i,100000,0)
        {
            ans[i]=ans[i+1];
            if(!G[i].empty()) //非空则答案至少为1
                ans[i]=max(ans[i],1);
            for(int p:G[i])
            {
                if(p!=1)
                {
                    if(a[p-1]>=a[p])
                        ans[i]=max(ans[i],merge(p-1,p));
                }
                if(p!=n)
                {
                    if(a[p+1]>=a[p])
                        ans[i]=max(ans[i],merge(p+1,p));
                }
            }
        }
    }
    
    void solve()
    {
        while(cin>>n>>m)
        {
            rep(i,1,n)
                cin>>a[i];
            deal();
            rep(i,1,m)
            {
                int op;
                cin>>op;
                if(op==1)
                {
                    int x;
                    cin>>x;
                    cout<<ans[x]<<'
    ';
                }
                else
                {
                    int p,x;
                    cin>>p>>x;
                    a[p]=x;
                    deal();
                }
            }
        }
    }
    int main()
    {
        closeSync;
        //multiCase
        {
            solve();
        }
        return 0;
    }
    

  • 相关阅读:
    win7共享打印机如何设置,xp系统如何连接共享打印机。
    FTP服务-filezilla server 配置
    imp导入时 出现IMP-00017:由于 ORACLE 错误 6550, 以下语句失败: 解决方法
    抓取行政区域js代码
    docker 安装 yapi
    docker 搭建 zipkin
    docker 安装 mindoc
    centos 更换源以及安装软件
    springboot 服务卡死 连接池查询无响应问题解决
    -- Add the primary key as part of the CREATE TABLE statement in case `innodb_force_primary_key` is enabled by flyway
  • 原文地址:https://www.cnblogs.com/stelayuri/p/15137951.html
Copyright © 2020-2023  润新知