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;
}