How E
  • 板块学术版
  • 楼主Genius_Star
  • 当前回复22
  • 已保存回复23
  • 发布时间2023/12/16 21:40
  • 上次更新2023/12/17 01:00:35
查看原帖
How E
979266
Genius_Star楼主2023/12/16 21:40

本人思路:对于每一次挑战找自己前面第一个药水使用。

复杂度 O(nlog⁡n)O(n \log n),结果 TLE 2,求调。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const ll N=1001000;
inline ll read(){
    ll x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')
          f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}
inline void write(ll x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)
	  write(x/10);
	putchar(x%10+'0');
}
ll n,sum=0,ans=0;
ll a[N],b[N];
bool f[N];
vector<ll> E[N];
int main(){
//	freopen("A.in","r",stdin);
//	freopen("A.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		b[i]=read();
		if(a[i]==1)
		  E[b[i]].push_back(i);
	}
	for(int i=1;i<=n;i++){
		if(a[i]==2){
			if(E[b[i]].empty()){
				puts("-1");
				exit(0);				
			}
			auto t=lower_bound(E[b[i]].begin(),E[b[i]].end(),i);
			if(t==E[b[i]].begin()){
				puts("-1");
				exit(0);
			}
			t--;
			f[*t]=1;
			E[b[i]].erase(t);
		}
	}
	for(int i=1;i<=n;i++){
		if(a[i]==1)
		  sum+=f[i];
		else
		  sum--;
		ans=max(sum,ans);
	}
	write(ans);
	putchar('\n');
	for(int i=1;i<=n;i++){
		if(a[i]==1){
			write(f[i]);
			putchar(' ');
		}
	}
	return 0;
}
2023/12/16 21:40
加载中...