社区讨论
萌新求问(玄关
灌水区参与者 2已保存回复 15
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lu53iq21
- 此快照首次捕获于
- 2024/03/24 13:45 2 年前
- 此快照最后确认于
- 2024/03/24 15:29 2 年前
rt,我的代码为什么输入后会卡死,求大佬解答
CPP#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
char *p1,*p2,buf[1<<20+5];inline int read(){int x=0,f=1;char c=gc();while(!isdigit(c)){if(c=='-')f=-1;c=gc();}while(isdigit(c)){x=x*10+(c^48);c=gc();}return x*f;}
const int N = 2e5 + 1;
int n, m;
int x;
int f[N][45];
int dp[N], last[4 * N];
inline void init()
{
for (int i = 1; i <= n; i ++ ) f[i][0] = (i - dp[i] + 1);
for (int j = 1; (1 << j) <= int(log2(n)); j ++ )
for (int i = 1; i + (1 << (j - 1)) <= n; i ++ )
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
inline int ask(int L, int R)
{
if (L > R) return 0;
int k = log2(R - L + 1);
return max(f[L][k], f[R - (1 << k) + 1][k]);
}
inline void solve()
{
int x, y;
x = read() + 1, y = read() + 1;
int l = x, r = y, mid;
int res;
while (l <= r)
{
mid = (l + r) >> 1;
if (dp[mid] >= x) r = mid - 1;
else res = mid, l = mid + 1;
}
int cnt = max(res - x + 1, ask(res + 1, y));
printf("%d\n", cnt);
}
int main()
{
n = read(), m = read();
for (int i = 1; i <= n; i ++ )
{
x = read();
x += 1e6;//可能为负数
dp[i] = max(dp[i - 1], last[x] + 1);
last[x] = i;
}
init();
while (m -- ) solve();
return 0;
}
回复
共 15 条回复,欢迎继续交流。
正在加载回复...