Bear and Different Names

手速题

#include<bits/stdc++.h>
using namespace std;
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma
#define
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int a[10000],b[10000];
void pri(int p) {
printf("%c%c",p/26+'A',p%26+'a');
}
int main()
{
// freopen("A.in","r",stdin);
// freopen(".out","w",stdout);

int n=read(),k=read();
For(i,n-k+1) {
string s;
cin>>s;
b[i]=s[0]=='Y';
}

int cnt=k-1;
For(i,k-1) a[i]=i,pri(i),putchar(' ');
For(i,n-k+1)
{
if (b[i]) {
a[i+k-1]=++cnt;pri(cnt);
} else {
a[i+k-1]=a[i]; pri(a[i]);
}
if (i<n-k+1) putchar(' ');
}cout<<endl;
return 0;
}

Bear and Tree Jumps

求树中每条路径长度div k 后的和

∑s,tf(s,t)/k=∑s,t(f(s,t)+[(k−f(s,t)modk)modk])/k
我们统计f(s,t)modk=c

#include<bits/stdc++.h>
using namespace std;
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
#define
int sz[MAXN]={},n,k;
vi edges[MAXN];
ll f[MAXN][5][5]={};
ll ans=0,cnt=0;
void dfs(int x,int fa) {
int s=SI(edges[x]);
sz[x]++;f[x][0]++;
Rep(i,s) {
int v=edges[x][i];
if (v^fa) {
dfs(v,x);

ans+=(ll)sz[x]*(n-sz[x]);
Rep(j,k) Rep(l,k) if ((j+l)%k ) {
ans+=f[x][j]*f[v][l]*(k-(j+l+1)%k);
}
Rep(j,k) {
f[x][j]+=f[v][(j+k-1)%k];
}
sz[x]+=sz[v];
}
}
}
void dfs2(int x,int fa) {
int s=SI(edges[x]);
Rep(i,s) {
int v=edges[x][i];
if (v^fa) {
dfs2(v,x);
ll p=n-sz[v];
ll q=f[v][0];
// ans+=p*q;
}
}
}
int main()
{
freopen("B.in","r",stdin);
// freopen(".out","w",stdout);
cin>>n>>k;
For(i,n-1) {
int p=read(),q=read();
edges[p].pb(q);
edges[q].pb(p);
}
dfs(1,0);
dfs2(1,0);
For(i,n) cout<<f[i][0]<<' ';cout<<endl;
cout<<ans<<endl;
return 0;
}

Bear and Company

给一个字符串,至少交换相邻2位字符几次使字符串中没有’VK’

和BC那题很像,但是代价不是距离差/2

反例:

ABC->CBA

距离差/2=2,最小交换次数=3

所以我们可以考虑逆序对数,

每种元素之间没有差别,意味着同种元素之间没有交换

我们假设前若干个字符中V,K,X各种了i,j,k个,后面加一个K

显然你要挪的是逆序对数量,即前pre_pos[k]前有几个不在还没取过

Codeforces Round #405 (rated, Div. 1, based on VK Cup 2017 Round 1) 题解(待续)_i++

#include<bits/stdc++.h>
using namespace std;
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma
#define
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
#define
char s[MAXN];
int cnt[3],c[1000][MAXN];
int f[MAXN][MAXN][MAXN][2];
int Abs(int x) {
return max(x,-x);
}
int gmin(int &x,int a){
x=min(x,a);
}
int g[MAXN][4];
int main()
{
// freopen("C.in","r",stdin);
// freopen(".out","w",stdout);

int n=read();
cin>>(s+1);
For(i,n) {
if (s[i]=='V') c[0][++cnt[0]]=i;
else if (s[i]=='K') c[1][++cnt[1]]=i;
else c[2][++cnt[2]]=i;
Rep(j,3)
g[i][j]=cnt[j];
}
MEMI(f)
f[0][0][0][1]=0;
Rep(i,n)
Rep(j,1+min(cnt[0],i))
Rep(k,1+min(cnt[1],i-j) )
Rep(l,2)
if (f[i][j][k][l]!=INF) {
if (j<cnt[0]) { //put v
int pos=c[0][j+1],c=pos-1;
c-=min(j,g[pos-1][0]);
c-=min(k,g[pos-1][1]);
c-=min(i-j-k,g[pos-1][2]);
gmin(f[i+1][j+1][k][0],f[i][j][k][l]+c);
}
if (k<cnt[1]&&l) { //put k
int pos=c[1][k+1],c=pos-1;
c-=min(j,g[pos-1][0]);
c-=min(k,g[pos-1][1]);
c-=min(i-j-k,g[pos-1][2]);
gmin(f[i+1][j][k+1][1],f[i][j][k][l]+c);
}
if (i-j-k<cnt[2]) { //put l
int pos=c[2][i-j-k+1],c=pos-1;
c-=min(j,g[pos-1][0]);
c-=min(k,g[pos-1][1]);
c-=min(i-j-k,g[pos-1][2]);
gmin(f[i+1][j][k][1],f[i][j][k][l]+c);
}
// cout<<i<<" "<<j<<" "<<k<<' '<<l<<' '<<f[i][j][k][l]<<endl;
}

cout<<min(f[n][cnt[0]][cnt[1]][0],f[n][cnt[0]][cnt[1]][1])<<endl;


return 0;
}