本人思路:对于每一次挑战找自己前面第一个药水使用。
复杂度 O(nlogn),结果 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;
}