hdu 4655
題意:給乙個序列,每個位置可以塗1~ai種顏色,連續不相同的顏色為一段,對於乙個排列,所有的塗色方法產生的段數為s,求最大的s;
分析:對於乙個排序,所有的段數為n* - (相鄰兩個位置塗相同顏色的個數s);
怎麼計算相鄰兩個位置塗相同顏色的個數s?
p[i]表示字首積,即p[i] = a1*a2*..*ai;
q[i]表示字尾積,即q[i] = ai*...*an;
s =sum( p[i-1]*q[i+2]*min(ai,ai+1) ) (0<=i要使s最小,即min(ai,ai+1)盡量小,假設序列ai
1 #include2 #include3 #include4 #include5 #include6 #include7view codeusing
namespace
std;
8 typedef long
long
ll;9
const
int mod = (int)1e9+7;10
const
int n = 1000000+10;11
inta[n],b[n];
12int
n;13
ll p[n],q[n];
14int
main()
21 sort(a,a+n);
22int l = 0, r = n - 1;23
for (int i = 0; i < n; i++) else b[i] = a[r--];
27//
cout<28 }//
cout<29 ll sum =n;
30 p[0] = b[0]; q[n] = 1;31
for (int i = 1; i < n; i++) p[i] = p[i-1] * b[i] %mod;
32for (int i = n-1; i >= 0; i--) q[i] = q[i+1] * b[i] %mod;
33for (int i = 0; i < n; i++) sum = sum * b[i] %mod;
34 sum = (sum - (ll)min(b[0],b[1])*q[2]%mod + mod ) %mod;
35for (int i = 1; i < n-1; i++)
38 cout
4041
return0;
42 }
杭電多校第六場(IF)
題意 有命題 將 b 進製數y按位相加,迴圈無窮次,最終結果若 x 0,則有y x 0,反之不然 給出b和x,判斷命題是否成立 打表發現的b x 1時成立,看到有數論大佬推出來的 想看推導的右轉 includeusing namespace std typedef unsigned long lon...
HDU 多校聯合第六場
uestc的題。果然,題意都弄得這麼晦澀。推個規律,mod r。偶推錯了。1個小時才過。三分做的。還是不知道怎麼證明他是凹函式,話說。以為神人想當然的說這是凹函式。怎麼證明?管他呢,真沒勁!話說偶已經推出來s1的和sum1,s2的和sum2。sum1 sum2必為偶數,才能yes。但是對於字串長度為...
牛客多校第六場
d 題意感覺說的不是很清楚,一開始題意弄錯了,以為是最優的方案,結果是對於每個盒子這個 so clever 的人的做法是優先選擇盡可能大的物品裝完乙個盒子,我就不知道這個人 聰明了。思路 賽後知道題意後,5分鐘寫完,瞎暴力就一發過了,我自己都有點出乎意料真水了。includeusing namesp...