6 条题解

  • 1
    @ 2025-6-17 9:09:22

    ST表

    把每一段相同的数抽象成一个数,这个数的权值就是他出现的次数

    code

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    
    namespace syr
    {
    	const ll N = 1e5+10;
    	ll n, m, l, r, cnt;
    	ll a[N], t[N], x[N], y[N], st[N][25];
    	ll find (ll l, ll r) {
    		if (r<l) return 0;
    		ll k = log2(r-l+1);
    		return max(st[l][k], st[r-(1<<k)+1][k]);
    	}
    	void work()
    	{
    		while (cin>>n) {
    			if (!n) return;
    			cin>>m;
    			for (ll i=1; i<=n; i++) cin>>a[i];
    			l = r = 1;
    			while (r<=n) {
    				cnt++;
    				while (a[r]==a[l] && r<=n) {
    					t[r] = cnt;
    					r++;
    				}
    				x[cnt] = l;
    				y[cnt] = r-1;
    				st[cnt][0] = r-l;
    				l = r;			
    			}
    			for (ll i=1; i<=21; i++)
    				for (ll j=1; j+(1<<(i-1))<=cnt; j++)
    					st[j][i] = max(st[j][i-1], st[j+(1<<(i-1))][i-1]);
    			while (m--) {
    				cin>>l>>r;
    				if (t[l]==t[r]) {
    					cout<<r-l+1<<'\n';
    					continue;
    				}
    				ll ans=0;
    				ans = max(y[t[l]]-l+1, r-x[t[r]]+1);
    				ans = max(ans, find(t[l]+1, t[r]-1));
    				cout<<ans<<'\n';
    			}
    		}
    	}
    } 
    
    int main()
    {
    	cin.tie(0)->sync_with_stdio(0);
    	syr::work();
    	return 0;
    }
    

    信息

    ID
    103
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    91
    已通过
    17
    上传者