贪心策略,找最左边的B和最右边的,计算长度
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>pii;
#define N 300100
int a[N],b[N];
void solve(){
int n;
cin>>n;
string s;
cin>>s;
int l=0x3f3f3f3f,r=0;
for(int i=0;i<n;i++){
if(s[i]=='B') l=min(l,i),r=max(r,i);
}
cout<<r-l+1<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--){
solve();
}
}
在二十六个字母中选,如果出现次数等于数组值,则输出直接暴力枚举即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>pii;
#define N 300000
int a[N],b[N];
void solve(){
int n;
cin>>n;
string s;
int cnt=0;
vector<int>m(30,0);
for(int i=0;i<n;i++){
cin>>a[i];
}
int r=0;
for(int i=0;i<n;i++){
if(a[i]==0) {
cout<<(char)('a'+r);
m[r]++;
r++;
}
else{
for(int j=0;j<26;j++ ){
if(m[j]==a[i]){
cout<<(char)('a'+j);
m[j]++;
break;
}
}
}
}
cout<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--){
solve();
}
}
求是能构成序列,用两个hash表记录如果两个中没出现,输出no,然后求出两个数组中独有的
记录,如果都小于等于k/2,则可以,否则不行
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>pii;
#define N 300100
int a[N],b[N];
void solve(){
int n,m,k;
cin>>n>>m>>k;
map<int,int>ma,mb;
for(int i=0;i<n;i++) cin>>a[i],ma[a[i]]++;
for(int i=0;i<m;i++) cin>>b[i],mb[b[i]]++;
bool flag=false;
for(int i=1;i<=k;i++) {
if(ma[i]==0&&mb[i]==0) {
flag=true;
break;
}
}
if(flag) cout<<"NO"<<endl;
else{
int cnt1=0,cnt2=0,res=0;
for(int i=1;i<=k;i++){
if(ma[i]&&!mb[i]) cnt1++;
else if(!ma[i]&&mb[i]) cnt2++;
else res++;
}
if(cnt1<=k/2&&cnt2<=k/2) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--){
solve();
}
}
询问不同元素数量,可以考虑,用一个数组去记录这个元素左边不同的元素是哪一个,如果相等就一直右移,大概是滑窗类似的思想,时间复杂度o(n),预处理完,
输入l,r如果b[r]<l不在区间内,输出-1,否则输出b[r]r
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>pii;
#define N 300000
int a[N],b[N];
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++){
int j=i;
while(j+1<=n&&a[j+1]==a[i]) j++;
for(int k=i;k<=j;k++) b[k]=i-1;
i=j;
}
int q;
cin>>q;
while(q--){
int x,y;
cin>>x>>y;
if(b[y]<x) cout<<-1<<" "<<-1<<endl;
else cout<<b[y]<<" "<<y<<endl;
}
cout<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--){
solve();
}
}
构造题,仔细观察最后一个样例
7 4
1 4 5 7
2 3 6
发现分为k组,每次奇数组正向加,偶数逆向加即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>pii;
#define N 300100
int a[N],b[N];
void solve(){
int n,k;
cin>>n>>k;
int cur=0;
for(int i=1;i<=k;i++){
if(i%2){
for(int j=i;j<=n;j+=k) a[j]=++cur;
}
else{
for(int j=n-(n-i)%k;j>=1;j-=k) a[j]=++cur;
}
}
for(int i=1;i<=n;i++) cout<<a[i]<<' ';
cout<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--){
solve();
}
}