牛客練習賽42 C 出題的訣竅

2022-03-11 14:12:17 字數 1223 閱讀 4024

這個題就是對於每個數算貢獻,如果有相同的數,只計算先出現的數的貢獻

對於數x,若它在前i行的數目分別為a1,a2......ai。則這個數的貢獻應為:ai*x*(n-a1)*(n-a2)*.....*(n-a(i-1))*n^(m-i)次方。這樣想,如果不要求不重複算,那大小就直接是ai*n^(m-1)了

(n-a1)*(n-a2)*.....*(n-a(i-1))保證了前面不會出現相同的,n^(m-i)後面則不需要顧忌,因為就算選到了相同的,也只會把前面的數算進去

這個題非常玄學,不用快讀時而過,時而不過,用了快讀就穩過,以後能用快讀就還是盡量用吧。

**實現:首先將所有數字從小到大排序,第二關鍵字為所在的行,這樣一來,相同的數字排到了一起,並且相同數字且在同一行的數也排在了一起,這樣就能很方便地統計每種數字,在每一行出現的次數

用前後是否相同來判斷是否到了分界點,具體實現見**

#includeusing

namespace

std;

typedef

long

long

ll;const

int inf=1

<<30

;const

int maxn=2001

;const

double pi=acos(-1

);const

int mod=1000000007

;struct

node

}p[maxn*maxn];

ll q[maxn];

inline

void read(int &x)

intmain();

}sort(p+1,p+cnt+1);int first=1

;

for(int i=1;i<=cnt;i++)

}ans=(ans+(ll)p[i].a*t%mod*s%mod*q[m-k-1])%mod;//

這個加和迴圈裡的加其實沒區別,因為少了k++這一步q陣列多減乙個1

first=i+1

; }

}cout

return0;

}

牛客練習賽42 出題的訣竅(數學 hash)

出題的訣竅 題解 由於他是在每一行選取乙個元素,然後縱向來比較,這裡行的順序是不會影響的,所以我們將每乙個數存入雜湊表中,然後對每乙個數來進行考慮。第一行的數,對答案的貢獻為mn 1,而第二行對答案的貢獻為mn 2 m 1 以此類推。這裡注意對同一行有多個相同元素的情況考慮一下。如下 include...

牛客練習賽42題解

寫題寫的感覺自己彷彿是個傻子 給定兩個等長的由小寫字母構成的串 a,b,其中 a b n 現在你需要求出乙個子區間 l,r 使得 lcp a l,r b l,r lcs a l,r b l,r lcp a l,r b l,r lcs a l,r b l,r 最大,並輸出這個值。lcp s,t 表示s...

牛客練習賽42(A,B)

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 給定兩個等長的由小寫字母構成的串 a,ba,b,其中 a b n 現在你需要求出乙個子區間 l,r 使得 lcp a l,r b l,r lcs a l,r b l...