很远古的一道题,当时打的跟(*机房和谐*)一样,后来用$ O(q*n) $的算法卡到了T75

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<cstring>
 6 #define ll long long
 7 #define m(a) memset(a,0,sizeof(a))
 8 using namespace std;
 9 const int maxn=1e5+100;
10 int ans,x,y,w,n,m,a[maxn],l,r,z;
11 int main()
12 {
13     scanf("%d%d",&n,&m);
14     for(register int i=1;i<=n;i++) scanf("%d",&a[i]);
15     for(register int i=1;i<=m;++i)
16     {
17         scanf("%d%d",&x,&y);
18         l=r=w=0;
19         ans=-1e5;
20         z=x;
21         for(register int j=x;j<=y;++j)
22         {
23             w+=a[j];
24             if(w>ans)
25             {
26                 ans=w;
27                 l=z;
28                 r=j;
29             }
30             if(w<0)
31             {
32                 z=j+1;
33                 w=0;
34             }
35         }
36         printf("%d %d %d\n",l,r,ans);
37     }
38     return 0;
39 }

TLE75

现在打起来这个题是真的简单(虽然我早在4月份已经颓了题解)

首先维护4个w,3个x,3个y,分别代表:

(尖括号代表从哪里转移过来)

(0):左段最大值以及其左右端点

1>w[ls][0]

2>w[ls][3]+w[rs][0]

(1):中间最大值以及其左右端点

1>w[ls][1]

2>w[rs][1]

3>w[ls][2]+w[rs][0]

(2):右段最大值以及其左右端点

1>w[rs][2]

2>w[rs][3]+w[ls][2]

(3):整段的最大值。

1>w[ls][3]+w[rs][3]

因为要输出最小字典序,所以某些最大值相等的情况要考虑字典序的问题

否则会WA88(可能WA0?)

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int N=1e5+10;
  4 int n,m,f[N];
  5 struct Tree{int l,r,x[3],y[3],w[4];}a[N*4];
  6 int read()
  7 {
  8         int sum,k=1;char s;
  9         while(s=getchar(),s<'0'||s>'9')if(s=='-')k=-1;sum=s-'0';
 10         while(s=getchar(),s>='0'&&s<='9') sum=sum*10+s-'0';
 11         return k*sum;
 12 }
 13 void merge(int k,Tree ls,Tree rs)
 14 {
 15         if(ls.w[0]>=ls.w[3]+rs.w[0])
 16         {
 17                 a[k].w[0]=ls.w[0];
 18                 a[k].x[0]=ls.x[0];
 19                 a[k].y[0]=ls.y[0];
 20         }
 21         else
 22         {
 23                 a[k].w[0]=ls.w[3]+rs.w[0];
 24                 a[k].x[0]=ls.x[0];
 25                 a[k].y[0]=rs.y[0];
 26         }
 27         if(ls.w[2]+rs.w[0]>ls.w[1]||(ls.w[2]+rs.w[0]==ls.w[1]&&ls.x[2]<ls.x[1]))
 28         {
 29                 if(ls.w[2]+rs.w[0]>=rs.w[1])
 30                 {
 31                         a[k].w[1]=ls.w[2]+rs.w[0];
 32                         a[k].x[1]=ls.x[2];
 33                         a[k].y[1]=rs.y[0];
 34                 }
 35                 else
 36                 {
 37                         a[k].w[1]=rs.w[1];
 38                         a[k].x[1]=rs.x[1];
 39                         a[k].y[1]=rs.y[1];
 40                 }
 41         }
 42         else
 43         {
 44                 if(ls.w[1]>=rs.w[1])
 45                 {
 46                         a[k].w[1]=ls.w[1];
 47                         a[k].x[1]=ls.x[1];
 48                         a[k].y[1]=ls.y[1];
 49                 }
 50                 else
 51                 {
 52                         a[k].w[1]=rs.w[1];
 53                         a[k].x[1]=rs.x[1];
 54                         a[k].y[1]=rs.y[1];
 55                 }
 56         }
 57         if(ls.w[2]+rs.w[3]>=rs.w[2])
 58         {
 59                 a[k].w[2]=ls.w[2]+rs.w[3];
 60                 a[k].x[2]=ls.x[2];
 61                 a[k].y[2]=rs.y[3];
 62         }
 63         else
 64         {
 65                 a[k].w[2]=rs.w[2];
 66                 a[k].x[2]=rs.x[2];
 67                 a[k].y[2]=rs.y[2];
 68         }
 69         a[k].w[3]=ls.w[3]+rs.w[3];
 70 }
 71 void build(int k,int l,int r)
 72 {
 73         a[k].l=l;a[k].r=r;
 74         if(l==r)
 75         {
 76                 a[k].x[0]=a[k].x[1]=a[k].x[2]=l;
 77                 a[k].y[0]=a[k].y[1]=a[k].y[2]=l;
 78                 a[k].w[0]=a[k].w[1]=a[k].w[2]=a[k].w[3]=f[l];
 79                 return;
 80         }
 81         int mid=(l+r)>>1;
 82         build(k<<1,l,mid);
 83         build(k<<1|1,mid+1,r);
 84         merge(k,a[k<<1],a[k<<1|1]);
 85 }
 86 Tree query(int k,int l,int r)
 87 {
 88         if(a[k].l>=l&&a[k].r<=r) return a[k];
 89         int mid=(a[k].l+a[k].r)>>1;
 90         Tree X,Y;
 91         if(l<=mid) X=query(k<<1,l,r);
 92         if(r>mid) Y=query(k<<1|1,l,r);
 93         if(l<=mid&&r>mid)
 94         {
 95                 merge(0,X,Y);
 96                 return a[0];
 97         }
 98         else if(l<=mid) return X;
 99         else return Y;
100 }
101 signed main()
102 {
103         //freopen("1.in","r",stdin);
104         //freopen("1.out","w",stdout);
105         n=read();m=read();
106         for(int i=1;i<=n;i++) f[i]=read();
107         build(1,1,n);
108         for(int i=1,x,y,ans,l,r;i<=m;i++)
109         {
110                 x=read();y=read();
111                 Tree S=query(1,x,y);
112                 ans=max(S.w[0],max(S.w[1],S.w[2]));
113                 if(S.w[0]>=S.w[1])
114                 {
115                         if(S.w[0]>=S.w[2]) l=S.x[0],r=S.y[0];
116                         else l=S.x[2],r=S.y[2];
117                 }
118                 else
119                 {
120                         if(S.w[1]>=S.w[2]) l=S.x[1],r=S.y[1];
121                         else l=S.x[2],r=S.y[2];
122                 }
123                 printf("%d %d %d\n",l,r,ans);
124         }
125         return 0;
126 }

