C小白训练第六天,有哪些技巧和经验可以分享?

摘要:C++小白训练第六天 以下为牛客挑战 今日收获 了解了map<int,int>m;,map可以去重共,因为键值对key是唯一的, for (auto it =
C++小白训练第六天 以下为牛客挑战 今日收获 了解了map<int,int>m;,map可以去重共,因为键值对key是唯一的, for (auto it = m.begin(); it != m.end(); ++it) { int key = it->first; // 键 int& val = it->second; // 值 } for (auto& [k, v] : m) { /* k 是键,v 是值 */ } 所以一般使用时候都是先转换为vector<pair<int,int>>m; for(auto &z: m){ v.emplace_back(z); } 小红出千 G-小红出千_牛客周赛 Round 123 5 1 2 3 4 6 1 5 5 这个顺子一定是长度为n的,所以当我门固定一个左端,那右端就可以确定了,我们可以用双指针去维护 我们去维护一个区间,我们发现在区间中,只要我们的数够多就可以,我们就可以更少的从区间外去变换到区间里面,所以我就去遍历一下找到合适的区间, 最后找到一个区间满足且有较多的数,再把这些里面的数进行标记一下,标记为使用 一个是数有没有用,一个是位置 for(int i=l;i<=r;i++){ vis[v[i].second]=1;//位置 used.emplace(v[i].first);//用过了 } 解题代码 #include<bits/stdc++.h> #define int long long #define lll __uint128_t #define PII pair<int ,int> #define endl '\n' using namespace std; #define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印 #define YN(ans) printf("%s\n", (ans)?"YES":"NO"); #define REP(i, e) for (int i = 0; i < (e); ++i) #define REP1(i, s, e) for (int i = (s); i <=(e); ++i) #define TESTS int t; cin >> t; while (t--) #define TEST const int N=2e5+10,M=1e3+10,mod=1e9+7; int a[N],b[N],c[N],pre[N]; signed main(){ std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin>>n; map<int,int>m; vector<int>s(n+1); for(int i=1;i<=n;i++){ cin>>s[i]; m[s[i]]=i; } vector<pair<int,int>>v; for(auto &z: m){ v.emplace_back(z); } // for(int i=0;i<v.size();i++){ // cout<<v[i].first<<" "<<v[i].second<<endl; // } int l=-1,r=-1; int mx=0; for(int i=0,j=0;i<v.size();i++){ while(j<i&&v[i].first-v[j].first>=n){ j++; } if(i-j+1>mx){ mx=i-j+1; l=j; r=i; } } set<int>used; vector<int>vis(n+1); for(int i=l;i<=r;i++){ v
阅读全文