哈理工 網路賽

2022-06-27 08:37:01 字數 3825 閱讀 5602

在acimo星球, tabris 是一名勇敢的屠龍勇士,在上綠島屠龍前決定挑選n種裝備武裝自己,現在每種裝備有兩個,**但每種裝備tabris必須選擇拿乙個**,**不能多也不能少**。

每件裝備有自己的屬性值,能給tabris屬性加成。

對於不同種類的裝備之間有疊加效果,如果選擇多件裝備,最終的屬性加成為他們的乘積。

若tabris初始屬性值為0,最後屬性加成的期望是多少。

有多組測試樣例,輸入到檔案結束。

每組測試資料的第一行包含乙個正整數nn,表示裝備的種類數。

接下來n行,每行兩個正整數ai、bi,表示兩個不同的第ii種裝備的屬性加成值。

n∈[1,103]

ai,bi∈[1,106]

對於每組測試資料輸出乙個整數,為了方便輸出最終的結果先乘2
n
再對1e9+7取模後的值。
示例1

4

1 23 4

5 67 8

3465

3465 = (1*3*5*7) + (1*3*5*8) +(1*3*6*7) + (1*3*6*8) + (1*4*5*7) + (1*4*5*8) + (1*4*6*7) + (1*4*6*8) + (2*3*5*7) + (2*3*5*8) + (2*3*6*7) + (2*3*6*8) + (2*4*5*7) + (2*4*5*8) + (2*4*6*7) + (2*4*6*8) ;

題意 : 每組資料選擇乙個,將每組資料中選出的資料相乘,求最後的和。

思路 : 先考慮只有一組資料的情況,答案即為兩個數相加的和,在考慮有兩組資料的情況,在紙上寫一下會發現規律,所有資料的和即為每組資料的和相乘

**示例 :

int main() 

printf("%lld\n", ans%mod);

}return 0;

}

c .小明很喜歡打遊戲,現在已知乙個新英雄即將推出,他同樣擁有四個技能,其中三個小技能的釋放時間和固定的傷害值為:

他還有乙個大招,其釋放的時間是乙個區間【l,r】,可以在區間內任意時間點釋放出技能,其如果在l+i時刻釋放技能,其能夠打出的傷害值為:temp+a*i

這裡temp值表示技能的基礎傷害(同時也就是在時刻l釋放技能的傷害值),a是乙個常數。

小明很喜歡研究連招使得在有限的時間內打出最高的傷害,現在他想要在t長度單位時間內打出最高的傷害,問這個最大傷害值。

本題包含多組資料。

輸入格式為:

tx a

y bz c

l r temp a

資料範圍:

1<=t<=1e5

1<=x,y,z,l,r<=t

l<=r

<=a,b,c,temp,a<=1e5

輸出包含一行,輸出能夠打出的最高傷害值。
示例1

8

3 12 3

1 33 3 3 3

24

大招:蓄力時間最短l秒,最多r秒。無限次釋放,釋放之後照成的傷害是隨著時間增加的

蓄力l秒釋放能夠造成temp的傷害

蓄力l+1秒釋放能夠造成temp+1*a的傷害

依次類推

題目分析 : 如果沒有大招,那這題就是乙個簡單的線性dp,掃一遍就過了,但是現在有大招,加了一位博友,第一次才知道,原來這種公式是可以推出來的,dp[i] = max(dp[i], dp[j]+temp+a*(i-l-j)),i-r <= j <= i-l ,維護當時間是 i 時,尋找此時的最大值並且繼續更新。

但是你單純按照著這個遞推公式推,你會出錯了,因為你只是確保是dp的最大,但是時間是不確定的,因為有可能同乙個dp值,但是有兩個時間都是等於這個,因此可以將公式進一步變形,dp[i] = max(dp[i], dp[j]-a*j + temp + a*(i-l)),這裡可以用優先佇列去維護,但是有

個點一定要知道,就是 你的時間是遞推的,因此在區間內不符合範圍的解,此不符合的區間的前端以後也是不會用到的,因此可以之間刪除,但是後面的點以後可能會用到,要儲存下來。

**示例 :

const int eps = 1e5+5;

const double pi = acos(-1.0);

const int inf = 1<<29;

#define max(a,b) a>b?a:b

#define min(a,b) a>b?b:a

#define ll long long

ll dp[eps];

struct node

node(ll _w, int _u):w(_w), u(_u){}

};int main()

node v = que.top();

dp[i] = max(dp[i], v.w+1ll*tem+1ll*a*(i-l));

//if (i == 2) printf("@@%lld %d %d %d", v.w, tem, a, i-l);

}que.push(node(dp[i]-1ll*a*i, i));

while(!s.empty())

ans = max(ans, dp[i]);

//printf("**%lld\n", dp[i]);

}printf("%lld\n", ans);

}return 0;

}

另一種寫法 : 要好好 理解一下為什麼 ret 要初始化為 long long 的負無窮

const int eps = 1e5+5;

const double pi = acos(-1.0);

const int inf = 1<<29;

#define max(a,b) a>b?a:b

#define min(a,b) a>b?b:a

#define ll long long

ll dp[eps];

struct node

tree[eps<<2];

ll maxx;

void build(int l, int r, int k)

int m = (l + r)>>1;

build(l, m, k<<1);

build(m+1, r, k<<1|1);

tree[k].w = max(tree[k<<1].w,tree[k<<1|1].w);

}ll query(int l, int r, int k)

int m = (tree[k].l + tree[k].r) >> 1;

ll ret = -__long_long_max__; // 初始化為long long 的負無窮

if (l <= m) ret = max(ret, query(l, r, k<<1));

if (r > m) ret = max(ret, query(l, r, k<<1|1));

return ret;

}void update(int pos, ll val, int k)

int m = (tree[k].l + tree[k].r) >> 1;

if (pos <= m) update(pos, val, k<<1);

else update(pos, val, k<<1|1);

tree[k].w = max(tree[k<<1].w,tree[k<<1|1].w);

}int main()

update(i, dp[i]-1ll*a*i, 1);

ans = max(ans, dp[i]);

}printf("%lld\n", ans);

}return 0;

}

哈理工多校演算法賽三

a 不凡的夫夫 include define pi 3.1415926535 using namespace std intmain return0 view code 斯特林公式 b 乙個小問題 中國剩餘定理 待解c 守護白起 待解d 小牛vs小客 include using namespace ...

16哈理工新生賽 A 棋盤村 dp

棋盤村time limit 1000 ms memory limit 32768 k total submit 219 72 users total accepted 71 61 users rating special judge no description 一名騎著馬的強盜闖進了原本平靜祥和的...

哈理工院賽 小樂樂搭積木

題目描述 小樂樂想要給自己搭建乙個積木城堡。積木城堡我們假設為n m的平面矩形。小樂樂現在手裡有12,21兩種地磚。小樂樂想知道自己有多少種組合方案。輸入描述 第一行輸入整數n,m。1 n,m 10 輸出描述 輸出組合方案數。示例1 輸入2 3輸出 3示例2 輸入1 3輸出 0示例3 輸入2 5輸出...