首页 > 其他分享 >2024/10/24 模拟赛总结

2024/10/24 模拟赛总结

时间:2024-10-24 16:31:15浏览次数:1  
标签:24 10 qr return int LL kMaxN 2024 ql

\(100+60+60+40=260\),这种信心赛没 AK 我真的要退役了

#A. 长方体

喜欢写线段树和 ST 表的小朋友们你们好呀,我是前后缀 \(\min/\max\) 奥特曼

对于 \(n\) 个长方体的交,显然就是最靠右的左面、最靠左的右面、最靠上的下面……组成的长方体

枚举一个不存在的长方体

接下来考虑容斥,对于被且仅被 \(n-1\) 个长方体包含的点,一定为被这 \(n-1\) 个长方体包含的所有点,减去被所有 \(n\) 个长方体包含的点,证明显然

不要问为什么有结构体,因为最开始也写了线段树

// BLuemoon_
#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int kMaxN = 1e5 + 5;

struct P {
  LL x, y, z;
} a[kMaxN][2];

int n;
LL ans, u, d, f, b, l, r, cnt, cur;

struct PreSuf {
  LL pu[kMaxN], pd[kMaxN], pf[kMaxN], pb[kMaxN], pl[kMaxN], pr[kMaxN], su[kMaxN], sd[kMaxN], sf[kMaxN], sb[kMaxN], sl[kMaxN], sr[kMaxN];
  void Init(int n) { pu[0] = su[n + 1] = pb[0] = sb[n + 1] = pr[0] = sr[n + 1] = 1e18, pd[0] = sd[n + 1] = pf[0] = sf[n + 1] = pl[0] = sl[n + 1] = -1e18; }
  void build(int n) {
    for (int i = 1; i <= n; i++) {
      pu[i] = min(pu[i - 1], a[i][1].z);
      pb[i] = min(pb[i - 1], a[i][1].y);
      pr[i] = min(pr[i - 1], a[i][1].x);
      pd[i] = max(pd[i - 1], a[i][0].z);
      pf[i] = max(pf[i - 1], a[i][0].y);
      pl[i] = max(pl[i - 1], a[i][0].x);
    }
    for (int i = n; i; i--) {
      su[i] = min(su[i + 1], a[i][1].z);
      sb[i] = min(sb[i + 1], a[i][1].y);
      sr[i] = min(sr[i + 1], a[i][1].x);
      sd[i] = max(sd[i + 1], a[i][0].z);
      sf[i] = max(sf[i + 1], a[i][0].y);
      sl[i] = max(sl[i + 1], a[i][0].x);
    }
  }
  LL queryu(int ql, int qr) {
    if (ql > qr) {
      return 1e18;
    }
    return ql == 1 ? pu[qr] : su[ql];
  }
  LL queryd(int ql, int qr) {
    if (ql > qr) {
      return -1e18;
    }
    return ql == 1 ? pd[qr] : sd[ql];
  }
  LL queryb(int ql, int qr) {
    if (ql > qr) {
      return 1e18;
    }
    return ql == 1 ? pb[qr] : sb[ql];
  }
  LL queryf(int ql, int qr) {
    if (ql > qr) {
      return -1e18;
    }
    return ql == 1 ? pf[qr] : sf[ql];
  }
  LL queryr(int ql, int qr) {
    if (ql > qr) {
      return 1e18;
    }
    return ql == 1 ? pr[qr] : sr[ql];
  }
  LL queryl(int ql, int qr) {
    if (ql > qr) {
      return -1e18;
    }
    return ql == 1 ? pl[qr] : sl[ql];
  }
} tr;

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  freopen("cube.in", "r", stdin), freopen("cube.out", "w", stdout);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i][0].x >> a[i][0].y >> a[i][0].z >> a[i][1].x >> a[i][1].y >> a[i][1].z;
  }
  tr.Init(n), tr.build(n), u = tr.queryu(1, n), d = tr.queryd(1, n), f = tr.queryf(1, n), b = tr.queryb(1, n), l = tr.queryl(1, n), r = tr.queryr(1, n);
  ans = cnt = max(u - d + 1, 0ll) * max(r - l + 1, 0ll) * max(b - f + 1, 0ll);
  for (int i = 1; i <= n; i++) {
    u = min(tr.queryu(1, i - 1), tr.queryu(i + 1, n));
    d = max(tr.queryd(1, i - 1), tr.queryd(i + 1, n));
    b = min(tr.queryb(1, i - 1), tr.queryb(i + 1, n));
    f = max(tr.queryf(1, i - 1), tr.queryf(i + 1, n));
    r = min(tr.queryr(1, i - 1), tr.queryr(i + 1, n));
    l = max(tr.queryl(1, i - 1), tr.queryl(i + 1, n));
    cur = max(u - d + 1, 0ll) * max(r - l + 1, 0ll) * max(b - f + 1, 0ll);
    ans += cur - cnt;
  }
  cout << ans << '\n';
  return 0;
}

