RT。站外题。
struct Park{
int x,y,z,pos;
bool operator < (const Park &a)const{
return (z==a.z) ? (x<a.x) : (z>a.z);
}
}tmp;
set<Park>s1;
// printf("x:%d y:%d z:%d pos:%d\n",tmp.x,tmp.y,tmp.z,tmp.pos);
s1.insert(tmp);
// puts("Inserted");
在上面的这段代码中,前面的输出都正常, 但是在一个 insert 操作之后没有输出 Inserted ,RE了。
感觉很奇怪 QwQ 求大佬解惑 orz
附上完整代码和RE的样例:
#include<bits/stdc++.h>
//#define int ll
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define piii pair<int,pair<int,int> >
#define fir first
#define sec second
#define IT1 set<Park>::iterator
#define IT2 set<int>::iterator
typedef long long ll;
using namespace std;
const int N=1000005;
const int inf=(1<<30)-1;
const ll inff=(1ll<<60)-1;
const int mod=998244353;
inline int read(){
int 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*10+c-'0',c=getchar();
return x*f;
}
int n,m,ys[N];
struct Park{
int x,y,z,pos;
bool operator < (const Park &a)const{
return (z==a.z) ? (x<a.x) : (z>a.z);
}
}tmp;
set<Park>s1;
set<int>s2;
int main(){
// freopen("D.in","r",stdin);
n=read(),m=read();
tmp.x=1,tmp.y=n,tmp.z=n-1,tmp.pos=1;
s1.insert(tmp);
while(m--){
int opt=read(),v=read();
if(opt==1){
IT1 it = s1.begin();
int x = it->x , y = it->y , pos = it->pos;
// printf("x:%d y:%d pos:%d z:%d\n",x,y,pos,it->z);
s2.insert(pos);
ys[v] = pos;
printf("%d\n",pos);
s1.erase(it);
if(x<pos){
tmp.x = x , tmp.y = pos-1 , tmp.z = (tmp.x==1 ? tmp.y-1 : (tmp.y==n ? n-tmp.x : (tmp.y-tmp.x>>1)) );
tmp.pos = (tmp.x==1 ? 1 : (tmp.y==n ? n : (tmp.x+tmp.y>>1) ) );
s1.insert(tmp);
}
if(pos<y){
tmp.x = pos+1 , tmp.y = y , tmp.z = (tmp.x==1 ? tmp.y-1 : (tmp.y==n ? n-tmp.x : (tmp.y-tmp.x>>1)) );
tmp.pos = (tmp.x==1 ? 1 : (tmp.y==n ? n : (tmp.x+tmp.y>>1) ) );
s1.insert(tmp);
}
}
else{
int le,ri;
v = ys[v];
IT2 it = s2.lower_bound(v);
if(it != s2.begin()){
it--;
le = (*it)+1;
tmp.x = le , tmp.y = v-1 , tmp.z = (tmp.x==1 ? tmp.y-1 : (tmp.y==n ? n-tmp.x : (tmp.y-tmp.x>>1)) );
tmp.pos = (tmp.x==1 ? 1 : (tmp.y==n ? n : (tmp.x+tmp.y>>1) ) );
s1.erase(s1.lower_bound(tmp));
it++;
}
else le = v;
it++;
if(it != s2.end()){
ri = (*it)-1;
tmp.x = v+1 , tmp.y = ri , tmp.z = (tmp.x==1 ? tmp.y-1 : (tmp.y==n ? n-tmp.x : (tmp.y-tmp.x>>1)) );
tmp.pos = (tmp.x==1 ? 1 : (tmp.y==n ? n : (tmp.x+tmp.y>>1) ) );
s1.erase(s1.lower_bound(tmp));
}
else ri = v;
tmp.x = le , tmp.y = ri , tmp.z = (tmp.x==1 ? tmp.y-1 : (tmp.y==n ? n-tmp.x : (tmp.y-tmp.x>>1)) );
tmp.pos = (tmp.x==1 ? 1 : (tmp.y==n ? n : (tmp.x+tmp.y>>1) ) );
// printf("x:%d y:%d z:%d pos:%d\n",tmp.x,tmp.y,tmp.z,tmp.pos);
s1.insert(tmp);
// puts("Inserted");
}
}
return 0;
}
Input:
7 11
1 15
1 123123
1 3
1 5
2 123123
2 15
1 21
2 3
1 6
1 7
1 8
Output:
1
7
4
2
7
4
1
3