由於只會t1,沒法寫遊記,只好來寫題解了...
給你乙個數列,每次可以任取兩個不相交的區間,取一次的貢獻是這兩個區間裡所有數的最小值,求所有取法的貢獻和,對 \(10^9+7\) 取模。
數列長度 \(2\times 10^5\) ,值域 \(1\) ~ \(10^9\) 。
預處理區間最小值,列舉選的兩個區間。
每個元素作為貢獻的區間就是 \([x,y](l_i\le x\le i\le y\le r_i)\),每個元素作為貢獻的區間數就是 \(t_i=(i-l_i+1)\times(r_i-i+1)\) 。#include #include #include using namespace std;
的貢獻是 \(3\) 號元素,即最左邊的 \(2\) )。所以,可以利用棧在 \(o(n)\) 的時間內預處理出每個元素作為貢獻的區間的左端點和右端點的範圍:const int m=1000000007;
int n,a[60][60],ans;
int main()
for (i=1;i
考慮每個元素作為貢獻的區間是哪些,為了把每個區間分給唯一的元素,規定乙個區間的貢獻是最小值裡最靠左的( e.g.4 3 2 4 2 2
for (i=1;i<=n;++i)
sta[++top]=i; }
while (top)
for (i=n;i>=1;--i)
sta[++top]=i; }
while (top)
然後,將元素按值從大到小排序,就能計算出區間數的字尾和 \(suf[i]\),但乙個元素的總貢獻並不是 \(t_i\times suf[i+1]\),因為這些區間可能與當前元素作為貢獻的區間相交。
注意到,要想和當前元素作為貢獻的區間相交,必須 \([x,y](l_i\le x\le y\le r_i)\) ,而這樣的區間除了當前元素作為貢獻的區間,貢獻都排在當前元素之後(值比當前元素大或值相等但位置靠後),所以這樣的區間除了當前元素作為貢獻的區間,都是我們要找的與當前元素作為貢獻的區間相交的貢獻更靠後的區間。
注:下面這段話中「相交的區間對」指(與當前元素作為貢獻的區間相交的貢獻更靠後的區間,當前元素作為貢獻的區間)這樣的一對區間;「相交的區間」指與當前元素作為貢獻的區間相交的貢獻更靠後的區間。接下來就要計算相交的區間有多少對。首先,相交的區間不可能跨過當前元素,否則就是當前元素作為貢獻的區間;所以,相交的區間要麼是 \([x,y](l_i\le x\le y,要麼是 \([x,y](i。先計算 \([x,y](l_i\le x\le y與當前元素作為貢獻的區間相交的對數,先考慮 \(y\) 固定時,個數為 \((r_i-i+1)\times(y-l_i+1)^2\) ,其中:\(y-l_i+1\) 既是相交的區間左端點的個數,也是與相交的區間相交的當前元素作為貢獻的區間的左端點的個數;\(r_i-i+1\) 是與相交的區間相交的當前元素作為貢獻的區間的右端點的個數。所以,總數是 \((r_i-i+1)\times\sum\limits_^(y-l_i+1)^2\) ,乘號右邊是自然數平方和,可以用公式計算,所以就是 \((r_i-i+1)\times\frac6\) 。\([x,y](i同理,總數為 \((i-l_i+1)\times\frac6\) 。
所以,把相交的總對數減掉就可以了。
#include #include #include #include using namespace std;
int read()
return out;
}const int n=200010;
const int m=1000000007;
const int six=166666668; //6模1e9+7的逆元
struct node
sta[++top]=i; }
while (top)
for (i=n;i>=1;--i)
sta[++top]=i; }
while (top)
for (i=1;i<=n;++i)
sort(a+1,a+n+1);
for (i=n;i>=1;--i)
for (i=1;i<=n;++i)
cout
}
2019 假期第一場(2019 1 14)
description input input contains two integers n,m 1 n 1000,0 m 10 output output the answer in a single line.sample input 10 0sample output 10題意 求 思路 同...
ECJTU2019第一場排位賽
回文串題面統計資料 單點時限 2.0 sec記憶體限制 512 mb qq 小方以前不會判斷回文數列,現在他會了,所以他急切的想教會你。回文數列指的是乙個正讀和反讀都一樣的數列,比如 1 2 3 2 1 和 1 2 2 1 單單講給你聽肯定是不夠的,為了表現自己,qq 小方現在要考考你。現在 qq ...
2019FJUT第一場周賽 題解
a 先用全排列打了個表 可以發現有三個小數部分是0.66667,也就是2 3,這樣子看不出來什麼,我們把後者乘個3,都變成正整數看看 數感好的可以直接看出來 ans n n 1,那麼答案也就是ans 3.0 數感差的 本人 只能看出來是個遞推式 ans i ans i 1 2 i 1 include...