

一句話:我看錯考試時間了,我以為11:30結束,T2T3暴力沒來得及交。
為什么考試的時間忽然變了啊。。。沒轉過來
一定要看清考試的起止時間!
雖說T2T3連爆搜都沒打,只打特殊性質只有32分。爆搜分還挺高的。
當特殊性質不好擴展時,記得把爆搜打上。
本來是想T1先送上暴力,然后嘗試肝T2,然后是T3暴力,有時間再回來優化T1。
但是整場考試時間是崩的,也沒回T1。。。然而T2T3
注意分數與時間的權衡。
T1:Reverse
BFS。
二營長打法極其簡單。因為是BFS所以一個點不會被多次更新。
那么一次更新了一個區間內的全部奇數或偶數,下次遇到的時候直接跳過就行了。
用鏈表實現,代碼特別特別特別簡單。常數也特別小,復雜度O(n),相較於線段樹優化建邊還少個log。
1 #include<iostream> 2 using namespace std; 3 int dt[100005],q[100005],R[100005],n,m,k,S,x; 4 int main(){ 5 cin>>n>>k>>m>>S; 6 for(int i=1;i<=n;++i)dt[i]=n+1,R[i]=i+2; 7 while(m--)cin>>x,dt[x]=-1; 8 dt[S]=0;q[1]=S; 9 for(int h=1,t=1;h<=t;++h){ 10 int st=max(1,q[h]-k+1),l=st+st+k-1-q[h];st=min(n-k+1,q[h]);int r=st+st+k-1-q[h]; 11 for(int i=l;i<=r;i=R[i])if(dt[i]>dt[q[h]]+1)dt[i]=dt[q[h]]+1,q[++t]=i; 12 for(int i=l;i<=r;){int rr=R[i];R[i]=max(R[i],r);i=rr;} 13 } 14 for(int i=1;i<=n;++i)cout<<(dt[i]>n?-1:dt[i])<<" ";cout<<endl; 15 }
T2:Silhouette
神仙數學題,考場上死在容斥上了。
無解的判定就是橫縱最大值不同。
不然的話我們把讀入序列排序,對答案沒有影響。
從大到小擴展,掃每一種權值。
然后這種權值占據的是一個矩形或一個L形,並且要求這個區域內每行每列都恰好出現了這個值。
容斥,f[i]表示一共a行中至少i行不滿足條件。
ABab表示的是一個A×B的矩形挖掉一個(A-a)×(B-b)的小矩形之后得到的L形,當前處理的數字是S。
$f[i]=\sum\limits_{i=0}^{a}C_a^i \times (S^i \times ( (S+1)^{A-i} - S^{A-i} ) )^b \times ( S^i \times (S+1)^{a-i} )^{B-b}$
這一類“至少”的容斥也沒少做,容斥系數是$(-1)^i$
式子的含義是先選出是哪i行不合條件,$C_a^i$
接下來在A×b的矩陣里選合法的方案,
考慮每一列,其中這不合法的i行不出現數字S,所以是[0,S-1]里面選,$S^i$
然后剩下的行里面需要出現數字S,那就是瞎選的方案減去沒出現S的方案,即$( (S+1)^{A-i} - S^{A-i} )$
每一列都是這樣,所以要b次方
接下來需要計算那一個a×(B-b)的矩形,被限制不合法的i行還是不能放$S^i$,剩下的隨便$(S+1)^{a-i}$
然后每一列都這樣,要B-b次方
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 #define mod 1000000007 6 #define int long long 7 int pw(int b,int t,int a=1){for(;t;t>>=1,b=b*b%mod)if(t&1)a=a*b%mod;return a;} 8 bool com(int a,int b){return a>b;} 9 int fac[100005],x[100005],n,y[100005],ans=1,invv[100005],inv[100005]; 10 int C(int b,int t){return fac[b]*inv[t]%mod*inv[b-t]%mod;} 11 int cal(int A,int B,int a,int b,int s){ 12 int tot=0; 13 for(int i=0;i<=a;++i)tot=(tot+pw(mod-1,i)*C(a,i)%mod*pw(s,B*i)%mod*pw(pw(s+1,A-i)-pw(s,A-i)+mod,b)%mod*pw(pw(s+1,a-i),B-b))%mod; 14 return tot%mod+mod; 15 } 16 main(){ 17 fac[0]=inv[0]=inv[1]=fac[1]=invv[1]=1; 18 for(int i=2;i<=100000;++i)fac[i]=fac[i-1]*i%mod,invv[i]=mod-mod/i*invv[mod%i]%mod,inv[i]=inv[i-1]*invv[i]%mod; 19 scanf("%lld",&n); 20 for(int i=1;i<=n;++i)scanf("%lld",&x[i]); 21 for(int i=1;i<=n;++i)scanf("%lld",&y[i]); 22 sort(x+1,x+1+n,com);sort(y+1,y+1+n,com); 23 int p1=1,p2=1; 24 while(p1<=n||p2<=n){ 25 int num=max(x[p1],y[p2]),cnt1=0,cnt2=0; 26 while(p1<=n&&x[p1]==num)p1++,cnt1++; 27 while(p2<=n&&y[p2]==num)p2++,cnt2++; 28 ans=ans*cal(p1-1,p2-1,cnt1,cnt2,num)%mod; 29 } 30 printf("%lld\n",ans); 31 }
Tips:感謝王hecao更正。
T3:Seat
skyh傾情壓行注釋。
