自閉。不廢話。寫一下低錯。
T1:覺得信心賽T1不會很惡心一遍過樣例直接沒對拍(其實是想寫完T2之后回來對拍的)
狀態也不好,基本全機房都開始碼了我還沒想出來(skyh已經開T2了)。想了40多分鍾。
區別不大。真是人才。
而且反向的單調棧沒reverse。爆零。
T2:100多分鍾打表找到了一個僅適用於n,a<=5的規律(我還以為它是普適的,但其實n<=5,a<=5也不完全對)。浪費時間太多。
這次說實在的不是故意剛它的,因為打表不斷有新進展所以很開心就沒看時間。
T3:最后7分鍾寫的暴力得了和前198分鍾一樣的分數。
丟30分。求lca都不會打了。
真他媽難度中等有區分度看來我女隊也混不了了2333。。。
把出題人掛起來婊
對自己沒話可說了。那就干脆別廢話了吧。
T1:A
可以發現,他給的二次函數沒有c。有什么特性?一定經過原點?這個沒什么用。
是可以整體除以x得到一次函數,正負分情況討論。那么就剩下一個單調棧維護凸包板子。
寫了對拍20分鍾肯定是能調出來的。

1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 #define int long long 5 struct line{ 6 int k,b; 7 friend bool operator<(line A,line B){ 8 return A.k<B.k||(A.k==B.k&&A.b<B.b); 9 } 10 }l[500005]; 11 int ans[32323],sta[500005],top,negans[32323]; 12 int cal(int o,int x){return l[o].k*x*x+l[o].b*x;} 13 long double mp(int o,int p){return (0.0L+l[o].b-l[p].b)/(l[p].k-l[o].k);} 14 main(){ 15 freopen("A.in","r",stdin);freopen("A.out","w",stdout); 16 int n,q,x;scanf("%lld%lld",&n,&q); 17 for(int i=1;i<=n;++i)scanf("%lld%lld",&l[i].k,&l[i].b); 18 sort(l+1,l+1+n); 19 for(int i=1;i<=n;++i){ 20 while(top&&l[sta[top]].k==l[i].k&&l[sta[top]].b<l[i].b)top--; 21 while(top&&mp(sta[top],i)<1)top--; 22 while(top>1&&mp(sta[top-1],sta[top])>=mp(sta[top-1],i))top--; 23 sta[++top]=i; 24 }//for(int i=1;i<=top;++i)printf("%lld %lld\n",l[sta[i]].k,l[sta[i]].b);printf("%lld\n",l[2].k-l[3].k); 25 int ptr=1; 26 for(int X=1;X<32323;++X){ 27 while(ptr<top&&cal(sta[ptr],X)<=cal(sta[ptr+1],X))ptr++; 28 ans[X]=cal(sta[ptr],X); 29 } 30 top=0;ptr=1; 31 for(int i=n;i;--i){ 32 while(top&&l[sta[top]].k==l[i].k&&l[sta[top]].b>l[i].b)top--; 33 while(top>1&&mp(sta[top-1],sta[top])>=mp(sta[top-1],i))top--; 34 sta[++top]=i; 35 }reverse(sta+1,sta+1+top); 36 for(int X=-1;X>-32323;--X){ 37 while(ptr<top&&cal(sta[ptr],X)<=cal(sta[ptr+1],X))ptr++; 38 negans[-X]=cal(sta[ptr],X); 39 } 40 while(q--)scanf("%lld",&x),printf("%lld\n",x>=0?ans[x]:negans[-x]); 41 }
T2:B
除了第一個以外,其余的每一位是不互相影響的。
那么答案就是$a_1 + \sum\limits_{i=2)^{n} f(a_1,a_i) $
關鍵在於計算$f$函數。可以發現這個$f$函數的含義:
第一個物品被選完了,第二個物品期望被選多少個。
枚舉它選了多少個,計算出概率,特殊處理被選完的情況,概率就是1-前面沒被選的概率之和。
$f(a,b)=\sum\limits_{i=0}^{b-1} \frac{i \times C_{a+i-1}^{i}}{2^{a+i}} \ + b \ - \sum\limits_{i=0}^{b-1}\frac{b \times C_{a+i-1}^{i}}{2^{a+i}}$
+b前面的部分就是沒選完,后面的部分就是選完了的剩余情況。組合數就是枚舉這么多次選擇恰好把它選完的方案數,除總方案數就是概率。
要-1的原因是最后一步要默認選擇的是a而不是b。否則會重復計數。
再看本題的特殊之處,每次調用$f$函數的時候,第一個參數$a$都是一致的。
那么只要處理出來a這一列就好了。
可以發現,b每增大1,式子的變化之處並不多,前后的和式都多了一項。線性遞推預處理即可。

