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
