[考试反思]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 }
View Code

 

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 }
View Code

 

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 }
View Code

 

T4:普通平衡树

没调出来。爆零了。

 

posted @ 2019-11-12 11:48  DeepinC  阅读(493)  评论(12编辑  收藏  举报