1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 #define int long long 5 #define mod 323232323 6 #define S 1000005 7 int qpow(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 int fac[S],inv[S],pw[S],ipw[S],F[S],G[S],ans,x; 9 int C(int b,int t){return b<t?0:fac[b]*inv[t]%mod*inv[b-t]%mod;} 10 void f(){ 11 int totpos=0; 12 for(int i=0;i<500002;++i){ 13 F[i]=((i?F[i-1]:0)+i*C(x-1+i,i)%mod*ipw[x+i])%mod; 14 totpos=(totpos+C(x-1+i,i)*ipw[x+i])%mod; 15 G[i]=(1+i)*(1+mod-totpos)%mod; 16 } 17 for(int i=S-1;i;--i)F[i]=(F[i-1]+G[i-1])%mod; 18 } 19 main(){ 20 freopen("B.in","r",stdin);freopen("B.out","w",stdout); 21 fac[0]=1; 22 for(int i=1;i<S;++i)fac[i]=fac[i-1]*i%mod; 23 inv[S-1]=qpow(fac[S-1],mod-2); 24 for(int i=S-2;~i;--i)inv[i]=inv[i+1]*(i+1)%mod; 25 pw[0]=1; 26 for(int i=1;i<S;++i)pw[i]=pw[i-1]*2%mod; 27 ipw[S-1]=qpow(pw[S-1],mod-2); 28 for(int i=S-2;~i;--i)ipw[i]=ipw[i+1]*2%mod; 29 int n,y;scanf("%lld%lld",&n,&x);n--;ans=x;f(); 30 while(n--)scanf("%lld",&y),ans=(ans+F[y])%mod; 31 printf("%lld\n",ans); 32 }
T3:C
不想寫。細節多,題解還那么垃圾。
$O(n\ log \ n \ log \ a_i)$的暴力看懂了。就是離線詢問(否則會MLE)枚舉每一位的答案貢獻。
首先對於每次詢問我們把或當成加法。求出路徑上所有點的權值和,以及距離之和。
然后把或當成加法的多余貢獻就是兩個值相與的值,求出每個答案與后的值從上面那個值里扣除就是答案。
可以發現二進制串在遞增序列上是有循環節的。先考慮u到lca的貢獻。
處理數組dp[i][j]表示從i號節點開始的完整循環節的長度為$2^j$的祖先鏈上的當前處理的這一位的$a_i$值與循環節的1的撞上的數的個數。
然后對於非完整循環節特殊處理一下。我的想法是(強調:這是我自己yy的可能不對):
再處理一個數組f[i][j]表示從i號點開始的長度為$2^j$的祖先鏈上的當前處理的這一位的$a_i$值為1的數的個數。也就是默認了距離值的這一位是1。
因為最后剩下的一段非完整循環節一定是一堆0,后面都是1。這樣的話你倍增跳一下把0的都跳過,然后剩下的1用f數組就可以計算出來。
然后u到lca這一段就處理完了。對於v到lca的這一段,我們把v往上跳直到遇到第一個完整循環節開始的地方,這個跳可以類似的預處理。
然后剩下的就和u到lca一樣了。只不過一個的循環是000011110000111100...這樣的,另一個是111100001111000011....這樣的。
那么你只要把前幾個1排除在完整循環節之外進行處理,剩下的兩邊就完全一樣了。
大神yxs寫出來了得到了T70的好成績(從上述代碼細節你就可以感受到這題常數有多大)
心累。真心不想寫。就這樣吧。等yxs或其他大神AC之后我再update吧