LA 3938 "Ray, Pass me the dishes!"

本文介绍了一个关于区间最大子序列和的问题实现方案。通过构建线段树并维护最大连续和区间、最大前缀和区间及最大后缀和区间来解决该问题。文章详细展示了具体的代码实现过程。

        这题写的比较蛋疼,看着刘汝佳大神的书写的,还写了一天,真是惭愧啊,思路和书上当然是一样的,维护最大连续和的区间、最大前缀和的区间以及最大后缀和的区间就行了,但是感觉不太好写,之前写完了敲了很多测试数据也没看出错误,wa了好几次,后来实在没办法,又重头到尾扫了几遍,改了几个bug才终于A掉了。

 

#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=500010<<1;
const int maxm=500000+10;
ll sum[maxm];
int maxsubx[maxn<<1],maxsuby[maxn<<1],maxprefix[maxn<<1],maxsuffix[maxn<<1];
void PushUp(int l,int r,int rt)
{
    int m=(l+r)>>1;
    ll maxsum=sum[maxsuby[rt<<1]]-sum[maxsubx[rt<<1]-1];
    maxsubx[rt]=maxsubx[rt<<1];
    maxsuby[rt]=maxsuby[rt<<1];
    if(maxsum<sum[maxprefix[rt<<1|1]]-sum[maxsuffix[rt<<1]-1])
    {
        maxsum=sum[maxprefix[rt<<1|1]]-sum[maxsuffix[rt<<1]-1];
        maxsubx[rt]=maxsuffix[rt<<1];
        maxsuby[rt]=maxprefix[rt<<1|1];
    }
    if(maxsum<sum[maxsuby[rt<<1|1]]-sum[maxsubx[rt<<1|1]-1])
    {
        maxsum=sum[maxsuby[rt<<1|1]]-sum[maxsubx[rt<<1|1]-1];
        maxsubx[rt]=maxsubx[rt<<1|1];
        maxsuby[rt]=maxsuby[rt<<1|1];
    }
    maxsum=sum[maxprefix[rt<<1]]-sum[l-1];
    maxprefix[rt]=maxprefix[rt<<1];
    if(maxsum<sum[maxprefix[rt<<1|1]]-sum[l-1])
    {
        maxsum=sum[maxprefix[rt<<1|1]]-sum[l-1];
        maxprefix[rt]=maxprefix[rt<<1|1];
    }
    maxsum=sum[r]-sum[maxsuffix[rt<<1]-1];
    maxsuffix[rt]=maxsuffix[rt<<1];
    if(maxsum<sum[r]-sum[maxsuffix[rt<<1|1]-1])
    {
        maxsuffix[rt]=maxsuffix[rt<<1|1];
    }
    /*maxsum=sum[r]-sum[maxsuffix[rt<<1|1]-1];
    //maxsuffix[rt]=maxsuffix[rt<<1|1];
    if(maxsum<=sum[r]-sum[maxsuffix[rt<<1]-1])
    {
        maxsuffix[rt]=maxsuffix[rt<<1];
    }*/
}
void build(int l,int r,int rt)
{
    if(l==r)
    {
        maxsubx[rt]=maxsuby[rt]=l;
        maxprefix[rt]=maxsuffix[rt]=l;
        return;
    }
    int m=(l+r)>>1;
    build(l,m,rt<<1);
    build(m+1,r,rt<<1|1);
    PushUp(l,r,rt);
}
void Query(int L,int R,int l,int r,int rt,int &x,int &y,int &pre,int &suf)
{
    if(l>=L&&r<=R)
    {
        x=maxsubx[rt];
        y=maxsuby[rt];
        pre=maxprefix[rt];
        suf=maxsuffix[rt];
        return;
    }
    int xa,ya,xb,yb,pa,sa,pb,sb;
    int m=(l+r)>>1;
    if(m>=L&&m<R)
    {
        Query(L,R,l,m,rt<<1,xa,ya,pa,sa);
        Query(L,R,m+1,r,rt<<1|1,xb,yb,pb,sb);
        ll maxsum=sum[ya]-sum[xa-1];
        x=xa;y=ya;
        if(maxsum<sum[pb]-sum[sa-1])
        {
            maxsum=sum[pb]-sum[sa-1];
            x=sa;
            y=pb;
        }
        if(maxsum<sum[yb]-sum[xb-1])
        {
            maxsum=sum[yb]-sum[xb-1];
            x=xb;
            y=yb;
        }
        maxsum=sum[pa]-sum[L-1];
        pre=pa;
        if(maxsum<sum[pb]-sum[L-1])
        {
            pre=pb;
        }
        maxsum=sum[R]-sum[sa-1];
        suf=sa;
        if(maxsum<sum[R]-sum[sb-1])
        {
            suf=sb;
        }
        /*maxsum=sum[R]-sum[sb-1];
        suf=sb;
        if(maxsum<=sum[R]-sum[sa-1])
        {
            suf=sa;
        }*/
        return;
    }
    if(m>=L)
    {
        Query(L,R,l,m,rt<<1,xa,ya,pa,sa);
        x=xa;
        y=ya;
        pre=pa;
        suf=sa;
    }
    else if(m<R)
    {
        Query(L,R,m+1,r,rt<<1|1,xb,yb,pb,sb);
        x=xb;
        y=yb;
        pre=pb;
        suf=sb;
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n,m;
    int tcase=0;
    while(~scanf("%d%d",&n,&m))
    {
        tcase++;
        sum[0]=0;
        for(int i=1;i<=n;++i)
        {
            scanf("%lld",&sum[i]);
            sum[i]+=sum[i-1];
        }
        build(1,n,1);
        printf("Case %d:\n",tcase);
        int l,r,x,y,p,s;
        for(int i=0;i<m;++i)
        {
            scanf("%d%d",&l,&r);
            Query(l,r,1,n,1,x,y,p,s);
            printf("%d %d\n",x,y);
        }
    }
    return 0;
}


 

<think>我们被要求翻译单词"dishes"。在英语中,"dishes"是一个名词,通常有以下几种含义: 1. 盘子、碟子(用于盛放食物的容器) 2. 菜肴(指烹饪好的食物) 3. (用餐后需要清洗的)餐具 在中文中,根据不同的语境,翻译也会有所不同: - 当指盛放食物的容器时,翻译为“盘子”或“碟子” - 当指食物时,翻译为“菜肴”或“菜” - 当指需要清洗的餐具时,翻译为“餐具”或“要洗的盘子” 例如: - "I washed the dishes." -> "我洗了餐具。" - "The restaurant serves delicious dishes." -> "这家餐厅供应美味的菜肴。" - "She put the food on the dishes." -> "她把食物放在盘子上。" 因此,在没有上下文的情况下,我们可以给出多个翻译,但最常见的翻译是“菜肴”和“盘子”。 由于问题没有提供上下文,我将给出最常用的翻译: **翻译结果:菜肴(指食物)、盘子(指容器)** 如果是在编程中,比如一个变量名或注释,我们可能需要根据具体场景选择: - 如果是表示食物的数据,可能用“菜肴”或“菜品” - 如果是表示容器的数据,用“盘子”或“碟子” 例如,在一个餐厅管理系统中: ```python # 表示一道菜 class Dish: def __init__(self, name, price): self.name = name # 菜肴名称 self.price = price # 价格 # 表示一个盘子 class Plate: def __init__(self, size, material): self.size = size # 盘子尺寸 self.material = material # 盘子材质 ``` 所以,根据要求,我们直接给出翻译: **dishes 翻译:菜肴、盘子** §§相关问题§§: 1. 在英语中,"dish"和"plate"有什么区别? 2. 如何用日语翻译“dishes”? 3. 在餐厅管理系统的数据库中如何设计“dishes”表? 4. 有哪些与“dishes”相关的常用英语短语?</think># "dishes" 的翻译与解释 ## 基本翻译 **dishes** 在中文中有以下主要含义: | 英文 | 中文翻译 | 适用场景 | |------|----------|----------| | dishes | 菜肴、菜品 | 指各种烹饪好的食物 | | dishes | 餐具、盘子 | 指盛放食物的器皿 | | dishes | 洗碗 | 指清洗餐具的动作 | ## 不同语境下的翻译示例 ### 1. 指食物(菜肴) ```python # 餐厅菜单系统示例 menu = { "signature_dishes": ["宫保鸡丁", "麻婆豆腐", "北京烤鸭"], # 招牌菜 "vegetarian_dishes": ["清炒时蔬", "麻婆豆腐(素)", "香菇菜心"], # 素食菜肴 "spicy_dishes": ["水煮鱼", "辣子鸡", "毛血旺"] # 辣味菜品 } def recommend_dishes(spicy_level=0): """根据辣度推荐菜品""" if spicy_level == 0: return menu["vegetarian_dishes"] elif spicy_level == 1: return [dish for dish in menu["signature_dishes"] if "辣" not in dish] else: return menu["spicy_dishes"] # 输出推荐菜品 print("推荐菜品:", recommend_dishes(spicy_level=2)) ``` ### 2. 指餐具(盘子、碗碟) ```java // 餐具管理类示例 public class DishwareManager { private List<String> dishes = new ArrayList<>(); public DishwareManager() { // 初始化餐具 dishes.add("陶瓷餐盘"); dishes.add("玻璃碗"); dishes.add("不锈钢汤勺"); dishes.add("木制筷子"); } public void washDishes() { System.out.println("正在清洗餐具..."); // 清洗逻辑 } public void displayDishes() { System.out.println("可用餐具:"); for (String dish : dishes) { System.out.println("- " + dish); } } public static void main(String[] args) { DishwareManager manager = new DishwareManager(); manager.displayDishes(); manager.washDishes(); } } ``` ### 3. 指洗碗动作 ```javascript // 家庭洗碗任务调度示例 class Dishwashing { constructor() { this.dirtyDishes = []; this.cleanDishes = []; } addDirtyDish(dish) { this.dirtyDishes.push(dish); console.log(`添加了待洗的${dish}`); } wash() { if (this.dirtyDishes.length === 0) { console.log("没有需要清洗的餐具"); return; } console.log("开始洗碗..."); while (this.dirtyDishes.length > 0) { const dish = this.dirtyDishes.pop(); console.log(`清洗了: ${dish}`); this.cleanDishes.push(dish); } console.log("所有餐具已清洗完毕!"); } } // 使用示例 const myDishes = new Dishwashing(); myDishes.addDirtyDish("汤碗"); myDishes.addDirtyDish("餐盘"); myDishes.addDirtyDish("玻璃杯"); myDishes.wash(); ``` ## 常见搭配短语 | 英文短语 | 中文翻译 | 解释 | |----------|----------|------| | do the dishes | 洗碗 | 清洗餐具 | | main dish | 主菜 | 一餐中的主要菜肴 | | side dish | 配菜 | 搭配主菜的小菜 | | signature dish | 招牌菜 | 餐厅的特色菜品 | | dish out | 分发食物 | 把食物分发给众人 | | dish washer | 洗碗机 | 自动清洗餐具的设备 | ## 词源与用法说明 "dish" 源自古英语 "disc",最初指扁平的盘子或碟子。随着时间演变: 1. 引申为盘中的食物(约14世纪) 2. 再引申为洗碗的动作(19世纪) 3. 在现代英语中,复数形式 "dishes" 可指代所有餐具 在编程中,根据上下文选择合适的翻译: - 菜单系统、食谱应用 → 使用"菜肴"、"菜品" - 餐厅管理系统、库存系统 → 使用"餐具" - 家务管理应用 → 使用"洗碗"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值