题解:AT_abc389_c [ABC389C] Snake Queue
题目传送门
题目简述
有一个放蛇的队列,起初是空的。
现在有
- 类型
1 :输入格式1 l,将一条长度为l 的是加入队列尾,它的头部坐标为前一条蛇的尾坐标,如果加入前队列里没有蛇,则头坐标为0 。设的尾坐标等于头坐标加长度。 - 类型
2 :输入格式2,删除队列最前面的蛇,后面的蛇的头坐标会因此改变。 - 类型
3 :输入格式3 k,输出第k 条蛇的头坐标,保证出现此操作蛇的数量\ge k 。
主要思路
首先,如果操作
所以说我们可以不删除第一条蛇,而是定义一个
最最后:十年 OI 一场空,___。
AC Code
#include<map>
#include<set>
#include<list>
#include<stack>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_set>
using namespace std;
#define OUT 0
#define endl '\n'
#define MAMBA return
typedef long long ll;
const int N = 3e5 + 10;
const int INF = 0x3f3f3f3f;
typedef unsigned long long ull;
int _pow(int a,int b){int x=1,y=a;while(b>0){if(b&1)x*=y;y*=y;b>>=1;}return x;}
void print(ll x){if(x<0){putchar('-');x=-x;}if(x>9){print(x/10);}putchar(char(x%10+'0'));}
void print(int x){if(x<0){putchar('-');x=-x;}if(x>9){print(x/10);}putchar(char(x%10+'0'));}
void print(string s){int n=s.length();for(int i=0;i<n;i++)putchar(s[i]);}
inline int read_int(){int f=1,x=0;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline ll read_ll(){int f=1;ll x=0;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
// ----------------------------
// ----------------------------
ll len[N];
ll head_idx[N];
// ----------------------------
int man() {
int q = read_int();
// ------------------------
int op,k;
ll sum = 0;
int pop_cnt = 0;
int snake_cnt = 0;
while (q--) {
op = read_int();
if (op == 1) {
len[++snake_cnt] = read_int();
head_idx[snake_cnt] = head_idx[snake_cnt-1] + len[snake_cnt-1];
}
else if (op == 2) sum += len[++pop_cnt];
else {
k = read_int();
print(head_idx[k+pop_cnt]-sum);
putchar('\n');
}
}
MAMBA OUT;
}
int main() {MAMBA man();}