亞可喜歡上了收集不包括空格的可見字元(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軸正方形為東。輸出乙個...