T2 比 T1 简单?
可以发现,讨论的情况数不是很多。可以直接用线段树查询然后暴力讨论就好了。

(写的好丑)

#include <bits/stdc++.h>
using namespace std;
#define N 1000010
#define ll long long
#define int long long

template <class T>
inline void read(T& a){
	T x = 0, s = 1;
	char c = getchar();
	while(!isdigit(c)){ if(c == '-') s = -1; c = getchar(); }
	while(isdigit(c)){ x = x * 10 + (c ^ '0'); c = getchar(); }
	a = x * s;
	return ;
}

int a[N], b[N]; 
int n , m, Q; 

struct Segment_tree{
  struct node{
    int minn; 
    int maxn; 
    bool zero; 

    int minzheng, maxfu; 

  } t[N << 2]; 

  #define lson (o<<1)
  #define rson (o<<1|1)

  inline void pushup(int o){
    t[o].minn = min(t[lson].minn, t[rson].minn);
    t[o].maxn = max(t[lson].maxn, t[rson].maxn); 
    t[o].minzheng = min(t[lson].minzheng, t[rson].minzheng); 
    t[o].maxfu = max(t[lson].maxfu, t[rson].maxfu); 
    t[o].zero = t[lson].zero | t[rson].zero; 
    return ; 
  }

  inline void build(int o, int l, int r, int* a){
    if(l == r){
      t[o].maxn = t[o].minn = a[l];
      t[o].zero = (a[l] == 0); 
      if(a[l] > 0) t[o].minzheng = a[l];
      else t[o].minzheng = 1e9 + 100; 
      if(a[l] < 0) t[o].maxfu = a[l];
      else t[o].maxfu = -1e9 - 100; 
      return ; 
    }
    int mid = l + r >> 1;
    build(lson, l, mid, a);
    build(rson, mid + 1, r, a);
    pushup(o);
    return ; 
  }

  int query_min(int o, int l, int r, int in, int end){
    if(l > end || r < in) return 1e9 + 100; 
    if(l >= in && r <= end) return t[o].minn;
    int mid = l + r >> 1;
    return min(query_min(lson, l, mid, in, end), query_min(rson, mid + 1, r, in, end)); 
  }

  int query_max(int o, int l, int r, int in, int end){
    if(l > end || r < in) return -(1e9 + 100); 
    if(l >= in && r <= end) return t[o].maxn; 
    int mid = l + r >> 1;
    return max(query_max(lson, l, mid, in, end), query_max(rson, mid + 1, r, in, end)); 
  }

  int query_zero(int o, int l, int r, int in, int end){
    if(l > end || r < in) return 0; 
    if(l >= in && r <= end) return t[o].zero; 
    int mid = l + r >> 1; 
    return query_zero(lson, l, mid, in, end) | query_zero(rson, mid + 1, r, in, end); 
  }

  int query_minzheng(int o, int l, int r, int in, int end){
    if(l > end || r < in) return 1e9 + 100;
    if(l >= in && r <= end) return t[o].minzheng; 
    int mid = l + r >> 1;
    return min(query_minzheng(lson, l, mid, in, end), query_minzheng(rson, mid + 1, r, in, end)); 
  }

  int query_maxfu(int o, int l, int r, int in, int end){
    if(l > end || r < in) return -1e9 - 100;
    if(l >= in && r <= end) return t[o].maxfu; 
    int mid = l + r >> 1;
    return max(query_maxfu(lson, l, mid, in, end), query_maxfu(rson, mid + 1, r, in, end)); 
  }

} tree1, tree2; 

signed main(){
  // freopen("hh.txt", "r", stdin); 
  // freopen("out.txt", "w", stdout); 
  read(n), read(m), read(Q);
  for(int i = 1; i <= n; i++) read(a[i]);
  for(int i = 1; i <= m; i++) read(b[i]); 

  tree1.build(1, 1, n, a); 
  tree2.build(1, 1, m, b); 

  while(Q--){
    int l1, l2, r1, r2;
    read(l1), read(r1), read(l2), read(r2); 
    int amx = tree1.query_max(1, 1, n, l1, r1); 
    int ami = tree1.query_min(1, 1, n, l1, r1); 
    int bmi = tree2.query_min(1, 1, m, l2, r2); 
    int bmx = tree2.query_max(1, 1, m, l2, r2); 
    bool aze = tree1.query_zero(1, 1, n, l1, r1); 
    bool bze = tree2.query_zero(1, 1, m, l2, r2); 
    ll ans; 
    // 
    if(bmi >= 0){  // B全正
      if(amx <= 0) ans = amx * bmx;
      else ans = amx * bmi; 
    }
    else if(bmx <= 0){
      if(ami <= 0) ans = ami * bmx; 
      else ans = ami * bmi; 
    }
    else{ // B 有正有负
      if(ami >= 0) ans = ami * bmi; 
      else if(amx <= 0) ans = amx * bmx; 
      else{
        int amiz = tree1.query_minzheng(1, 1, n, l1, r1); 
        int amaxf = tree1.query_maxfu(1, 1, n, l1, r1); 
        if(aze) ans = 0;
        else{
          ll sum1 = amiz * bmi; 
          ll sum2 = amaxf * bmx; 
          ans = max(sum1, sum2); 
        }
      }
    }
    cout << ans << endl; 
  }

  return 0;
}

原文地址:http://www.cnblogs.com/wondering-world/p/16845059.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性