本文没有正经题解 只有:
r
n
m
rnm
rnm 退钱
G-KFC Crazy Thursday
P A M PAM PAM 模板题,属于改改就能过
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e6 + 5;
struct Node {
Node *ch[26], *fail;
int len, sum;
} tr[MAXN];
int n;
char s[MAXN];
int ncnt = 2;
Node* last;
Node* New(int len) {
tr[ncnt].len = len;
tr[ncnt].fail = &tr[0];
for (int i = 0; i < 26; i++)
tr[ncnt].ch[i] = &tr[0];
return &tr[ncnt++];
}
Node* GetFail(Node* x, int pos) {
while (s[pos - x->len - 1] != s[pos])
x = x->fail;
return x;
}
void Init() {
tr[0].len = 0;
tr[1].len = -1;
tr[0].fail = &tr[1];
tr[1].fail = &tr[0];
for (int i = 0; i < 26; i++)
tr[0].ch[i] = tr[1].ch[i] = &tr[0];
last = &tr[0];
}
void Insert(int pos) {
Node* cur = GetFail(last, pos);
if (cur->ch[s[pos] - 'a'] == &tr[0]) {
Node* now = New(cur->len + 2);
now->fail = GetFail(cur->fail, pos)->ch[s[pos] - 'a'];
now->sum = now->fail->sum + 1;
cur->ch[s[pos] - 'a'] = now;
}
last = cur->ch[s[pos] - 'a'];
}
signed main() {
cin >> n;
cin >> s + 1;
int k = 0;
Init();
int a = 0, b = 0, c = 0;
for (int i = 1; i <= n; i++) {
Insert(i);
if (s[i] == 'k') {
a += last->sum;
}
else if (s[i] == 'f') {
b += last->sum;
}
else if (s[i] == 'c') {
c += last->sum;
}
k = last->sum;
}
cout << a << " " << b << " " << c << endl;
return 0;
}
B-Watches
二分操作次数,排序后贪心即可。
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int N=2e5+7;
typedef long long ll;
#define endl '\n'
#define int long long
#define PA pair<int,int>
int a[N],tmp[N];
int n,m;
bool check(int mid){
int sum=0;
for(int i=1;i<=n;i++)tmp[i]=a[i]+i*mid;
sort(tmp+1,tmp+1+n);
for(int i=1;i<=mid;i++){
sum+=tmp[i];
}
return m>=sum;
}
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
int l=0,r=n+1,mid;
while(l<r){
mid=(l+r)/2;
if(check(mid)){
l=mid+1;
}else r=mid;
}
cout<<l-1<<endl;
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t=1;
//cin>>t;
while(t--)solve();
}
K-Headphones
经典题面比代码难理解。
#include<bits/stdc++.h>
#define maxn 200005
#define int long long
using namespace std;
int a[maxn],b[maxn];
char s[maxn];
int n,m;
int dp[maxn],sum1[maxn],sum2[maxn];
void solve(){
scanf("%d%d",&n,&m);
if(m>(n-1)/2){
puts("-1");
return ;
}
int rest=n-m;
printf("%d\n",rest+m+1);
}
signed main(){
int t=1;
//cin>>t;
while(t--)solve();
return 0;
}
F-A Stack of CDs
冲进去扒一篇题解,把输入顺序 r , x , y r,x,y r,x,y 更改为 x , y , r x,y,r x,y,r ,再改个精度就过了
H-Cutting Papers
万能群友公式:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
int main() {
int n;
cin >> n;
printf("%.12lf\n", (double)n * n * 3.0 / 4 + n * PI / 4 - n / 2.0);
return 0;
}