先上个提交记录 https://www.luogu.com.cn/record/117241197
后面会tle可能是方法的问题,但是为什么中间会有个WA呢,萌新想不明白
具体算法本萌新大致模拟了一下队列的思路,但还是tle了后面几个吸氧了也没用
求大佬帮优化!
#include<bits/stdc++.h>
using namespace std;
long long a[4000000];
long long sum;
long long m,n,k;
long top,tail;
int read()//要判负!
{
char c=getchar();
int s=0,w=1;
while(c<'0'||c>'9')
{
if(c='-')
w=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
s=s*10+c-'0';
c=getchar();
}
return s*w;
}
void op1(int x)
{
while(a[tail]+x>k)//看看队尾的哪些元素要出队
{
sum--;//到了出队要求就减一个
tail--;//指针往回挪一个
}
for(int i=top;i<=tail;i++)//只要操作尚且没有出队的元素就行了
a[i]+=x;
}
void op2(int x)
{
while(a[top]-x<-k)
{
sum--;
top++;
}
for(int i=top;i<=tail;i++)
a[i]-=x;
}
int main()
{
n=read();m=read();k=read();
sum=n;tail=n,top=1;//sum表示数的当前数量,tail表示尾指针 ,top表示头指针
for(int i=1;i<=n;i++)
a[i]=read();
sort(a+1,a+n+1);//排序一下
for(int i=1;i<=m;i++)
{
int c,x;
c=read();//输入的逻辑有问题
if(c==3)
{
printf("%d\n",sum);
continue;
}
x=read();
if(c==1)
{
op1(x);
}
if(c==2)
{
op2(x);
}
}
return 0;
}