时间:2s 空间:256M
题目描述:
学校楼下在做核酸,为了证明有的同学今天做过核酸了,小信给做核酸的人都发了一张号码牌。小信会对同学们进行以下两种操作:
-
1 x y
:让y个人加入排核酸的长队,并给他们每个人都发写着x的号码牌 。 -
2 y
:从长队前面放行y个人去做核酸,并计算这y个人手里拿的号码牌的和。
请你帮助小信进行t次操作。
输入格式:
第一行包含一个整数 t。
随后t行每行按格式包含一次操作 。
输出格式:
对于每次2操作,输出一个整数表示答案。
约定:
对于100%的数据,
题目是一道数据结构操作题。看y的10e9知朴素算法会超时。所以队列中入队一个结构体(其实可以是pari<int,int>)。用计算来减少时间复杂度。
#include<bits/stdc++.h>
using namespace std;
struct node{
long long x;
long long y;
}a[250000];
int head=1,tail;
long long sum=0;
int t;
int main(){
scanf("%d",&t);
while(t--){
int k;
scanf("%d",&k);
if(k==1){
tail++;
scanf("%lld%lld",&a[tail].x,&a[tail].y);
}else{
long long y;
scanf("%lld",&y);
while(y){
if(a[head].y<=y){
sum+=a[head].x*a[head].y;
y-=a[head].y;
head++;
}else{
sum+=a[head].x*y;
a[head].y-=y;
y=0;
}
}
printf("%lld\n",sum);
sum=0;
}
}
}