AC

转载于:https://www.cnblogs.com/AthosD/articles/11396561.html

[COGS755]山海经相关推荐

  1. 微信小程序打开红包的css_山海经攻略(微信小程序现金红包提现游戏)

    扫码进入小程序按照系统提示操作就可以获得0.3元红包,可以直接提现到微信账户. 一.山海经异变收入来源有三种 1.每升一级大概有一元的红包,满50元提现 2.获得分红神兽,分红神兽有四种,分别是神兽鸿 ...

  2. 山海经鸿蒙手游iOS 版本,山海经鸿蒙异兽iOS版

    山海经鸿蒙异兽iOS版是一款非常好玩的玄幻武侠游戏,游戏里加入了更多的远古巨兽,玩家们可以驯服来做自己的神宠,游戏的战斗场面非常的热血刺激,远古巨兽之争,到底谁是最后的王者?山海经鸿蒙异兽最新版给你一 ...

  3. 超神线段树 山海经

    问题 K: 山海经 时间限制: 1 Sec  内存限制: 128 MB 题目描述 "南山之首日鹊山.其首日招摇之山,临于西海之上,多桂,多金玉.有草焉,其状如韭而青华,其名日祝余,食之不饥- ...

  4. 除了鸿蒙还注册,除了“华为鸿蒙”,你不知道的是,整本山海经都被华为注册了...

    除了"华为鸿蒙",你不知道的是,整本山海经都被华为注册了 2019-05-25 19:06:37 在被列入"实体名单"后,华为面临很多协作商中止事务来往.中止供 ...

  5. 华为真的注册鸿蒙,“鸿蒙”真的来了!华为注册了整本山海经?

    5月24日消息,国家知识产权局商标局网站显示,华为已经申请注册"华为鸿蒙"商标,并标注该商品可用于操作系统程序. 图自国家知识产权局商标局网站 这条新闻一出,国内许多网友都是兴奋又 ...

  6. 还原《山海经》中的东方奇幻世界,这款手游是怎么做到的?

    筹备超3年.预约量破300万的回合制RPG手游<山海镜花>开启全平台公测,上线前10天,该游戏始终位于App Store免费榜榜首,总下载量超过500万次. <山海镜花>取得如 ...

  7. 有生之年必看!千古第一奇书《山海经》到底是怎样的一本书?

    ▲点击查看 提到<山海经>,大家应该都耳熟能详. 作为一部富有神话色彩的千古奇书,它记载了各种脍炙人口的神话传说,像女娲造人.夸父逐日.羿射九日.精卫填海.大禹治水--都是从这里诞生的. ...

  8. 华为注册鸿蒙商标与三海经,华为注册了一本《山海经》?除了鸿蒙商标,还有很多...

    原标题:华为注册了一本<山海经>?除了鸿蒙商标,还有很多 5月25日消息 昨天IT之家报道, 国家知识产权商标局网站显示,,适用于第9类别和第42类别.申请日期为2018年8月24日. 此 ...

  9. 华为鸿蒙山海,华为包圆了整部《山海经》,鸿蒙是何意?还有青龙白虎朱雀玄武?...

    华为已经申请注册"华为鸿蒙"商标 并标注该商品可用于操作系统程序 鸿蒙 一个自带书香气的名字 一听就是文化人! 一听就是中华文化传承人! 那么 鸿蒙是啥意思 鸿蒙就是一团气 不是普 ...

  10. 人工智能 量子力学 时间简史 山海经 三体

    12堂给孩子的人工智能原理课,轻松了解自然语言处理和机器视觉 12堂给孩子的人工智能原理课,轻松了解自然语言处理和机器视觉_哔哩哔哩_bilibili 不愧是价值26980的[Python人工智能]全 ...

