CSP 后多校九
A. 破门而入
签到题.
A_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS{
#define int long long
#define lf long double
#define pb push_back
#define mp make_pair
#define lb lower_bound
#define ub upper_bound
#define lbt(x) ((x)&(-(x)))
#define Fill(x,y) memset(x,y,sizeof(x))
#define Copy(x,y) memcpy(x,y,sizeof(x))
#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
auto read=[](int w=0,bool cit=0,char ch=getchar())->int{
for(;!isdigit(ch);ch=getchar()) cit=(ch=='-');
for(;isdigit(ch);ch=getchar()) w=(w<<3)+(w<<1)+(ch^48);
return cit?(-w):w;
};
} using namespace BSS;
const int mod=998244353,N=3e3+21;
int m,n;
int dp[N][N];
signed main(){
File(broken);
n=read(),m=read(),dp[0][0]=1;
for(int j=1;j<=m;j++){
dp[0][j]=1;
for(int i=1;i<=n;i++){
dp[i][j]=(dp[i-1][j-1]+(i-1)*dp[i-1][j]%mod)%mod;
}
}
printf("%lld\n",dp[n][m]);
exit(0);
}
B. 翻转游戏
签到题.
B_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS{
#define int long long
#define lf long double
#define pb push_back
#define mp make_pair
#define lb lower_bound
#define ub upper_bound
#define lbt(x) ((x)&(-(x)))
#define Fill(x,y) memset(x,y,sizeof(x))
#define Copy(x,y) memcpy(x,y,sizeof(x))
#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
auto read=[](int w=0,bool cit=0,char ch=getchar())->int{
for(;!isdigit(ch);ch=getchar()) cit=(ch=='-');
for(;isdigit(ch);ch=getchar()) w=(w<<3)+(w<<1)+(ch^48);
return cit?(-w):w;
};
} using namespace BSS;
const int N=3e6+21;
char ch[N];
int m,n,ans;
int pre[30];
signed main(){
File(turn);
scanf("%s",ch+1),n=strlen(ch+1),ans=1; int x,y,z;
for(int i=1;i<=n;i++){
x=ch[i]-'a'+1,pre[x]++,ans+=i-pre[x];
}
printf("%lld\n",ans),exit(0);
}
C. 奶油蛋糕塔
很自然的一个想法就是把每个点拆开之后类比像磁铁一样吸引,然后跑最长欧拉路.
但是复杂度最差可能达到 \(O(n^2logn)\),考虑如何优化.
发现其实缩成四个点就可以了,于是再考虑删减边使得图变成欧拉路即可.
C_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS{
#define int long long
#define lf long double
#define pb push_back
#define mp make_pair
#define lb lower_bound
#define ub upper_bound
#define lbt(x) ((x)&(-(x)))
#define Fill(x,y) memset(x,y,sizeof(x))
#define Copy(x,y) memcpy(x,y,sizeof(x))
#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
auto read=[](int w=0,bool cit=0,char ch=getchar())->int{
for(;!isdigit(ch);ch=getchar()) cit=(ch=='-');
for(;isdigit(ch);ch=getchar()) w=(w<<3)+(w<<1)+(ch^48);
return cit?(-w):w;
};
} using namespace BSS;
const int N=5e5+21;
int m,n,ts,cnt,ans,minn;
int d[N],fa[N],head[N],ret[N],val[N];
struct I { int u,v,w,nxt; } e[N<<1];
auto add=[](int u,int v,int w)->void{
e[++ts].u=u,e[ts].v=v,e[ts].w=w;
e[ts].nxt=head[u],head[u]=ts;
};
void dfs(int u,int dad){
fa[u]=dad;
for(int i=head[u];i;i=e[i].nxt)
if(!fa[e[i].v]) dfs(e[i].v,dad);
}
signed main(){
File(cake);
cin>>n; int u,v,w; char ch[10];
for(int i=1;i<=n;i++){
cin>>w;
scanf("%s",ch+1),u=ch[1]-'V';
scanf("%s",ch+1),v=ch[1]-'V';
add(u,v,w),add(v,u,w); if(u==v) val[u]+=w;
if(u^v) d[u]++,d[v]++;
}
for(int i=1;i<=4;i++){
if(!fa[i]) dfs(i,++cnt);
}
w=0; for(int i=1;i<=4;i++) w+=(d[i]&1);
if(w==4 and cnt==1){
int mn=1e15;
for(int i=1;i<=ts;i+=2){
ans+=e[i].w;
if(e[i].u^e[i].v){
if((d[e[i].u]^1) and (d[e[i].v]^1)) mn=min(mn,e[i].w);
else mn=min(mn,e[i].w+val[u]*(d[e[i].u]==1)+val[v]*(d[e[i].v]==1));
}
}
printf("%lld\n",ans-mn),exit(0);
}
for(int i=1;i<=ts;i+=2) ret[fa[e[i].u]]+=e[i].w;
for(int i=1;i<=cnt;i++) ans=max(ans,ret[i]);
cout<<ans<<endl,exit(0);
}
D. 多重影分身之术
签到题.
D_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS{
#define int long long
#define lf long double
#define pb push_back
#define mp make_pair
#define lb lower_bound
#define ub upper_bound
#define lbt(x) ((x)&(-(x)))
#define Fill(x,y) memset(x,y,sizeof(x))
#define Copy(x,y) memcpy(x,y,sizeof(x))
#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
auto read=[](int w=0,bool cit=0,char ch=getchar())->int{
for(;!isdigit(ch);ch=getchar()) cit=(ch=='-');
for(;isdigit(ch);ch=getchar()) w=(w<<3)+(w<<1)+(ch^48);
return cit?(-w):w;
};
} using namespace BSS;
const int N=3e5+21;
int m,n;
int px[N],py[N];
auto check=[](int t)->bool{
int p1,p2,x,y,z,now;
for(p1=1,p2=1;p1<=n;p1++){
if(px[p1]-t>py[p2]) return 0;
if(px[p1]<py[p2]){
y=px[p1]+t;
while(py[p2]<=y and p2<=m) p2++;
if(p2>m) return 1;
}
else{
x=t-2*(px[p1]-py[p2]),y=(t-(px[p1]-py[p2]))>>1;
z=px[p1]+max(x,y);
while(py[p2]<=z and p2<=m) p2++;
if(p2>m) return 1;
}
}
return p2>m;
};
signed main(){
File(duplication);
n=read(),m=read();
for(int i=1;i<=n;i++) px[i]=read(); sort(px+1,px+1+n);
for(int i=1;i<=m;i++) py[i]=read(); sort(py+1,py+1+m);
int l=0,r=3e9,mid,res;
while(l<=r){
mid=(l+r)>>1;
if(check(mid)) res=mid,r=mid-1;
else l=mid+1;
}
printf("%lld\n",res),exit(0);
}