acwing(第 2 场热身赛)
模拟双端队列
输入样例1:
8
L 1
R 2
R 3
? 2
L 4
? 1
L 5
? 1
输出样例1:
1
1
2
输入样例2:
10
L 100
R 100000
R 123
L 101
? 123
L 10
R 115
? 100
R 110
? 115
输出样例2:
0 2
1
这个题乍一看像是一个数据结构题,想了一会没有想出来解法。
然而仔细看一下这个题他的数字不是重复的,所以说你可以用map来标记
数字出现的位置然后记录一个l,r。就是左边界和右边界。
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int maxn=1e6+10; int mp[maxn]; int main(){ int t; cin>>t; int l=0,r=-1; while(t--){ char a; int b; cin>>a>>b; if(a=='R'){ ++r; mp[b]=r; } else if(a=='L'){ l--; mp[b]=l; } else{ int ans=0; ans=min(r-mp[b],mp[b]-l); cout<<ans<<endl; } } }
AcWing 3549. 最长非递减子序列
输入样例1:
4
1 2 1 2
输出样例1:
4
输入样例2:
10
1 1 2 2 2 1 1 2 2 1
输出样例2:
9
这个题就是对于答案你可以分成一种情况的,就是可以分成三段,就是第一段是全是1,中间是先2后1,后面是就是全是2
这个题解很好可以看看
传送门