1. 程式人生 > 實用技巧 >2020.11.28模擬賽

2020.11.28模擬賽

2020.11.28

T1 prime

\(\mathcal{先考慮n+1為質數的時候}\)

\[\mathcal{原式=}\sum_{i=2}^n\frac{1}{v(i)u(i)}\\ =\sum_{i=1}^{|prime|-1}\frac{prime[i+1]-prime[i]}{prime[i]prime[i+1]}\\ =\sum_{i=1}^{|prime|-1}\frac{1}{prime[i]}-\frac{1}{prime[i+1]}\\ =\frac{1}{2}-\frac{1}{prime[|prime|]} \]

\(\mathcal{不為質數時減去多餘即可。}\\ \mathcal{至於尋找大於n和小於n的素數,暴力找加miller測試驗證就行了。}\\ \mathcal{根據素數分佈定理可知時間複雜度為O(Tln\ nlog_2n)}\)

\(\mathfrak{Emmm,賽上打掛了}\)

#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define fre(k) freopen(k".in","r",stdin);freopen(k".out","w",stdout)
# define read read1<ll>()
# define Type template<typename T>
Type T read1(){
	T t=0;
	char k;
	bool vis=0;
	do (k=getchar())=='-'&&(vis=1);while('0'>k||k>'9');
	while('0'<=k&&k<='9')t=(t<<3)+(t<<1)+(k^'0'),k=getchar();
	return vis?-t:t;
}
int qkpow(int n,int m,int mod){
	if(!m)return 1;
	ll t=qkpow(n,m>>1,mod);
	t=t*t%mod;
	if(m&1)t=t*n%mod;
	return t;
}
bool judge(int v){return v==2||v==3||v==5||v==7||qkpow(2,v-1,v)==1&&qkpow(3,v-1,v)==1&&qkpow(5,v-1,v)==1&&qkpow(7,v-1,v)==1;}
ll gcd(ll x,ll y){return !y?x:gcd(y,x%y);}
int main(){
	for(int T=read;T--;){
		int x=read,w=x,l=x;
		if(x==2){puts("1/6");continue;}
		while(!judge(++w));
		if(!judge(l)){while(!judge(l-1))--l;--l;}
		ll o=w-x-1,lx=1ll*l*w-2*l-2*o,rx=2ll*w*l,v=gcd(lx,rx);
		lx/=v;rx/=v;
		printf("%lld/%lld\n",lx,rx);
	}
	return 0;
} 

T2 go

\(\mathcal{硬dp即可}\)

\(\mathfrak{Emmm...}\)

#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define fre(k) freopen(k".in","r",stdin);freopen(k".out","w",stdout)
# define read read1<ll>()
# define Type template<typename T>
Type T read1(){
	T t=0;
	char k;
	bool vis=0;
	do (k=getchar())=='-'&&(vis=1);while('0'>k||k>'9');
	while('0'<=k&&k<='9')t=(t<<3)+(t<<1)+(k^'0'),k=getchar();
	return vis?-t:t;
}
struct A{
	int a,b,t;
	bool operator <(const A &x)const{return a<x.a;}
}a[105];
int n,K,s,w,dp[2105][105][105][2];
int dis(int x,int y){return fabs(a[x].a-a[y].a);}
int main(){
	n=read,K=read,s=read;
	for(int i=1;i<=s;++i)
		a[i].a=read,a[i].b=read,a[i].t=read;
	++s;a[s].a=K,a[s].b=0,a[s].t=1;
	sort(a+1,a+s+1);
	for(int i=1;i<=s;++i)
		if(a[i].a==K)w=i;
	memset(dp,-0x7f,sizeof(dp));
	dp[1][w][w][0]=dp[1][w][w][1]=0;
	int ans=0;
	for(int k=1;k<=2000;++k)
		for(int len=1;len<=s;++len)
			for(int i=1,j;(j=i+len-1)<=s;++i){
				if(i!=1){
					if(k+dis(i-1,i)<=2000){
						int &xv=dp[k+dis(i-1,i)][i-1][j][0];
						xv=max(xv,dp[k][i][j][0]+(dis(i,i-1)+k<=a[i-1].t?a[i-1].b:0));
					}
					if(k+dis(i-1,j)<=2000){
						int &yv=dp[k+dis(i-1,j)][i-1][j][0];
						yv=max(yv,dp[k][i][j][1]+(dis(j,i-1)+k<=a[i-1].t?a[i-1].b:0));
					}
				}
				if(j!=s){
					if(k+dis(j,j+1)<=2000){
						int &xv=dp[k+dis(j,j+1)][i][j+1][1];
						xv=max(xv,dp[k][i][j][1]+(dis(j,j+1)+k<=a[j+1].t?a[j+1].b:0));
					}
					if(k+dis(i,j+1)<=2000){
						int &yv=dp[k+dis(i,j+1)][i][j+1][1];
						yv=max(yv,dp[k][i][j][0]+(dis(i,j+1)+k<=a[j+1].t?a[j+1].b:0));
					}
				}
			}
	for(int k=0;k<=2100;++k)
		for(int len=1;len<=s;++len)
			for(int i=1,j;(j=i+len-1)<=s;++i)
				ans=max(ans,max(dp[k][i][j][0],dp[k][i][j][1]));
	printf("%d",ans);
	return 0;
}

