T​o​m​c​a​t​ ​登​陆​问​题​ 创​建​用​户​名​密​码

本文介绍如何通过修改Tomcat的tomcat-users.xml文件来设置不同用户的访问权限,并提供了具体的XML配置示例。按照示例配置完成后,重启Tomcat即可使用指定的用户名和密码进行登录。
问题修改:将conf文件夹下 tomcat-users.xml  文件内容改为

<?xml version='1.0' encoding='utf-8'?>

<tomcat-users><role rolename="tomcat"/><role rolename="role1"/>

<role rolename="manager"/>

<role rolename="admin"/>

<user username="admin" password="admin" roles="admin,manager"/>

<user username="tomcat" password="tomcat" roles="tomcat"/>

<user username="role1" password="tomcat" roles="role1"/>

<user username="both" password="tomcat" roles="tomcat,role1"/> </tomcat-users>

重新启动Tomcat ,在登录时使用 用户名admin 密码 admin 登录即可
<think>我们考虑凸包斜率单调递增的情况(即相邻点连线的斜率递增)。目标是找到第一个满足 $\frac{Y_j - Y_{j-1}}{X_j - X_{j-1}} \geq A(i)$ 的点 $j$,并确定其左端点(即 $j-1$)为最优决策点。注意,这里我们假设凸包上的点按照 $X$ 坐标递增排列(通常 $B(j)$ 是单调的,所以 $X_j$ 也是单调的)。 ### 步骤详解 1. **凸包维护**: - 我们维护一个下凸包(因为是最小化),凸包中的点按照 $X$ 坐标递增排列,且相邻点之间的斜率递增。 - 凸包通常用单调队列(双端队列)来存储点的下标(比如 $j$)。 2. **寻找最优决策点**: - 由于凸包斜率递增,且 $A(i)$ 可能是单调的(比如递增),我们可以通过比较斜率 $A(i)$ 与凸包上相邻点之间的斜率来快速定位。 - 具体操作:在单调队列中,从队首开始,检查相邻两点(队首的两个点)的斜率是否小于 $A(i)$,即判断 $\frac{Y_{q[front+1]} - Y_{q[front]}}{X_{q[front+1]} - X_{q[front]}} \leq A(i)$(注意:这里我们假设队列中存储的点下标为 $q$,队首索引为 `front`,下一个为 `front+1`)。 - 如果上述不等式成立,说明队首的点不是最优的(因为斜率更小的线段不会成为当前 $A(i)$ 的最优解),因此我们可以将队首的点出队(因为 $A(i)$ 递增,后续也不可能再用到这个点)。 - 重复上述过程,直到队首两个点组成的斜率大于 $A(i)$,此时队首的点 $j$ 就是我们要找的第一个满足 $\frac{Y_j - Y_{j-1}}{X_j - X_{j-1}} \geq A(i)$ 的点的前一个点(即左端点)。注意:实际上我们队列中存储的是凸包上的点,当我们从队首不断弹出斜率小于等于 $A(i)$ 的点后,队首的点就是最优决策点。 但是,这里有一个细节:我们通常比较的是相邻两点的斜率,而最优决策点实际上是第一个斜率大于等于 $A(i)$ 的线段的前一个点。例如,假设凸包上有三个点 $j-1, j, j+1$,斜率分别为 $k_1 = \frac{Y_j - Y_{j-1}}{X_j - X_{j-1}}$ 和 $k_2 = \frac{Y_{j+1} - Y_j}{X_{j+1} - X_j}$,且 $k_1 < A(i) \leq k_2$。那么点 $j$ 就是最优决策点吗?不是,因为点 $j-1$ 到点 $j$ 的斜率小于 $A(i)$,而点 $j$ 到点 $j+1$ 的斜率大于等于 $A(i)$,那么点 $j$ 就是我们要找的第一个满足斜率大于等于 $A(i)$ 的线段的前一个点?实际上,最优决策点应该是点 $j$,因为当我们从点 $j$ 到点 $j+1$ 的斜率大于等于 $A(i)$ 时,意味着点 $j$ 比点 $j+1$ 更早被考虑,且点 $j$ 是最后一个斜率小于 $A(i)$ 的线段后面的点,即点 $j$ 是凸包上第一个使得斜率大于等于 $A(i)$ 的线段的左端点。 然而,在单调队列中,我们通常将队首作为最优决策点。具体操作是:我们不断弹出队首直到队列中只剩一个点或者队首两点之间的斜率大于 $A(i)$,那么此时队首的点就是最优决策点。 因此,更准确地说,我们寻找的是满足凸包上相邻两点斜率大于 $A(i)$ 的第一个线段的左端点。而由于我们维护的凸包斜率递增,所以当 $A(i)$ 递增时,我们可以用单调队列从队首弹出斜率小于等于 $A(i)$ 的点,然后队首的点就是最优决策点。 例如,队列中点的下标为:$q_0, q_1, q_2, \dots, q_t$(队首在左,队尾在右),相邻两点斜率 $k_0, k_1, \dots$ 递增。对于当前 $A(i)$,我们弹出队首直到 $k_0 > A(i)$,那么 $q_0$ 就是最优决策点。注意:这里我们弹出的是斜率小于等于 $A(i)$ 的点,所以剩下的队首 $q_0$ 满足:它和下一个点 $q_1$ 的斜率 $k_0 > A(i)$,而 $q_0$ 本身作为线段的左端点,就是最优决策点。 所以,实际上我们并不需要显式地找到第一个满足 $\frac{Y_j - Y_{j-1}}{X_j - X_{j-1}} \geq A(i)$ 的点 $j$,而是通过弹出斜率小于等于 $A(i)$ 的点,使得队首的点就是最优决策点(即左端点)。 3. **算法步骤**($A(i)$ 递增的情况): - 初始化单调队列(双端队列),将初始决策点加入队列(比如下标0)。 - 遍历 $i$ 从1到n: 1. 检查队首,如果队列中至少有两个点,设队首为 $q_f$,下一个为 $q_{f+1}$,计算斜率 $k = \frac{Y_{q_{f+1}} - Y_{q_f}}{X_{q_{f+1}} - X_{q_f}}$。如果 $k \leq A(i)$,则弹出队首,重复直到队列中只剩一个点或者 $k > A(i)$。 2. 此时队首 $j = q_f$ 即为最优决策点,计算 $dp[i] = Y_j - A(i) \cdot X_j + C(i)$(注意:这里 $Y_j = dp[j] + D(j)$,而原方程形式为 $dp[i] = dp[j] + A(i) \cdot B(j) + C(i)$,所以变形后为 $dp[i] = (Y_j - D(j)) + A(i) \cdot B(j) + C(i)$,但通常我们通过变形已经将 $D(j)$ 包含在 $Y_j$ 中,所以直接使用 $Y_j - A(i) \cdot X_j$ 再加上 $C(i)$ 即可,具体需根据变形方程)。 3. 将当前点 $i$ 对应的点 $(X_i, Y_i)$ 加入凸包。加入时,为了维护凸包斜率递增,需要从队尾开始,检查队尾两个点与 $i$ 形成的斜率是否破坏了凸性(即是否不再满足斜率递增)。具体操作:设队尾两个点为 $q_{t-1}, q_t$,当前点为 $i$,计算斜率 $k_1 = \frac{Y_i - Y_{q_t}}{X_i - X_{q_t}}$,$k_2 = \frac{Y_{q_t} - Y_{q_{t-1}}}{X_{q_t} - X_{q_{t-1}}}$。如果 $k_1 \leq k_2$(即新加入的点导致凸性被破坏,不再是下凸包),则弹出队尾,重复直到满足凸性或者队列中少于两个点,然后将 $i$ 加入队尾。 4. **为什么最优决策点是队首**: - 在凸包中,最优决策点就是使得直线 $y = A(i)x + b$ 的截距 $b$ 最小的点(即与直线相切的点)。由于凸包斜率递增,且 $A(i)$ 递增,那么随着 $A(i)$ 增大,切点会向右移动。因此,我们通过弹出斜率小于等于 $A(i)$ 的点,使得队首的点恰好是当前 $A(i)$ 对应的切点(即最优决策点)[^1][^2]。 ### 示例说明 假设我们有状态转移方程:$dp[i] = \min_{j < i} \{ dp[j] + (i-j)^2 \}$,其中 $i \geq 1$,且 $dp[0]=0$。 我们可以将其变形:$dp[i] = \min_{j < i} \{ dp[j] + i^2 - 2ij + j^2 \} = i^2 + \min_{j < i} \{ dp[j] + j^2 - 2ij \}$。 因此,令: - $A(i) = 2i$(斜率,单调递增) - $B(j) = j$($X_j$) - $Y_j = dp[j] + j^2$ - $C(i) = i^2$ 那么方程变为:$dp[i] = C(i) + \min_{j < i} \{ Y_j - A(i) \cdot B(j) \}$。 我们需要维护点 $(B(j), Y_j) = (j, dp[j]+j^2)$ 的下凸包。 **步骤**: - 初始化:队列 `q`,加入点0($j=0$,$B(0)=0, Y_0=0$)。 - 循环 $i$ 从1开始: 1. 检查队首:队列中有0,若 $i=1$,队列只有一个点,所以队首就是0。 2. 计算 $dp[1] = 1^2 + (Y_0 - 2*1*0) = 1 + (0 - 0) = 1$。 3. 将 $i=1$ 加入队列:点 $(1, dp[1]+1^2=1+1=2)$。加入前,检查凸性:队列中原有0和1,计算斜率:$k = (2-0)/(1-0)=2$,只有一个线段,所以加入。 4. $i=2$:首先检查队首两个点(0和1)的斜率:$k=2$,当前 $A(2)=4$,因为 $2 \leq 4$,所以弹出队首0。现在队首只剩1。 5. 计算 $dp[2] = 2^2 + (Y_1 - 4 \cdot 1) = 4 + (2 - 4) = 2$。 6. 将 $i=2$ 加入队列:点 $(2, dp[2]+2^2=2+4=6)$。加入前,计算队尾两个点(1和2)的斜率:$k_1 = (6-2)/(2-1)=4$,而之前队列中只有一个点(1),所以直接加入。现在队列中有1和2。 7. $i=3$:检查队首两个点(1和2)的斜率:$k=4$,$A(3)=6$,因为 $4 \leq 6$,弹出队首1。队列中只剩2。 8. 计算 $dp[3]=3^2 + (Y_2 - 6 \cdot 2) = 9 + (6 - 12) = 3$。 结果:$dp[1]=1, dp[2]=2, dp[3]=3$,符合预期(因为最优决策是连续选择,即每个点自己一段)。 ### 注意事项 - **除零**:当 $X_j = X_{j-1}$ 时,斜率无定义。因此,在实现中,如果 $X$ 坐标可能相等,需要特判:如果 $X_{j}=X_{j-1}$,那么当 $Y_j \geq Y_{j-1}$ 时,我们可以忽略 $j-1$(因为凸包中保留 $j$ 更好);反之则忽略 $j$。 - **精度**:斜率比较时,浮点数可能有精度误差,可以转化为乘法形式:比较 $\frac{Y_a-Y_b}{X_a-X_b} \geq \frac{Y_c-Y_d}{X_c-X_d}$ 可以转化为 $(Y_a-Y_b)(X_c-X_d) \geq (Y_c-Y_d)(X_a-X_b)$(注意符号,当分母为负时要变号,所以通常要求 $X$ 是单调的,且分母为正,即 $X$ 递增)。 ### 总结 在凸包斜率单调递增的条件下,通过单调队列维护下凸包,并在队首不断弹出斜率小于等于 $A(i)$ 的点,最终队首的点即为最优决策点[^1][^2]。 §§相关§§ 1. 斜率优化中,如果 $X$ 坐标不单调,如何维护凸包? 2. 当 $A(i)$ 不是单调递增时,如何优化决策点的查找? 3. 如何避免斜率优化中的除零错误和精度? 4. 能否举例说明斜率优化在最大值中的应用? 5. 斜率优化和四边形不等式优化在解决动态规划时有何异同?</think>在凸包斜率单调递增的条件下(即相邻点连线斜率递增),寻找第一个满足 $\frac{Y_j - Y_{j-1}}{X_j - X_{j-1}} \geq A(i)$ 的点 $j$ 并确定最优决策点的步骤如下: --- ### 一、核心原理 1. **凸包性质**: 维护下凸包(最小值),其中决策点按 $X$ 坐标递增排列,且相邻点斜率满足 **单调递增**: $$ k_1 < k_2 < \cdots < k_m \quad \text{($k_i$ 为相邻点斜率)} $$ 2. **最优决策点条件**: 最优决策点 $j^*$ 是凸包上第一个满足 **斜率 $\geq A(i)$** 的线段左端点,即: $$ \frac{Y_j - Y_{j-1}}{X_j - X_{j-1}} \geq A(i) $$ 此时 $j-1$ 即为最优决策点(图中切点位置)[^1][^2]。 --- ### 二、实现步骤($A(i)$ 单调递增时) #### 1. 维护单调队列 - **队列结构**:双端队列存储决策点下标(按 $X$ 坐标递增) - **凸包维护**:插入新点时,从队尾淘汰破坏下凸性的点(斜率不递增) ```python while len(queue) >= 2: # 取队尾两点 (j1, j2) 和新点 i j1 = queue[-2]; j2 = queue[-1] k_old = (Y[j2] - Y[j1]) / (X[j2] - X[j1]) # 原斜率 k_new = (Y[i] - Y[j2]) / (X[i] - X[j2]) # 新斜率 if k_new >= k_old: break # 满足凸性则停止 queue.pop() # 否则淘汰 j2 queue.append(i) # 插入新点 ``` #### 2. 查找最优决策点 - **从队首淘汰**:删除斜率 $\leq A(i)$ 的点(因其不会更优) ```python while len(queue) >= 2: j1 = queue[0]; j2 = queue[1] k = (Y[j2] - Y[j1]) / (X[j2] - X[j1]) # 队首两点斜率 if k > A(i): break # 斜率 > A(i) 时停止 queue.popleft() # 否则淘汰队首 j_opt = queue[0] # 剩余队首即最优决策点 ``` - **几何解释**: $A(i)$ 增大时,切点右移,淘汰斜率小的线段[^1][^2]: ![](https://oi-wiki.org/dp/images/optimization.svg) #### 3. 状态转移 $$ dp[i] = Y_{j_{opt}} - A(i) \cdot X_{j_{opt}} + C(i) $$ --- ### 三、关键证明 **定理**:队首点 $j$ 是最优决策点当且仅当: $$ \frac{Y_j - Y_{j-1}}{X_j - X_{j-1}} < A(i) \leq \frac{Y_{j+1} - Y_j}{X_{j+1} - X_j} $$ **推导**: 1. 斜率 $k_j = \frac{Y_j - Y_{j-1}}{X_j - X_{j-1}}$ 递增 2. 若 $A(i) \leq k_j$,则 $j-1$ 优于 $j$(需淘汰 $j$) 3. 若 $A(i) > k_j$ 但 $A(i) \leq k_{j+1}$,则 $j$ 是当前切点 > 因此淘汰所有满足 $k \leq A(i)$ 的点后,队首即最优决策点[^1][^2]。 --- ### 四、复杂度分析 - **时间复杂度**:$O(n)$ 每个点最多入队/出队一次 - **空间复杂度**:$O(n)$ 单调队列存储决策点 --- ### 五、注意事项 1. **避免除零**: 当 $X_j = X_{j-1}$ 时,直接比较 $Y$ 值: ```python if X[j] == X[k]: return Y[j] < Y[k] # 取 Y 更小的点 ``` 2. **精度优化**: 用乘法代替除法(防止浮点误差): ```python # 比较斜率 k1 <= k2 转化为: (Y[j2] - Y[j1]) * (X[j3] - X[j2]) <= (Y[j3] - Y[j2]) * (X[j2] - X[j1]) ``` > **提示**:实际应用中,若 $A(i)$ 非单调,需在凸包上二分查找($O(\log n)$)[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值