RT,前天的比赛的 div2E,也就是 CF1584E,蓝能理解官方题解的全部内容,但是蓝看到有部分 AC 的人使用了一种用 map 实现的简洁做法,例如这样:
#include<iostream>
#include<map>
using namespace std;
#define R register int
#define L long long
inline void Solve(){
int n,tm=1,x;
cin>>n;
map<L,int>S;
L td=0,ans=0;
for(R i=0;i!=n;i++){
cin>>x;
if(tm==1){
while(S.empty()==false&&S.rbegin()->first+td>x){
S.erase(S.rbegin()->first);
}
}else{
while(S.empty()==false&&-S.begin()->first+td>x){
S.erase(S.begin()->first);
}
}
tm=-tm;
td=x-td;
S[(x-td)*tm]++;
ans+=S[-td*tm];
}
cout<<ans<<endl;
}
int main(){
int t;
cin>>t;
for(R i=0;i!=t;i++){
Solve();
}
return 0;
}
蓝不太能理解这种做法采用了什么思路(感觉利用了某些妙妙的单调性?),有没有好心人帮一下蓝/kel