过了四题,排名下降了不少,继续学
A R
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define db double
#define int long long
#define ve vector<int>
#define vr vector<char>
#define pb push_back
typedef long long ll;
const int N = 2e5 + 10;
int n, k;
char s[N];
ll ans;
void gou(string s){
int i = 0, j = 0;
int temp = 0;
//此时字符串t里面都是R,所以temp会一直增加,直到temp=k,
//之后就会进入while循环,但每次while只会循环一次,因为进入temp就会改变,就不满徐继续循环的条件
//满足temp==k之后就会从目前遍历的大区间(暂称为区间D)头部开始去除字符,得到区间a,去除一个即j++,就代表这一段区间可以产生的子串数量+1
//之后继续向后遍历,即使没有新的R增加,但是新加入的字符和之前a区间的字符串也可以构成j数量的字符子串
//因为之前j个字符串加上新加入的字符,还可以得到j个合法的字符子串
//继续遍历找到R,等到达到temp=k,还可以尝试沿大区间去除a区间的头部字符,继续上述操作
for(i = 0; i < s.size(); ++ i){
temp += s[i] == 'R';//temp记录小区间a内有几个R
while(j <= i && temp == k){
temp -= s[j ++ ] == 'R';
}
ans += j;
}
}
signed main(){
cin>>n>>k;
cin>>s + 1;
string t = "";
for(int i = 1; i <= n; ++ i){
if(s[i] == 'P'){
gou(t);
t = "";
}
else t += s[i];
}
gou(t);
cout<<ans<<endl;
return 0;
}
K 小红的真真假假签到题题
这题挺亏的,思维还需要继续练,比赛的时候思维要足够发散才可以
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
#define pb push_back
#define rip(i, a, b) for(int i = a; i <= b; ++ i)
#define rop(i, a, b) for(int i = a; i < b; ++ i)
const int N = 1010, M = 1e9 + 10;
signed main()
{
int n;
cin>>n;
int i;
for(i = 1; i <= 32; ++ i){
if(1 << i > n){
break;
}
}
cout<<(1ll<<i) * n + n<<endl;
return 0;
}