[考試反思]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:普通平衡樹

沒調出來。爆零了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM