diff --git a/src/main/java/g3701_3800/s3771_total_score_of_dungeon_runs/Solution.java b/src/main/java/g3701_3800/s3771_total_score_of_dungeon_runs/Solution.java
new file mode 100644
index 000000000..99ebaeaa7
--- /dev/null
+++ b/src/main/java/g3701_3800/s3771_total_score_of_dungeon_runs/Solution.java
@@ -0,0 +1,35 @@
+package g3701_3800.s3771_total_score_of_dungeon_runs;
+
+// #Medium #Array #Binary_Search #Prefix_Sum #Staff #Weekly_Contest_479
+// #2026_05_07_Time_19_ms_(100.00%)_Space_170.56_MB_(72.37%)
+
+public class Solution {
+ public long totalScore(int hp, int[] damage, int[] requirement) {
+ int n = damage.length;
+ int[] cumulative = new int[n + 1];
+ for (int i = n - 1; i >= 0; i--) {
+ cumulative[i] = cumulative[i + 1] + damage[i];
+ }
+ long soln = 0;
+ for (int i = n - 1; i >= 0; i--) {
+ int adjHP = hp - requirement[i] + cumulative[i + 1];
+ if (adjHP >= cumulative[i]) {
+ soln += i - binSearch(cumulative, adjHP, i) + 1;
+ }
+ }
+ return soln;
+ }
+
+ private int binSearch(int[] arr, int hp, int l) {
+ int h = 0;
+ while (h < l) {
+ int mid = (h + l) >>> 1;
+ if (arr[mid] > hp) {
+ h = mid + 1;
+ } else {
+ l = mid;
+ }
+ }
+ return h;
+ }
+}
diff --git a/src/main/java/g3701_3800/s3771_total_score_of_dungeon_runs/readme.md b/src/main/java/g3701_3800/s3771_total_score_of_dungeon_runs/readme.md
new file mode 100644
index 000000000..340370bc1
--- /dev/null
+++ b/src/main/java/g3701_3800/s3771_total_score_of_dungeon_runs/readme.md
@@ -0,0 +1,57 @@
+3771\. Total Score of Dungeon Runs
+
+Medium
+
+You are given a **positive** integer `hp` and two **positive** **1-indexed** integer arrays `damage` and `requirement`.
+
+There is a dungeon with `n` trap rooms numbered from 1 to `n`. Entering room `i` reduces your health points by `damage[i]`. After that reduction, if your remaining health points are **at least** `requirement[i]`, you earn **1 point** for that room.
+
+Let `score(j)` be the number of **points** you get if you start with `hp` health points and enter the rooms `j`, `j + 1`, ..., `n` in this order.
+
+Return the integer `score(1) + score(2) + ... + score(n)`, the sum of scores over all starting rooms.
+
+**Note**: You cannot skip rooms. You can finish your journey even if your health points become non-positive.
+
+**Example 1:**
+
+**Input:** hp = 11, damage = [3,6,7], requirement = [4,2,5]
+
+**Output:** 3
+
+**Explanation:**
+
+`score(1) = 2`, `score(2) = 1`, `score(3) = 0`. The total score is `2 + 1 + 0 = 3`.
+
+As an example, `score(1) = 2` because you get 2 points if you start from room 1.
+
+* You start with 11 health points.
+* Enter room 1. Your health points are now `11 - 3 = 8`. You get 1 point because `8 >= 4`.
+* Enter room 2. Your health points are now `8 - 6 = 2`. You get 1 point because `2 >= 2`.
+* Enter room 3. Your health points are now `2 - 7 = -5`. You do not get any points because `-5 < 5`.
+
+**Example 2:**
+
+**Input:** hp = 2, damage = [10000,1], requirement = [1,1]
+
+**Output:** 1
+
+**Explanation:**
+
+`score(1) = 0`, `score(2) = 1`. The total score is `0 + 1 = 1`.
+
+`score(1) = 0` because you do not get any points if you start from room 1.
+
+* You start with 2 health points.
+* Enter room 1. Your health points are now `2 - 10000 = -9998`. You do not get any points because `-9998 < 1`.
+* Enter room 2. Your health points are now `-9998 - 1 = -9999`. You do not get any points because `-9999 < 1`.
+
+`score(2) = 1` because you get 1 point if you start from room 2.
+
+* You start with 2 health points.
+* Enter room 2. Your health points are now `2 - 1 = 1`. You get 1 point because `1 >= 1`.
+
+**Constraints:**
+
+* 1 <= hp <= 109
+* 1 <= n == damage.length == requirement.length <= 105
+* 1 <= damage[i], requirement[i] <= 104
\ No newline at end of file
diff --git a/src/test/java/g3701_3800/s3771_total_score_of_dungeon_runs/SolutionTest.java b/src/test/java/g3701_3800/s3771_total_score_of_dungeon_runs/SolutionTest.java
new file mode 100644
index 000000000..d95b9c12d
--- /dev/null
+++ b/src/test/java/g3701_3800/s3771_total_score_of_dungeon_runs/SolutionTest.java
@@ -0,0 +1,21 @@
+package g3701_3800.s3771_total_score_of_dungeon_runs;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class SolutionTest {
+ @Test
+ void totalScore() {
+ assertThat(
+ new Solution().totalScore(11, new int[] {3, 6, 7}, new int[] {4, 2, 5}),
+ equalTo(3L));
+ }
+
+ @Test
+ void totalScore2() {
+ assertThat(
+ new Solution().totalScore(2, new int[] {10000, 1}, new int[] {1, 1}), equalTo(1L));
+ }
+}