C. Books Queries
题意
有一个书架,最开始没有书,每次往书架的左端或右端加书,每次查询给一个书的id,问最少拿下来多少书这个书可以出现在最左或者最右端。保证每次添加的书id不同,而且每个查询不改变书架上的书,只是查询。
做法
用一个前缀和记录,加某个书之前往左端加过多少书,往右端加过多少书,,这样每次查询得时候,只要如果查询得那本书是以左端添加的,那么它出现在左端需要拿走添加时往左端加书的数量和当前往左端添加书的数量之差,它出现在右端需要拿走的就是添加时往左端加书的数量加上一共向右端添加书的数量。右端同理。
代码
#include<stdio.h>
#include<iostream>
using namespace std;
const int maxn = 2e5+5;
int sum[maxn][2];
char op[maxn][2];
int pos[maxn];
int main()
{
int d,q;scanf("%d",&q);for(int i=1;i<=q;i++){
scanf("%s%d",op[i],&d);sum[i][0]=sum[i-1][0];sum[i][1]=sum[i-1][1];if(op[i][0]=='L') sum[i][0]++;else if(op[i][0]=='R') sum[i][1]++;if(op[i][0]!='?') pos[d]=i;else{
int id=pos[d];if(op[id][0]=='L'){
int l=sum[i][0]-sum[id][0];int r=sum[i][0]+sum[i][1]-(sum[i][0]-sum[id][0]+1);printf("%d\n",min(l,r));}else{
int l=sum[i][0]+sum[i][1]-(sum[i][1]-sum[id][1]+1);int r=sum[i][1]-sum[id][1];printf("%d\n",min(l,r));}}}return 0;
}