牛客練習賽91(並查集 二維偏序 二分)

2022-09-09 12:15:20 字數 3674 閱讀 9753

亞可喜歡上了收集不包括空格的可見字元(ascii碼為33~126),在她眼中,乙個字元的價值為其ascii碼大小,比如』a』的價值為97。

目前她已經收集了n

n個不包括空格的可見字元,第i

i個字元為sis

i​。可是她想要把自己收集的n

n個字元的價值和最大化,因此去請求了黛安娜的幫助。

黛安娜有m

m種魔法,第i

i種魔法可以將[li

,ri]

[li​

,ri​

]區間的乙個字元替換為cic

i​。因為黛安娜出色的魔力,所以每種魔法都可以使用無限次。

請問黛安娜使用完若干次魔法後,亞可收集的n

n個字元的最大價值和可以是多少?

\(1<=n<=10^7\)

\(1<=m<=10^6\)

多組測試樣例

3 3

aaa1 3 b

2 3 c

3 3 d

297
按照字元 \(c\) 的價值降序排序,後面的字元一定不能覆蓋前面的字元。

這樣用並查集就可以解決了

const int n = 2e7 + 5;

int n, m, k, _;

struct tmp

void read()

tmp(int l = 0, int r = 0, char ch = 0) : l(l), r(r), opt(ch){}

};vectorv;

char ch[n];

int fa[n];

int find(int x)

signed main()

sort(v.begin(), v.end());

for(int i = 1; i <= n + 1; i ++) fa[i] = i;

ll ans = 0;

int sz = v.size(), res = 0;

for(int i = 0; i < sz; i ++)

}for(int i = 1; i <= n; i ++) ans += ch[i];

pll(ans);

}// pause;

return 0;

}

勇者為救公主殺入魔塔,不料在魔塔三層遭遇魔王偷襲,失去了神聖劍與神聖盾,而自身也被關入監獄。

監獄是一塊3×n

3×n的區域,每塊格仔都有乙個價值。勇者目前在監獄的左上角(1,

1)(1

,1)處,而他需要逃亡到監獄的右下角(3,

n)(3

,n)處。

勇者每次可以向右或者向下移動一格,請問勇者逃亡到右下角,其路徑價值和大於等於0的不同方法數一共有多少種,答案對100000000710

0000

0007

取模。

\(1<=n<=5*10^5\)

\(-10^9<=a_i<=10^9\)

多組測試樣例

2

0 -1

-1 -1

-1 3

3
可以發現只會向下走兩次,故可以得到

\(s_1[l]+s_2[r]-s_2[l-1]+s_3[n]-s_3[r-1]>=0\)

\(s_1[l]-s_2[l-1]+s_3[n]>=s_3[r-1]-s_2[r]\)

另 \(a[l]=s_1[l]-s_2[l-1]+s_3[n],\ b[r]=s_3[r-1]-s_2[r]\)

然後尋找 $a[i]>=b[j] && j >= i $ 的個數

樹狀陣列+離散化就可以了

const int mod = 1e9 + 7;

const int n = 1e6 + 5;

int n, m, k, _;

ll a[n], b[n];

ll sum[5][n];

vectorv;

ll c[n];

int getid(ll x)

void add(int i, int x)

}int ask(int i)

return ans;

}ll adp(ll &x)

signed main()

}for(int i = 1; i <= n; i ++)

sort(v.begin(), v.end());

v.erase(unique(v.begin(), v.end()),v.end());

rep(i, 1, n)

ll ans = 0;

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

pll(ans);

}// pause;

return 0;

}

白正在玩的遊戲到了boss階段,該階段一共有n

n個回合,對於每個回合,由白先行動,然後boss再進行攻擊。

每回合白可以選擇下面一種方式進行操作:

1.普通攻擊,對boss造成a

a點傷害。

2.狂暴攻擊,當自己生命值大於b

b時,可以消耗b

b點生命值對boss造成2×a

2×a點傷害。

3.防禦,本回合boss對你造成的x

x點傷害變為x22

x​(向下取整)。

經過攻略查詢,現已知boss的初始生命值為hph

p,以及每個回合對玩家造成的傷害為aia

i​。 遊戲要求白必須在n

n個回合內戰勝boss(即在n

n個回合的某個回合內使boss的生命值降為0

0或者更低),並保證這個過程中白的生命值一直大於00。

在保證通關遊戲的前提下,請計算白的最少初始生命值。若無法通關遊戲,則輸出−1−

1。 \(1<=hp, a, b<=10^9\)

\(1<=n<=10^5\)

\(a_i<=10^9\)

多組測試樣例

1

5 1 1

31 1 1

5
當時看著就像個二分,這個貪心真是絕了

假設 \(x\) 為答案,那麼每次都是狂暴攻擊,直到 \(x\) 變為 \(0\), 然後將之前的狂暴攻擊轉為普通攻擊,普通攻擊還可以變成防禦,這樣每次 \(boss\) 都會加 \(a\),也就是說,此時我需要加最多的血量也就是 \(max(b, \frac向上取整)\)

const int n = 1e5 + 5;

int n, m, k, _;

ll a[n];

ll h, a, b;

bool c(ll x)

else if(maxx.empty() == 0)

else if(q.empty() == 0)

else return 0;}}

if(hp <= 0 && x > 0) return 1;

}return (hp <= 0 && x > 0);

}signed main()

else

}pll(ans);

}// pause;

return 0;

}

牛客 Laptop 二維偏序

題面 fst是一名可憐的小朋友,他很強,但是經常fst,所以rating一直低迷。但是重點在於,他非常適合acm!並在最近的區域賽中獲得了不錯的成績。拿到獎金後fst決定買一台新筆記本,但是fst發現,在 能承受的範圍內,筆記本的記憶體和速度是不可兼得的。可是,有一些筆記本是被另外一些 完虐 的,也...

牛客練習賽59 小松鼠吃松果 優化dp二維偏序

小松鼠吃松果 非常nice nice nice 的一道題 首先考慮dpdp dp容易想到按照時間來排序 然後定義dp i dp i dp i 為考慮前i ii個果子且吃掉第i ii個的最大價值 那麼每次都去前面列舉乙個j jj使得吃完j jj還可以來吃iii 吃完j jj還能吃i ii有什麼條件呢?...

牛客練習賽16C 任意點 並查集

平面上有若干個點,從每個點出發,你可以往東南西北任意方向走,直到碰到另乙個點,然後才可以改變方向。請問至少需要加多少個點,使得點對之間互相可以到達。第一行乙個整數n表示點數 1 n 100 第二行n行,每行兩個整數xi,yi表示座標 1 xi,yi 1000 y軸正方向為北,x軸正方形為東。輸出乙個...