Loading

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);
}
posted @ 2021-11-07 06:56  AaMuXiiiiii  阅读(36)  评论(0编辑  收藏  举报