简单黄题set做法求调

学术版

### AC Code: ```cpp #include<cstdio> #include<set> using namespace std; int T, opt, len; set<int> se; signed main() { scanf("%d", &T); while (T--){ scanf("%d%d", &opt, &len); if (opt==1){ if (se.count(len)) puts("Already Exist"); else se.insert(len); } else { if (se.empty()) puts("Empty"); else if (se.count(len)){ printf("%d\n", len); se.erase(len); } else { auto it1 = se.lower_bound(len); if(it1==se.begin()){ printf("%d\n",*it1); se.erase(it1); }else if(it1==se.end()){ printf("%d\n",*(--it1)); se.erase(it1); }else{ auto it2 = it1; it2--; if((*it1)-len<len-(*it2)){ printf("%d\n",*it1); se.erase(it1); }else{ printf("%d\n",*it2); se.erase(it2); } } } } } return 0; } ```
by TCIC_4294967296 @ 2024-04-20 14:57:46


@[TCIC_4294967296](/user/1155762) 原理解释: 1. 如果最接近的大于len的木材是现有的里的最小的,就直接删掉最小的 1. 如果找不到最接近的大于等于len的木材,就删掉现有的中的最大的 1. 果同时存在比len大和小的木材,删除长度差小的,如果长度差相同优先删除短的
by TCIC_4294967296 @ 2024-04-20 15:03:20


谢谢啦
by qyz123123 @ 2024-04-20 15:04:01


@[TCIC_4294967296](/user/1155762) 请问我的代码错在哪里呢?谢谢
by qyz123123 @ 2024-04-20 15:07:31


@[qyz123123](/user/658726) 在 ```int len1=(*(--it)), len2=(*it);``` 中,有两处错误: 1. 如果it是se.begin(),使用```--```会RE。 1. 即使没有RE,在给len1赋值时的```--it```操作会使it本身向左移一个位置,而赋值len2时的it依旧是在赋值len1时被改变过的it,所以len1和len2代表的是同一个位置,会WA。
by TCIC_4294967296 @ 2024-04-20 16:21:22


|