#B. 三角形

这种见过的题没有一眼秒,我这是怎么了

考虑 No 的情况为:排序后,任意相邻两项的和都小于后面一项,于是可以想到斐波那契数列

一个不合法数列的极限即为 \(1,1,2,3,5,8,\dots\),在 \(a_i\le 10^{18}\) 时,其长度大约为 \(100\),于是可以在 \(r-l+1\ge 100\) 时可以直接输出 Yes,否则直接排序暴力判断

// BLuemoon_
#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int kMaxN = 1e5 + 5;

int n, m, l, r;
bool ans;
LL a[kMaxN], f[kMaxN];

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  freopen("triangle.in", "r", stdin), freopen("triangle.out", "w", stdout);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  for (; m; m--, ans = 0) {
    cin >> l >> r;
    if (r - l + 1 >= 100) {
      cout << "Yes\n";
      continue;
    }
    for (int i = 1; i <= r - l + 1; i++) {
      f[i] = a[i + l - 1];
    }
    sort(f + 1, f + r - l + 2);
    for (int i = 1; i < r - l; i++) {
      if (f[i] + f[i + 1] > f[i + 2]) {
        ans = 1;
        break;
      }
    }
    cout << (ans ? "Yes" : "No") << '\n';
  }
  return 0;
}

#C. 区间

发现 \(l\) 单调不减,可以理解为一个长度为 \(m\) 的窗口向右滑,于是可以开一个反转标记,在左右有数弹入弹出式根据反转标记更新即可

// BLuemoon_
#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 1e6 + 5;

int n, m, qtot, a[kMaxN], op, l, ans, cur = 1, q[kMaxN << 1], hd = 1e6 + 2;
bool f;

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  freopen("section.in", "r", stdin), freopen("section.out", "w", stdout);
  cin >> n >> m >> qtot;
  for (int i = 1; i <= n; i++) {
    cin >> a[i], i <= m && (q[hd + i - 1] = a[i]);
  }
  for (; qtot; qtot--) {
    cin >> op >> l;
    if (op == 2) {
      if (l < cur || l >= cur + m) {
        ans ^= a[l];
      } else {
        if (f) {
          ans ^= q[hd + m - 1 - l + cur];
        } else {
          ans ^= q[hd + l - cur];
        }
      }
    } else {
      for (; cur < l; cur++) {
        f ? (--hd, a[cur] = q[hd + m], q[hd] = a[cur + m]) : (a[cur] = q[hd], q[hd + m] = a[cur + m], hd++);
      }
      f ^= 1;
    }
  }
  cout << ans << '\n';
  return 0;
}

#D. 图

看到 \(n \le 1000\),一眼暴力建图跑最大生成树,但是边权需要注意,将两点的边权设置成点权之和,然后将答案初始值设为所有点权和的相反数,这样在连边时,父亲的点权会算上,自己的负点权会被抵消

// BLuemoon_
#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int kMaxN = 1e3 + 5;

int n, a[kMaxN], d[kMaxN], cnt;
bitset<kMaxN> vis;
LL ans;

int main() {
  freopen("graph.in", "r", stdin), freopen("graph.out", "w", stdout);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i], ans -= a[i], d[i] = a[i];
  }
  for (int i = 1; i <= n; i++, cnt = 0) {
    for (int j = 1; j <= n; j++) {
      !vis[j] && (!cnt || d[j] > d[cnt]) && (cnt = j);
    }
    vis[cnt] = 1, ans += d[cnt];
    for (int j = 1; j <= n; j++) {
      !vis[j] && ((a[cnt] & a[j]) == 0) && (d[j] = max(d[j], a[cnt] + a[j]));
    }
  }
  cout << ans << '\n';
  return 0;
}

