一:
- cnt = 0 入口,判断写在for循环出来的出口(单一出口,判断的条件是里面所有的内容)
- 里面的判断条件 有一个break出来 即不符合条件 在判断的时候应该从这里加个bool变量才对
- cnt >= 本身就是一个判断条件 不需要在有一个vis
二、
?用j控制br 用i控制ar 1.出循环的条件是br所有的元素都找到了对应的ar ,j < m
2.内部的while保证i < n
3.出for循环的条件:成功:j=m每个br都找到了对应的ar? 失败:ar已经走到头了 或者br找不到对应的ar 不满足条件
4.找到之后 j++ 找下一个,别忘了i++ (这个ar用完了)?
三、
for (int i = 0; i < n; i++) {
mp[a[i]]++;//map能直接++
}
if(mp[a[i]] == 1) {
mp.erase(a[i]);
} else {
mp[a[i]]--;
}
?当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。
while (!s.empty()){
ll t=*s.begin();
s.erase(s.find(t));
ll k=t*x;
if (s.find(k)!=s.end()) s.erase(s.find(k));else ans++;
}
?四、
?si
?逻辑逻辑逻辑 清晰最重要 简单、清晰 分块 知道每一块干什么
五、
for (int i = 0; i < 10; i++) {
a.emplace(-1);
}
for (int i =0; i < 10; i++) {
a.emplace(inf);
}
----------------------------------------------------------------------------------------
if (multiset(a.begin(),a.end()) != multiset(b.begin(), b.end())) {
cout << "No\n";
return 0;
}
if (set(a.begin(), a.end()).size() != a.size()) {
cout <<"Yes\n";
return 0;
}
六、?dijikstra
struct edge
{
int v, c, d;
};
vector<edge> G[N]; //两个点直接可能有多条边
auto [w, u] = qu.top();
//双向边别忘了~!!!!!
G[u].push_back({v, c, d});
G[v].push_back({u, c, d});
?
七、离散化操作 用数组吧! 别用vec
int k=0;
for(int i=1;i<=n;i++){
scanf("d%d",&left[i],&right[i]);
v[k++]=left[i];
v[k++]=right[i];
}
sort(v,v+k);
int n=unique(v,v+k)-v;//表示新数组大小,如果用vector不可以-v这样写
for(int i-1;i<=n;i++){
int L=lower_bound(v,v+n,left[i])-v+1;//如果指针在v[0]的位置,-v后得0,加1表示左端点是1
int R=lower_bound(v,v+n,right[i])-v+1;
}
|