应该是最毒瘤的一场多校。
题目链接:http://acm.hdu.edu.cn/contests/contest_show.php?cid=854
A:
F:
有n个问题,每道问题的分数取值范围是[0,m],所有分数加起来等于m。每道题知识点无关联,若要解决分数为x的题,则需复习对应知识点x+1个小时。问:解决k道题所需最少复习时间。
可以反向思考这个问题:若出卷老师知道学生每道题的复习时间,怎样出卷才能使得学生做不出k题。
很简单,可以让学生做出复习时间最多的k-1道题,然后令学生复习得最少的m-k+1道题都做不出来,让做不出来的题的难度等于学生的复习时间即可。
回到学生视角,要防止这种情况发生,就应该让复习得最少的m-k+1道题的总复习时间大于m,保证这m-k+1道题中一定能做出一题。

1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (curpos<<1) 15 #define rson (curpos<<1|1) 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 int main() { 21 int t; scanf("%d", &t); 22 while (t--) { 23 ll n, m, k; scanf("%lld%lld%lld", &n, &m, &k); 24 // m/(n-k+1)+1是前k-1题复习时间,m+1是第k题复习时间 25 printf("%lld ", (m / (n - k + 1) + 1) * (k - 1) + m + 1); 26 } 27 return 0; 28 }
J:
一个游戏角色要升级,总共有n级,最低级为1级。给定相邻等级升级成功的概率、代价和失败后变成的等级。给出q次查询,每次查询给定两个等级p和q,输出从p级升到q级的期望代价。
显然满足前缀和性质,递推期望即可。

1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(currLevel,a,b) for(int currLevel=a;currLevel<=b;++currLevel) 10 #define rep0(currLevel,a,b) for(int currLevel=a;currLevel<b;++currLevel) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (curpos<<1) 15 #define rson (curpos<<1|1) 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int mod = 1e9 + 7, maxn = 1e6 + 10; 21 int sum[maxn]; 22 23 int qp(ll a, ll n) { 24 ll ret = 1; 25 while (n) { 26 if (n & 1) ret = ret * a % mod; 27 a = a * a % mod; 28 n >>= 1; 29 } 30 return ret; 31 } 32 33 int main() { 34 int t; scanf("%d", &t); 35 while (t--) { 36 int n, q; scanf("%d%d", &n, &q); 37 rep1(currLevel, 1, n) { 38 int p, q, lostLevel, cost; scanf("%d%d%d%d", &p, &q, &lostLevel, &cost); 39 ll preCost = (sum[currLevel - 1] - sum[lostLevel - 1] + mod) % mod; 40 sum[currLevel] = (preCost + cost) % mod * q % mod * qp(p, mod - 2) % mod; // (preCost+addCost)/(p/q) 41 sum[currLevel] = (sum[currLevel] - preCost + mod) % mod; // -preCost 42 sum[currLevel] = (sum[currLevel - 1] + sum[currLevel]) % mod; // 重新计算前缀和 43 } 44 while (q--) { 45 int l, r; scanf("%d%d", &l, &r); 46 printf("%d ", (sum[r - 1] - sum[l - 1] + mod) % mod); 47 } 48 } 49 return 0; 50 }