TLE求助……
  • 板块P1638 逛画展
  • 楼主liufukang
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/1/3 14:38
  • 上次更新2023/11/5 05:12:12
查看原帖
TLE求助……
139509
liufukang楼主2021/1/3 14:38
#include<bits/stdc++.h>
using namespace std;
const int maxN=1e6+10;
struct Node{
	int l,r,mon;//左端,右端和花费
}a[maxN];
queue<int>q;
int d[maxN];//记录参观每个画师的张数
int n,m,ans,k,tot;//绘画数,画师数,参观过的画师人数,可移动右边界,答案个数
bool cmp(Node,Node);//比较函数
int main(){
	cin>>n>>m;
	for (int i=1;i<=n;i++){
		int x;
		cin>>x;
		q.push(x);
	}//读入与入队
	for (int i=1;i<=n;){
		if (i>2){
			d[q.front()]--;
			if (!d[q.front()]) ans--;
			q.pop();
		}
		while (ans<m){//不满足要求
			if (!d[q.front()]) ans++;//如果队首所对画师的画未参观,ans++
			d[q.front()]++;//该画师所参观画张数++
			k++;//右边界移动
		}
		a[++tot]={i,k,k-i+1};//记录答案
		while (d[q.front()]>1){//如果队首所对画家参观过的画大于1幅
			d[q.front()]--;//参观画数--
			i++;//左边界移动
			q.pop();//出队
		}
	}
	sort(a+1,a+tot+1,cmp);//排序
	for (int i=1;i<=tot;i++) cout<<a[i].l<<' '<<a[i].r<<endl;//输出
	return 0;
}
inline bool cmp(Node a,Node b){
	if (a.mon!=b.mon) return a.mon<b.mon;
	return a.l<b.l;
}//比较函数,先比较花费,再比较左边界
/*
12 5
2 5 3 1 3 2 4 1 1 5 4 3
*/

求助大佬……

2021/1/3 14:38
加载中...