标签:24,10,qr,return,int,LL,kMaxN,2024,ql
From: https://www.cnblogs.com/bluemoon-blog/p/18499617

相关文章

  • 【2024-10-24】屎是香的
    20:00耐心点。你的未来将会来到你面前,像只小狗一样躺在你脚边,无论你是什么样,它都会理解你,爱你。                                                 ——特·德姜我发现......
  • 10.24Python_pandas_基础
    一、基础1、概述Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基础上构建而来Pandas名字衍生自术语“paneldata”(面板数据)和“Pythondataanalysis”(Python数据分析)Pandas已经成为Python数据分析的必备高级工具,它的目标是成为强大、灵活、可以......
  • 1024 | 码客聚会,云上跃迁,探秘华为云和他的开发者朋友们的故事
    摘要:祝开发者们节日快乐!文末双重福利等你来领。一年一度属于开发者们的节日如期而至祝所有开发者们1024程序员节快乐愿你们的变量永远不溢出循环永远不陷入死锁,代码逻辑清晰无bug点击链接查看视频听完了华为云和他的开发者朋友们的祝福还有一群华为云的老朋友有话说......
  • 2024/10/24日 日志 --》关于Mybatis的学习笔记整理 - 环境与性质
    步入了Mybatis的学习之中,以下为其相关内容的细化笔记整理点击查看代码--MyBatis--·MyBatis是一款优秀的持久层框架,用于简化JDBC开发--·官网:https://mybatis.net.cn/ --持久层:--·负责将数据保存到数据库的那一层代码--JavaEE三层架构:表现层、业务层、持久层分......
  • 团队练习记录2024.10.23
    比赛链接:https://codeforces.com/gym/104976D.OperatorPrecedence队友解的,想办法让第二个式子中括号内数值为1,所以就2,-1交替,最后一个选1可逆推,第一个为2*n-3#include<iostream>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#inc......
  • 2024-10-24往者不谏,来者可追,开启新篇章
    --10.23今天走找原老师在换导师申请书上签字。起先他不愿意,必须先总结我在组内所做的成果并交付给他,我拒绝了,直接表示不签字就投诉。我不知道这么做是否有过当,但是这似乎也是不得已之举,否则只会拖延。当他表示要签字时,我认真听取了他的想法。尽管他没跟我说卡论文的具体原因,但是......
  • 【1024程序员节】如何快速掌握人工智能技术技能
    一、前言    随着技术的革新,技术应用市场的饱和,大环境就业压力越来越大,只有不断地持续学习,才能永远立于不败之地。今天打开BOSS看了看,招JAVA的实在是不多,反而机器学习、人工智能、算法类的岗位很多、说明人工智能技术是当下热门的课题,也是企业寻找突破的方向,人才短缺......
  • 上交2024最新-《动手学大模型》实战教程及ppt分享!
    这份完整版的《动手学大模型》实战教程及ppt已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】本课介绍今天分享一个上海交大的免费的大模型课程,有相关教程文档和Slides,目前是2.2K星标,还是挺火的!文末附本课ppt及实战教程免费下载......
  • 20222305 2024-2025-1 《网络与系统攻防技术》实验三实验报告
    网络攻防实验报告姓名:田青学号:20222305实验日期:2024/10/18—2024/10/31实验名称:后门原理与实践指导教师:王志强1.实验内容本周学习内容总结:1.用户态(ring3)和内核态(ring0),切换时机:系统调用、中断、异常。2.自启动技术。3.进程隐藏技术实现:1>改名2>基于系统服务的伪装3>......
  • 10.24
    考前挂分是个好迹象,至少不像啥也不会那么绝望是不是/A.城市间交通第一眼整体二分+可撤销并查集,觉得有点难写,而且两个\(\log\)。再看一眼,发现最小生成树+倍增优秀单\(\log\)做法。B.最小公倍数第一眼这不是我们P3911最小公倍数之和吗?坏消息是忘了怎么莫反了。于是写了......