6 条题解
-
1
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
- 上传者