[考试反思]1112csp-s模拟测试111:二重
还是AK场。考前信心赛?
而且T3的部分分还放反了所有80的都其实只有50。
总算在AK场真正AK了一次。。。
手感好,整场考试很顺利。要不是因为T3是原题可能就没这么好看了。
20minT1,50minT2,去趟厕所回来70min想到T3,110min写完调完对拍完,然后去学skyh写平衡树了。
然后我发现我不会写平衡树了。
两场一计分:600/600/585/580/535/515/515/500///
Day1考得不够好,Day2就还是反超不了啊。。。
没关系这两个600的过两天直接联赛进营进队拿最优惠不是竞争对手挺过联赛我就是rank1了
T1:物理课
迭代都能A那就没得说了。。。等比数列求和还是会的
1 #include<cstdio> 2 #include<cmath> 3 using namespace std; 4 long double theta,d,v,g; 5 int main(){ 6 freopen("physics.in","r",stdin);freopen("physics.out","w",stdout); 7 int t;scanf("%d",&t); 8 while(t--){ 9 scanf("%Lf%Lf%Lf%Lf",&theta,&v,&d,&g);theta/=180;theta*=3.141592653589793238; 10 printf("%.5Lf\n",2*sin(theta)*v*cos(theta)*v/g/(1-d*d)); 11 } 12 }
T2:数学课
可以打表(超可怜的说)。但是从含义出发比较简单。
确定一个奇数的状态,那么它的任意偶数倍就都确定了,交替出现在AB集合中。
然后区别就是你把多的和少的分别放在A里还是B里。
如果多的和少的一样那么就不必考虑。设有pair0个,怎么放都一样所以方案数是$2^{pair0}$
接下来是多的比少的多一个。设有pair1个。
首先我们要知道这些选择的最小值是多少,设为Base。(在求出pair1和pair0的顺便弄一下就行,log的)
那么多的比少的的贡献就是:因为要从pair1个里选出m-Base个,所以就是$C_{pair1}^{m-Base}$
一个Lucas一个快速幂
1 #include<cstdio> 2 #define int long long 3 #define mod 10000019 4 int fac[10000020],inv[10000020]; 5 int C(int b,int t){return 0<=t&&t<=b?fac[b]*inv[t]%mod*inv[b-t]%mod:0;} 6 int Lucas(int b,int t){return b<mod&&t<mod?C(b,t):Lucas(b/mod,t/mod)*C(b%mod,t%mod)%mod;} 7 int qpow(int b,int t,int a=1){for(;t;b=b*b%mod,t>>=1)if(t&1)a=a*b%mod;return a;} 8 main(){ 9 freopen("math.in","r",stdin);freopen("math.out","w",stdout); 10 fac[0]=1; 11 for(int i=1;i<mod;++i)fac[i]=fac[i-1]*i%mod; 12 inv[mod-1]=qpow(fac[mod-1],mod-2); 13 for(int i=mod-2;~i;--i)inv[i]=inv[i+1]*(i+1)%mod; 14 int n,q,m,lst=0,p2=1ll<<60,pair1=0,pair0=0,Base=0; 15 scanf("%lld%lld",&n,&q); 16 for(int i=61;i;--i,p2>>=1){ 17 int num=n/p2,cnt;num=(num>>1)+(num&1);cnt=num-lst;lst=num;Base+=cnt*(i>>1); 18 if(i&1)pair1+=cnt;else pair0+=cnt; 19 } 20 while(q--)scanf("%lld",&m),printf("%lld\n",Lucas(pair1,m-Base)*qpow(2,pair0)%mod); 21 }
T3:地理课
第一反应:LCT。不会。
后来一想,改变一下题意就是原题了。
可以离线,所以只要把加边和删边的含义改变为“每条边只在一段时间内出现,其它时间消失”
然后就可以当作《Dash Speed》做了。线段树分治+按秩合并并查集板子。(给自己之前的博客打广告2333)
1 #include<cstdio> 2 #include<vector> 3 #include<map> 4 using namespace std; 5 #define mod 1000000007 6 vector<pair<int,int> >v[400005]; 7 map<pair<int,int>,int>M; 8 int opt[100005],a[100005],b[100005],edt[100005],n,m,ans=1,inv[100005],sz[100005]; 9 int stf[200005],stp[200005],strk[200005],rans[200005],top,f[100005],rk[100005],stsz[200005]; 10 pair<int,int>Pair(int a,int b){return a>b?make_pair(b,a):make_pair(a,b);} 11 int find(int p){return f[p]==p?p:find(f[p]);} 12 void merge(pair<int,int>P){ 13 int a=find(P.first),b=find(P.second); 14 if(a==b)return; 15 stp[++top]=a;stf[top]=f[a];stsz[top]=sz[a];strk[top]=rk[a];rans[top]=ans; 16 stp[++top]=b;stf[top]=f[b];stsz[top]=sz[b];strk[top]=rk[b];rans[top]=ans; 17 ans=1ll*ans*inv[sz[a]]%mod*inv[sz[b]]%mod*(sz[a]+sz[b])%mod; 18 if(rk[a]<rk[b])f[a]=b,sz[b]+=sz[a],rk[b]+=rk[a]==rk[b]; 19 else f[b]=a,sz[a]+=sz[b],rk[a]+=rk[a]==rk[b]; 20 } 21 void add(pair<int,int>P,int p,int l,int r,int cl=1,int cr=m){ 22 if(l<=cl&&cr<=r){v[p].push_back(P);return;} 23 if(l<=cl+cr>>1)add(P,p<<1,l,r,cl,cl+cr>>1); 24 if(r>cl+cr>>1)add(P,p<<1|1,l,r,(cl+cr>>1)+1,cr); 25 } 26 void Divide_and_Conquer(int p,int l,int r){ 27 int tp=top; 28 for(int i=0;i<v[p].size();++i)merge(v[p][i]); 29 if(l==r)printf("%d\n",ans); 30 else Divide_and_Conquer(p<<1,l,l+r>>1),Divide_and_Conquer(p<<1|1,(l+r>>1)+1,r); 31 while(top>tp){ 32 int x=stp[top]; 33 sz[x]=stsz[top];rk[x]=strk[top];f[x]=stf[top];ans=rans[top];top--; 34 } 35 } 36 int main(){freopen("geography.in","r",stdin);freopen("geography.out","w",stdout); 37 scanf("%d%d",&n,&m); 38 for(int i=1;i<=m;++i)scanf("%d%d%d",&opt[i],&a[i],&b[i]); 39 inv[1]=1; 40 for(int i=2;i<=n;++i)inv[i]=mod-1ll*mod/i*inv[mod%i]%mod; 41 for(int i=1;i<=n;++i)f[i]=i,rk[i]=sz[i]=1; 42 for(int i=m;i;--i)if(opt[i]==2)M[Pair(a[i],b[i])]=i; 43 else edt[i]=M[Pair(a[i],b[i])]; 44 for(int i=1;i<=m;++i)if(opt[i]==1)add(Pair(a[i],b[i]),1,i,edt[i]?edt[i]-1:m); 45 Divide_and_Conquer(1,1,m); 46 }
T4:普通平衡树
没调出来。爆零了。
$Fate \ is \ Fake$