Codeforces Round #649 (Div. 2)
Codeforces Round#649(Div.2)
A. XXXXX
题意
求不被x整除的最长连续子串的长度
题解
前缀和暴力
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; typedef long long ll; vector<int >v[10010]; int solve(int k) { int now=1; if(v[k].size()==v[k][v[k].size()-1])return -1; for (int i=0;i<v[k].size();i++) { if(v[k][i]!=now) return v[k][v[k].size()-1]-now; now++; } } int main() { int t,i,n,x,a[maxn],qz[maxn]; cin >> t; while(t--) { cin >> n >> x; qz[0]=0; for(i=0;i<=10000;i++) v[i].clear(); int res=-1; for(i=1;i<=n;i++) { scanf("%d",&a[i]),qz[i]=qz[i-1]+a[i],v[qz[i]%x].push_back(i); if(qz[i]%x!=0) res=i; } for(i=0;i<x;i++) { if(v[i].size()>0) { int k=solve(i); if(k!=-1) res=max(res,k); } } cout << res << endl; } return 0; }
B. Most socially-distanced subsequence
题意
给你一个序列p,要求找出它相邻元素绝对值之和最大前提下元素个数最少的子序列
题解
记录极大值点与极小值点即可
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; typedef long long ll; int main() { int i,t,j,n,a[maxn]; vector<int >v; cin >> t; while(t--) { v.clear(); scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); v.push_back(a[1]); for(i=2;i<n;i++) if(a[i]>a[i-1] && a[i]>a[i+1] || a[i]<a[i-1] && a[i]<a[i+1]) v.push_back(a[i]); v.push_back(a[n]); printf("%d\n",v.size()); for(i=0;i<v.size();i++) printf("%d ",v[i]); printf("\n"); } return 0; }
C. Ehab and Prefix MEXs
题意
给出一个数组 a ,要求构造一个数组 b ,使得 a[ i ] = MEX{ b[ 1 ] , b[ 2 ] , ... b[ i - 1 ] , b[ i ] },a[ i ] 满足小于等于 i
题解
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; typedef long long ll; int vis[maxn]; int main() { int i,n,a[maxn],b[maxn]; memset(vis,0,sizeof(vis)); memset(b,-1,sizeof(b)); scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]),vis[a[i]]=1; a[0]=-1; for(i=1;i<=n;i++) if(a[i]!=a[i-1]) b[i]=a[i-1]; int cnt=0; for(i=1;i<=n;i++) { if(b[i]!=-1) continue; while(vis[cnt]) cnt++; b[i]=cnt++; } for(i=1;i<=n;i++) printf("%d ",b[i]); return 0; }