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
这个题解很好可以看看
传送门

 


 





posted @ 2021-05-25 23:48  lipu123  阅读(53)  评论(0)    收藏  举报