最新文章

  1. 五分钟体验分布式调度框架xxl-job
  2. 提交请求输出XML文件的时候出错.解决方法
  3. WebDriver介绍
  4. poj1423---求一个大数的位数方法,我猜网站上统计输入字符少于多少位的那个算法...
  5. two pointers(双指针思想)
  6. windows下生成ssh key详解
  7. redhat oracle环境变量配置文件,Redhat7.2(7.1)下oracle8.17的安装手册-数据库专栏,ORACLE...
  8. web前端需要学习什么?
  9. Redis(服务端/客户端)的启动、关闭、查看状态
  10. 3. 剪辑入门--电影混剪 (1)
  11. 动手学Android之六——布局初步(三)
  12. 向量叉乘求三维空间中两直线(或线段)的交点
  13. 报班太贵,刷题太累?讯飞智能学习机提出A.I.新“疗法”
  14. R语言使用quantmod包的getSymbols函数从指定金融数据源获取指定时间段的股票数据、美股不使用后缀、其它股票需要使用后缀:大陆沪市使用:“.SS“,深市使用:“.SZ“,香港使用:“.HK
  15. win7快捷键Ctrl+Alt+↑或者↓ 屏幕倒过来了
  16. 腾讯AI Lab赠票 | 相约腾讯全球合作伙伴大会,南京见!
  17. 有关兰州IOC项目 对接华为北向IOT-消息订阅模块的Demo编写以及验证梳理(陈晓阳)
  18. 曲线绕y轴旋转一周所得旋转体体积_由曲线y=x,x=1,x=2,x轴围成的图形绕x轴旋转一周所得旋转体的体积是______.-数学-魔方格...
  19. 长春五年制大专计算机学校排名,2018中国最好的五年制大专排名 最新排行名单公布...
  20. 鼻纹识别,让AI寻宠照进现实

热门文章

  1. 捋一捋这些我记不清的python概念
  2. org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is jav
  3. 联想台式电脑修复计算机,处理联想一键恢复电脑系统教程
  4. IntelliJ IDEA 2019 配置PHP开发环境
  5. 【Node.js 微信公众号实战】4.Node.js 微信消息管理
  6. 常用控件的使用有哪些?如何操作控件?
  7. android sd卡数据恢复软件下载,内存卡数据恢复
  8. Premiere cs6导出MP4格式视频
  9. Qt表格分页,跳转,首尾页
  10. 交叉编译openssl