首页 > 其他分享 >CSP-S 2022 T2 策略游戏题解

CSP-S 2022 T2 策略游戏题解

时间:2022-10-31 17:22:35浏览次数:57  
标签:end int 题解 T2 mid return 2022 1e9 query

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;
}

标签:end,int,题解,T2,mid,return,2022,1e9,query
From: https://www.cnblogs.com/wondering-world/p/16845059.html

相关文章

  • 2022.10.21----vscode-自定义事件
     vscode预览模式关闭,就能打开新标签页(43条消息)vscode新窗口打开文件-CSDN (43条消息)如何在vscode中打开新文件夹不覆盖上一个窗口标签_发呆的薇薇°的博客-......
  • 第四届全国大学生算法设计与编程挑战赛(秋季赛)正式赛题解
    没时间写题解了,随便写两笔吧,看不懂可以联系QQ160042137901(Easy)直接暴力枚举每个状态及其所有转移,时间复杂度\((T2^nn^2)\)。02(Easy)二分答案,用一个单调队列或者优先......
  • CSP-S 2022 游记
    初赛就不写了,\(92\text{pts}\),计数排序都不认识了是我属实想不到的。Day-1下午模拟赛爆炸了,见过类似套路的T2直接想假了挂成\(20\)。Day0上午\(\text{Vp}\)CF,一......
  • 2022-10-31 删除无法删除的文件夹or文件
    新建.txt文件,复制下面代码:DEL/F/A/Q\\?\%1RD/S/Q\\?\%1把.txt文件改名为.bat,保存。拖动该文件到你想要的文件夹or文件上面,松开鼠标。然后再删除。我试了,没用!......
  • CSP2022游寄
    初赛好像要考初赛了,是不是得刷刷题啊。完了,刷一套不会一套,\(OIer\)是电脑白痴,\(linux\)的一车命令都是啥啊,这谁会啊。阅读程序又是啥啊,他在干啥,这谁看得懂啊。正式考......
  • CSP/S 2022 游寄
    初赛HN初赛分数线好像大\(32\)分左右,通过率极高!本人弱弱的拿了\(60.5\)分(周围的同学平均分\(>80\)。)Day-1这一天晚上,我背了背dijkstra,SPFA,树链剖分等模板,就睡了......
  • 【题解】病毒检测
    Trie+dfs#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<bitset>usingnamespacestd;constintN=500007;chars[1007];int......
  • 【题解】P4683 [IOI2008] Type Printer
    题目传送门:P4683[IOI2008]TypePrinter板子题贪心+字典树+dfs贪心:把最长的字符留在最后打或者最先打把每个字母插入字典树对trie树dfs一遍#include<cstdio>#inclu......
  • CSPS2022 题解
    T1容易想到枚举\(B,C\),然后\(A,D\)可以预处理,即对于\(i\)处理存在路径\(1\rightarrowj\rightarrowi\)中\(j\)的权值最大的,那么只需枚举\(B,C\)然后分别取最......
  • CSPS2022 游记
    CSPS2022又寄在役期间的最后一次CSP,本来以为能留下一个辉煌的战绩,可惜寄了。Day-114514停课第一周没考试,看了一车没看过的算法,感觉良好。大家都停课之后每天晚上一......