zoukankan      html  css  js  c++  java
  • LA 3938

    After doing Ray a great favor to collect sticks for Ray, Poor Neal becomes very hungry. In return for Neal's help, Ray makes a great dinner for Neal. When it is time for dinner, Ray arranges all the dishes he makes in a single line (actually this line is very long ... <tex2html_verbatim_mark>, the dishes are represented by 1, 2, 3 ... <tex2html_verbatim_mark>). ``You make me work hard and don't pay me! You refuse to teach me Latin Dance! Now it is time for you to serve me", Neal says to himself.

    Every dish has its own value represented by an integer whose absolute value is less than 1,000,000,000. Before having dinner, Neal is wondering about the total value of the dishes he will eat. So he raises many questions about the values of dishes he would have.

    For each question Neal asks, he will first write down an interval [ab] <tex2html_verbatim_mark>(inclusive) to represent all the dishes aa + 1,..., b <tex2html_verbatim_mark>, where a <tex2html_verbatim_mark>and b <tex2html_verbatim_mark>are positive integers, and then asks Ray which sequence of consecutive dishes in the interval has the most total value. Now Ray needs your help.

    Input 

    The input file contains multiple test cases. For each test case, there are two integers n <tex2html_verbatim_mark>and m <tex2html_verbatim_mark>in the first line (nm < 500000) <tex2html_verbatim_mark>. n <tex2html_verbatim_mark>is the number of dishes and m <tex2html_verbatim_mark>is the number of questions Neal asks.

    Then n <tex2html_verbatim_mark>numbers come in the second line, which are the values of the dishes from left to right. Next m <tex2html_verbatim_mark>lines are the questions and each line contains two numbers a <tex2html_verbatim_mark>, b <tex2html_verbatim_mark>as described above. Proceed to the end of the input file.

    Output 

    For each test case, output m <tex2html_verbatim_mark>lines. Each line contains two numbers, indicating the beginning position and end position of the sequence. If there are multiple solutions, output the one with the smallest beginning position. If there are still multiple solutions then, just output the one with the smallest end position. Please output the result as in the Sample Output.

    Sample Input 

    3 1 
    1 2 3 
    1 1
    

    Sample Output 

    Case 1: 
    1 1

    线段树单点更新,虽然思路很简单,但我写的丑爆了!!

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <algorithm>
      5 #include <vector>
      6 #include <assert.h>
      7 #include <queue>
      8 
      9 using namespace std;
     10 
     11 #define read() freopen("sw.in", "r", stdin)
     12 #define ls l, m, rt << 1
     13 #define rs m + 1, r, rt << 1 | 1
     14 
     15 const int MAX = 500007;
     16 const int INF = 1e9 + 7;
     17 typedef long long ll;
     18 int N, M;
     19 ll max_sub[4 * MAX], max_suffix[4 * MAX], max_prefix[4 * MAX];
     20 int id_suffix[4 * MAX], id_prefix[4 * MAX];
     21 int s[4 * MAX], e[4 * MAX];
     22 ll sum[4 * MAX];
     23 struct node {
     24         ll maxsub, maxprefix, maxsuffix , sum;
     25         int idprefix, idsuffix, ids, ide;
     26 };
     27 queue <node> q;
     28 
     29 void push_up(int rt) {
     30         sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
     31 
     32         ll t[3], id = 0;
     33         t[0] = max_sub[rt << 1];
     34         t[1] = max_suffix[rt << 1] + max_prefix[rt << 1 | 1];
     35         t[2] = max_sub[rt << 1 | 1];
     36         for (int i = 0; i <= 2; ++i) {
     37                 //printf("%d
    ", t[i]);
     38                 if (t[id] < t[i]) {
     39                         id = i;
     40 
     41                 }
     42         }
     43 
     44         //printf("id = %d
    ", id);
     45         max_sub[rt] = t[id];
     46         if (id == 0) {
     47                 s[rt] = s[rt << 1];
     48                 e[rt] = e[rt << 1];
     49         } else if (id == 1) {
     50                 s[rt] = id_suffix[rt << 1];
     51                 e[rt] = id_prefix[rt << 1 | 1];
     52         } else {
     53                 s[rt] = s[rt << 1 | 1];
     54                 e[rt] = e[rt << 1 | 1];
     55         }
     56 
     57         if (max_prefix[rt << 1] < sum[rt << 1] + max_prefix[rt << 1 | 1]) {
     58                 max_prefix[rt] = sum[rt << 1] + max_prefix[rt << 1 | 1];
     59                 id_prefix[rt] = id_prefix[rt << 1 | 1];
     60         } else {
     61                 max_prefix[rt] = max_prefix[rt << 1] ;
     62                 id_prefix[rt] = id_prefix[rt << 1];
     63         }
     64 
     65         if (max_suffix[rt << 1 | 1] <= sum[rt << 1 | 1] + max_suffix[rt << 1]) {
     66                 max_suffix[rt] = sum[rt << 1 | 1] + max_suffix[rt << 1];
     67                 id_suffix[rt] = id_suffix[rt << 1];
     68         } else {
     69                 max_suffix[rt] = max_suffix[rt << 1 | 1];
     70                 id_suffix[rt] = id_suffix[rt << 1 | 1];
     71         }
     72 
     73 
     74 
     75 }
     76 
     77 void build(int l, int r, int rt) {
     78         if (l == r) {
     79                 cin >> sum[rt];
     80                 max_sub[rt] = max_suffix[rt] = max_prefix[rt] = sum[rt];
     81                 id_suffix[rt] = id_prefix[rt] = s[rt] = e[rt] = l;
     82                 return;
     83         }
     84 
     85         int m = (l + r) >> 1;
     86         build(ls);
     87         build(rs);
     88 
     89         push_up(rt);
     90 
     91 }
     92 
     93 void query(int ql, int qr, int l, int r, int rt) {
     94         if (ql <= l && r <= qr) {
     95                 if (q.size() == 1) {
     96                         node x = q.front(), a;
     97                         ll t[3];
     98                         t[0] = x.maxsub;
     99                         t[1] = x.maxsuffix + max_prefix[rt];
    100                         t[2] = max_sub[rt];
    101                         int id = 0;
    102                         for (int i = 0; i <= 2; ++i) {
    103                                 if (t[id] < t[i]) {
    104                                         id = i;
    105                                 }
    106                         }
    107 
    108                         a.maxsub = t[id];
    109                         if (id == 0) {
    110                                 a.ids = x.ids;
    111                                 a.ide = x.ide;
    112                         } else if (id == 1) {
    113                                 a.ids = x.idsuffix;
    114                                 a.ide = id_prefix[rt];
    115                         } else {
    116                                 a.ids = s[rt];
    117                                 a.ide = e[rt];
    118                         }
    119 
    120 
    121                         if (max_prefix[rt] <= x.sum + max_prefix[rt]) {
    122                                 a.maxprefix = x.sum + max_prefix[rt];
    123                                 a.idprefix = id_prefix[rt];
    124                         } else {
    125                                 a.maxprefix = x.maxprefix;
    126                                 a.idprefix = x.idprefix;
    127                         }
    128 
    129                         if (max_suffix[rt] <= sum[rt] + x.maxsuffix) {
    130                                 a.maxsuffix = sum[rt] + x.maxsuffix;
    131                                 a.idsuffix = x.idsuffix;
    132                         } else {
    133                                 a.maxsuffix = max_suffix[rt];
    134                                 a.idsuffix = id_suffix[rt];
    135                         }
    136 
    137                         q.pop();
    138                         q.push(a);
    139                     }  else {
    140                             node a;
    141                             a.ids = s[rt]; a.ide = e[rt];
    142                             a.idprefix = id_prefix[rt]; a.idsuffix = id_suffix[rt];
    143                             a.maxprefix = max_prefix[rt]; a.maxsub = max_sub[rt];
    144                             a.maxsuffix = max_suffix[rt]; a.sum = sum[rt];
    145                             q.push(a);
    146                     }
    147 
    148 
    149         } else {
    150                 int m = (l + r) >> 1;
    151                 if (ql <= m) query(ql ,qr, ls);
    152                 if (qr > m) query(ql, qr, rs);
    153         }
    154 }
    155 
    156 int main()
    157 {
    158     //read();
    159     int ca = 1;
    160     while (~scanf("%d%d", &N, &M)) {
    161             memset(sum, 0, sizeof(sum));
    162             build(1, N, 1);
    163             printf("Case %d:
    ", ca++);
    164             for (int i = 1; i <= M; ++i) {
    165                     int l, r;
    166                     scanf("%d%d", &l, &r);
    167                     query(l, r, 1, N, 1);
    168                     node x = q.front(); q.pop();
    169                     printf("%d %d
    ", x.ids, x.ide);
    170 
    171 
    172             }
    173     }
    174 
    175     //cout << "Hello world!" << endl;
    176     return 0;
    177 }
    View Code
  • 相关阅读:
    虚拟机安装Mac OS X ----- VM12安装Mac OS X
    windows7 64位安装mysql 5.7.11 zip压缩版
    sublime text 3 + python配置,完整搭建及常用插件安装
    Windows下虚拟机安装Mac OS X ----- VM12安装Mac OS X 10.11
    myeclipse 2014新建maven web 项目步骤
    解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
    static{}语句块详解
    http状态码代表含义
    Android权限列表permission说明
    【MySQL】10条SQL优化语句,让你的MySQL数据库跑得更快!
  • 原文地址:https://www.cnblogs.com/hyxsolitude/p/3856521.html
Copyright © 2011-2022 走看看