呃呃 原地进步也算进步是吧
我wa了半天代码,然后翻了题解
#include <iostream>
#include <vector>
#include <assert.h>
#include <algorithm>
#define int long long
using namespace std;
const int N = 1e5 + 12;
typedef pair<int, int> pii;
int n;
int arr[N];
int idx = 0;
struct node
{
int fr, sc;
int len;
bool operator < (const node &p) const
{
if (len != p.len) return len > p.len;
return fr < p.fr;
}
}p[N], tmp;
vector<node> vec;
inline int read()
{
int res=0, bol=1;
char ch = getchar();
while (!isdigit(ch))
{
if (ch == '-') bol *= -1;
ch = getchar();
}
while (isdigit(ch))
{
res = res*10 + ch-'0';
ch = getchar();
}
return res*bol;
}
signed main()
{
int T = read();
while (T -- )
{
n = read();
for (int i=1;i <= n;i ++ ) cin >> arr[i];
idx = 0;
vec.clear();
// int pi = 1, pj = 1;
// while (pj <= n)
// {
// // 不下降的 可以走
// while (pj+1 <= n && arr[pj] <= arr[pj+1]) pj ++;
//
// if (pi^pj) p[idx ++ ] = {pi, pj, arr[pj]-arr[pi]};
//
// pj ++ , pi = pj;
// }
/*--------------------------*/
int l = 1;
for(int i=2;i<=n;i++)
{
if(arr[i]<arr[i-1])
{
tmp = {l, i-1, arr[i-1]-arr[l]};
vec.push_back(tmp);
l = i;
}
}
tmp = {l, n, arr[n]-arr[l]};
// vec.push_back(tmp);
sort(vec.begin(), vec.end());
for(int i=0;i<vec.size();i++)
{
if(vec[i].len == vec[0].len)
cout << vec[i].fr << " "<< vec[i].sc <<" ";
}
cout<<'\n';
/*--------------------------*/
// sort(p, p+idx);
//
// int len = p[0].len;
// for (int i=0;i < idx && p[i].len == len;i ++ )
// printf("%lld %lld ", p[i].fr, p[i].sc);
// printf("\n");
}
return 0;
} 调的时候我发现 assert(vec.size() == idx); // 必定报错
// 没有报错
for (int i=0;i < idx && p[i].len == len;i ++ )
{
node now = vec[i];
if (now.fr != p[i].fr || now.sc != p[i].sc || now.len != p[i].len) assert(false);
printf("%lld %lld ", p[i].fr, p[i].sc);
} 这时候我就发现, 好家伙, 还有我没找到的区间吗 于是我注意到这段代码
tmp = {l, n, arr[n]-arr[l]}; // 题解里的
vec.push_back(tmp);
// 对应我的code
if (pi^pj) p[idx ++ ] = {pi, pj, arr[pj]-arr[pi]}; 然后我把if 删掉 于是就有了

腾讯云智研发成长空间 5055人发布