比赛链接
目录
1.A
2.B
3.C
4.D
5.E
因为只让刷一次,所以找出最左边的B,最右边的B即可
#include
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while (t--)
{
/* code */
int n;
cin>>n;
string s;
cin>>s;
int l=0,r=-1;
for(int i=0;i=0;i--)
{
if(s[i]=='B')
{
r=i;
break;
}
}
cout<
我的想法是每个位置至少要放一个字母,所以对每个位置枚举26个字母,哪个字母合适,放下合适数量的之歌字母就行
#include
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while (t--)
{
int n;
cin>>n;
vectorv(n);
int h[26]={0};
for(int i=0;i>v[i];
for(int i=0;i
这题要a,b各精确地选k/2个数字,凑齐1-k.刚上手这题,觉得很简单,但后来发现,看是否能凑齐1-k非常简单,但要精确的各出k/2个就要加点限制条件,首先有个大前提,a和b中1到k的数字必须能凑齐,不管a和b各出多少个,反正要先凑齐,可以把a和b中在1-k的数字放入set s中,a,b中1-k的数字放入各自的set,s1和s2,中,一共3个set.然后既然能凑齐,还要a,b都要至少有k/2种1-k的数字,可以这么想,a,b都正好有k/2中且满足大前提,能凑够,刚好符合题意,若大于k/2种,还有的多.
#include
using namespace std;
#define int long long
const int maxn=1e6+5;
bool fi[maxn];
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
memset(fi,0,sizeof(fi));
int n,m,k;
cin>>n>>m>>k;
sets1,s2,s;
for(int i=0;i>t;
if(t>=1&&t<=k)
{
s1.insert(t);
s.insert(t);
}
}
for(int i=0;i>t;
if(t>=1&&t<=k)
{
s2.insert(t);
s.insert(t);
}
}
if(s.size()>=k&&s1.size()>=k/2&&s2.size()>=k/2)
cout<<"YES"<<"\n";
else
cout<<"NO"<<"\n";
}
return 0;
}
这题是个查找,先预处理数组中i-1位置的元素与i位置元素不同的i,再将i-1放入一个数组diff中,然后在给定的l,r区间二分查找diff数组中的元素,找不到,就是不存在,找得到,就输出这个元素和这个元素加1,否则输出-1 -1.
#include
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
vectorv(n+5);
vectordiff;
for(int i=1;i<=n;i++)
{
cin>>v[i];
if(i>1&&v[i]!=v[i-1])
{
diff.push_back(i-1);
}
}
sort(diff.begin(),diff.end());
int q;
cin>>q;
while(q--)
{
int l,r;
cin>>l>>r;
auto it1=upper_bound(diff.begin(),diff.end(),l-1);
//cout<<"it1=="<
这题是个构造,难以讲清楚,规律就是枚举k段对应的元素,要么奇数位递增,偶数位递减,要么相反
#include
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
int l=1,r=n;
vectorvec(n+5);
for(int i=1;i<=k;i++)
{
for(int j=i;j<=n;j+=k)
{
vec[j]=(i&1)?r:l;
if(i&1)r--;
else l++;
}
}
for(int i=1;i<=n;i++)cout<