0%

2025“钉耙编程”中国大学生算法设计暑期联赛(1)——1009子序列(最长的两端比中间长子序列)

思路讲解

核心代码就这

1
2
3
4
5
6
7
8
9
10
11
12
	ll l=pos[0],r=pos[1];
if(l>r) swap(l,r);
ll ans=r-l+1;
ll cnt=1;
FOR(i,2,SZ(pos)-1){ // 一个点,要么在这个区间内,要么在这个区间外
ll p=pos[i]; // 在这个区间内,必定不更新这个这个区间
l=min(l,p),r=max(r,p); // 在这个区间外,必定更新这个区间
ans=max(ans,r-l+1-cnt); // 所以说一个数更新区间的话,前面的数一定都在这个区间内
++cnt;
}
cout<<ans<<"\n";
}

我们再来看看树状数组怎么做。

AC代码

https://acm.hdu.edu.cn/contest/view-code?cid=1172&rid=16219

心路历程(WA,TLE,MLE……)