T4复杂度求教
  • 板块题目总版
  • 楼主WsW_花逝爆零人
  • 当前回复15
  • 已保存回复15
  • 发布时间2023/8/27 21:52
  • 上次更新2023/11/3 00:49:07
查看原帖
T4复杂度求教
349824
WsW_花逝爆零人楼主2023/8/27 21:52

瓶颈似乎在操作2和3
这能过就离谱,不会算时间复杂度

#include<bits/stdc++.h>

using namespace std;


struct node{
	int x,len;
	bool operator< (const node &A)const{
		return x<A.x;
	}
}block[200005];
int lb;

int head,tail;

struct qus{
	int opt,x;
}ask[200005];
int c,q;

priority_queue<node> que;

int main(){
//	freopen("queue5.in","r",stdin);
//	freopen("queue5.out","w",stdout);
	scanf("%d%d",&c,&q);
	for(int i=1;i<=q;i++){
		scanf("%d",&ask[i].opt);
		if(ask[i].opt<4)scanf("%d",&ask[i].x);
		if(ask[i].opt==1){
			++lb;
			block[lb].x=ask[i].x;
			block[lb].len=ask[i].x;
		}
	}
	
	for(int i=1;i<=q;i++){
		if(ask[i].opt==1){
			tail++;
			que.push({block[tail].x,tail});
		}
		if(ask[i].opt==2){
			while(ask[i].x>=block[head].len){
				ask[i].x-=block[head++].len;
			}
			block[head].len-=ask[i].x;
		}
		if(ask[i].opt==3){
			int head2=head;
			while(ask[i].x>block[head2].len){
				ask[i].x-=block[head2++].len;
			}
			printf("%d\n",block[head2].x-block[head2].len+ask[i].x);
		}
		if(ask[i].opt==4){
			while(que.top().len<head)que.pop();
			printf("%d\n",que.top().x);
		}
	}
	
	return 0;
}
2023/8/27 21:52
加载中...