T3 shuru

\(\mathcal{是我題讀錯了?中位數}\)

#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define fre(k) freopen(k".in","r",stdin);freopen(k".out","w",stdout)
# define read read1<ll>()
# define Type template<typename T>
Type T read1(){
	T t=0;
	char k;
	bool vis=0;
	do (k=getchar())=='-'&&(vis=1);while('0'>k||k>'9');
	while('0'<=k&&k<='9')t=(t<<3)+(t<<1)+(k^'0'),k=getchar();
	return vis?-t:t;
}
int x[100005],y[100005],s;
ll ans;
int main(){
	read;s=read;read;
	for(int i=1;i<=s;++i)
		x[i]=read,y[i]=read,ans+=read;
	sort(x+1,x+s+1);
	sort(y+1,y+s+1);
	int mx=x[s+1>>1],my=y[s+1>>1];
	for(int i=1;i<=s;++i)
		ans+=fabs(x[i]-mx)+fabs(y[i]-my);
	printf("%lld\n%d %d",ans,mx,my);
	return 0;
}

T4 watch

\(\mathcal{害,打了個O(nlog_2n)\rightarrow O(nlog^2_2n)的}\)

#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define fre(k) freopen(k".in","r",stdin);freopen(k".out","w",stdout)
# define read read1<ll>()
# define Type template<typename T>
Type T read1(){
	T t=0;
	char k;
	bool vis=0;
	do (k=getchar())=='-'&&(vis=1);while('0'>k||k>'9');
	while('0'<=k&&k<='9')t=(t<<3)+(t<<1)+(k^'0'),k=getchar();
	return vis?-t:t;
}
int s,q,top[800005],si[800005],son[800005],v[800005],la[800005],qu[800005],fa[800005],h[800005];
vector<int>W[3200005],G[800005];
void dfs1(int n){
	si[n]=1;h[n]=h[fa[n]]+1;
	for(int i=0;i<G[n].size();++i){
		fa[G[n][i]]=n;
		dfs1(G[n][i]);
		si[n]+=si[G[n][i]];
		if(si[G[n][i]]>si[son[n]])son[n]=G[n][i];
	}
}
void dfs2(int n,int w){
	top[n]=w;
	if(son[n])dfs2(son[n],w);
	for(int i=0;i<G[n].size();++i)
		if(G[n][i]!=son[n])
			dfs2(G[n][i],G[n][i]);
}
void ins(int tl,int tr,int l,int r,int x,int d){
	if(l==tl&&r==tr)W[d].push_back(x);
	else{
		int mid=tl+tr>>1;
		if(r<=mid)ins(tl,mid,l,r,x,d<<1);
		else if(mid<l)ins(mid+1,tr,l,r,x,d<<1|1);
		else ins(tl,mid,l,mid,x,d<<1),ins(mid+1,tr,mid+1,r,x,d<<1|1);
	}
}
stack<int>sta,sta1;
void add(int x){
	if(!x)return;
	int la=v[top[x]];
	if(h[la]<h[x]){
		sta.push(top[x]);
		sta1.push(la);
		v[top[x]]=x;
	}
	if(!la)add(fa[top[x]]);
}
int query(int x){
	if(!x)return 0;
	if(v[top[x]])return h[v[top[x]]]>h[x]?x:v[top[x]];
	return query(fa[top[x]]);
}
void print(int l,int r,int d){
	int wz=sta.size(),mid=l+r>>1;
	for(int i=0;i<W[d].size();++i)
		add(W[d][i]);
	if(l==r)
		if(qu[l])printf("%d\n",query(qu[l]));
		else;
	else{
		print(l,mid,d<<1);
		print(mid+1,r,d<<1|1);
	}
	while(sta.size()>wz)v[sta.top()]=sta1.top(),sta.pop(),sta1.pop();
}
int main(){
	s=read;q=read;
	for(int i=2;i<=s;++i)
		G[read].push_back(i);
	dfs1(1);dfs2(1,1);
	for(int i=1;i<=q;++i){
		int x=read;
		if(x>0)
			if(!la[x])la[x]=i;
			else{
				ins(1,q,la[x],i,x,1);
				la[x]=0;
			}
		else qu[i]=-x;
	}
	for(int i=1;i<=s;++i)
		if(la[i])ins(1,q,la[i],q,i,1);
	print(1,q,1);
	return 0;
}