首页 > 其他分享 >2024初秋集训——提高组 #31

2024初秋集训——提高组 #31

时间:2024-10-06 21:23:11浏览次数:1  
标签:int s2 31 魔导器 pos 2024 && ll 初秋

C. 特殊区间

题目描述

给定一个数列 \(A_1,A_2,\dots,A_N\),我们定义一个区间 \([l,r](l<r)\) 的价值为:

\[\max \limits_{a,b,c,d\in [l,r],c\ne d}\{A_a-A_b-(A_c\oplus A_d)\} \]

给定 \(Q\) 次查询,每次查询有多少个区间的价值在 \([d,u]\) 之间。

思路

显然,我们会令 \(A_a\) 最大,\(A_b\) 最小,\(A_c\oplus A_d\) 最小。由于一个序列的异或最小值为将其排序后相邻两项的异或最小值,所以我们使用两个 multiset 分别维护排序后的数列和排序后数列相邻两项异或值。由于这里有单调性,所以我们可以通过双指针求出价值 \(\ge x\) 的区间数量,使用前缀和的方式相减即可求出答案。

空间复杂度 \(O(N)\),时间复杂度 \(O(QN\log N)\)。

代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int MAXN = 50001, MAXV = 1000001;

int n, q;
ll a[MAXN];
multiset<ll> s, s2;

void Insert(ll x) {
  auto it = s.lower_bound(x);
  if(it != s.begin() && it != s.end()) {
    s2.erase(s2.find((*prev(it)) ^ (*it)));
  }
  if(it != s.begin()) {
    s2.insert((*prev(it)) ^ x);
  }
  if(it != s.end()) {
    s2.insert((*it) ^ x);
  }
  s.insert(x);
}

void Erase(ll x) {
  s.erase(s.find(x));
  auto it = s.lower_bound(x);
  if(it != s.begin() && it != s.end()) {
    s2.insert((*prev(it)) ^ (*it));
  }
  if(it != s.begin()) {
    s2.erase(s2.find((*prev(it)) ^ x));
  }
  if(it != s.end()) {
    s2.erase(s2.find((*it) ^ x));
  }
}

ll Calc(ll x) {
  s.clear(), s2.clear();
  Insert(a[1]);
  ll ret = 0;
  for(int i = 1, j = 1; i <= n; Erase(a[i]), ++i) {
    for(; j <= n && (s2.empty() || *prev(s.end()) - *s.begin() - *s2.begin() < x); ) {
      if(++j <= n) {
        Insert(a[j]);
      }
    }
    ret += (n - j + 1);
  }
  return ret;
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> q;
  for(int i = 1; i <= n; ++i) {
    cin >> a[i];
  }
  for(int i = 1; i <= q; ++i) {
    ll d, u;
    cin >> d >> u;
    cout << Calc(d) - Calc(u + 1) << "\n";
  }
  return 0;
}

D. 魔法阵

题目描述

你要将 \(N\) 个魔导器围成一圈,如果魔导器 \(i\) 与 \(j\) 相邻,则会构成一个魔力值为 \(m_{i,j}\) 的魔术通路。只有任意两个魔术通路的魔力值之差 \(\le k\),这个排列才是稳定的。现在有一些位置已经确定了,求有多少种合法的放置魔导器的方法。

思路

为了方便实现,我们先让这个圈转到第一个魔导器固定。若没有确定的魔导器,则强制定义第一个为 \(1\),最后再让答案乘以 \(N\)。

我们考虑枚举魔力值的最小值 \(x\)。令 \(dp_{0/1,S,i}\) 表示当前是/否出现了 \(x\),已经使用了魔导器集合 \(S\),最后一个魔导器为 \(x\)。这里有一维状态是/否出现 \(x\) 是为了防止算重。按此状态转移即可。

空间复杂度 \(O(N2^N)\),时间复杂度 \(O(N^3 2^N)\)。

代码

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 14, MOD = 998244353, MAXV = (1 << 13);

int n, k, a[MAXN], pos, p[MAXN], g[MAXN][MAXN], ans, A[MAXN * MAXN], tot, dp[2][MAXV][MAXN];
bool flag;

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> k;
  for(int i = 1; i <= n; ++i) {
    cin >> a[i];
    if(a[i]) {
      pos = i;
    }
  }
  if(pos) {
    for(int i = 1; i <= n; ++i) {
      p[(i >= pos ? i - pos + 1 : n - pos + 1 + i)] = a[i];
    }
  }else {
    flag = 1, p[1] = 1;
  }
  for(int i = 1; i <= n; ++i) {
    for(int j = 1; j <= n; ++j) {
      cin >> g[i][j];
      if(j < i) {
        A[++tot] = g[i][j];
      }
    }
  }
  for(int i = 1; i <= tot; ++i) {
    for(bool op : {0, 1}) {
      for(int s = 1; s < (1 << n); ++s) {
        for(int j = 1; j <= n; ++j) {
          dp[op][s][j] = 0;
        }
      }
    }
    dp[0][1 << (p[1] - 1)][p[1]] = 1;
    for(int s = 1; s < (1 << n); ++s) {
      for(bool op : {0, 1}) {
        int b = __builtin_popcount(s);
        for(int j = 1; j <= n; ++j) {
          if(!dp[op][s][j]) {
            continue;
          }
          for(int x = 1; x <= n; ++x) {
            if(!((s >> (x - 1)) & 1) && g[j][x] >= A[i] && g[j][x] - A[i] <= k && (!p[b + 1] || p[b + 1] == x)) {
              dp[op | (g[j][x] == A[i])][s | (1 << (x - 1))][x] = (dp[op | (g[j][x] == A[i])][s | (1 << (x - 1))][x] + dp[op][s][j]) % MOD;
            }
          }
        }
      }
    }
    for(int j = 1; j <= n; ++j) {
      if(g[j][p[1]] >= A[i] && g[j][p[1]] - A[i] <= k) {
        ans = (ans + dp[1][(1 << n) - 1][j]) % MOD;
        if(g[j][p[1]] == A[i]) {
          ans = (ans + dp[0][(1 << n) - 1][j]) % MOD;
        }
      }
    }
  }
  cout << 1ll * (flag ? n : 1) * ans % MOD;
  return 0;
}

标签:int,s2,31,魔导器,pos,2024,&&,ll,初秋
From: https://www.cnblogs.com/yaosicheng124/p/18449431

相关文章

  • CSP-S 2024 第九次
    A设\(f_{i,S}\)表示考虑前\(i\)行,选出的矩形在第\(i\)行上形成\(S\)中的区间的方案数,每行的\(S\)只有\(O(2^m)\)种,总复杂度\(O(n2^{2m})\)。B考虑先修改再查询怎么做。考虑左下角为\((x_1,y_1)\),右上角为\((x_2,y_2)\)的矩形,发现斜率在\(\left[\dfrac{y_1}{......
  • 2024-2025 20241308《计算机基础与程序设计》第二周学习总结
    这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK02这个作业的目标阅读《计算机科学概论》和《C语言程序设计》的第一章内容并从中学习感悟,找到不懂的问题并想办法解决作......
  • 2024-10-6 模拟赛总结
    \(100+80+100+0=280\),暴力又写挂了。比赛链接:http://172.45.35.5/d/HEIGETWO/homework/67025b796735d3863dc7f60d或者http://yl503.yali.edu.cn/d/HEIGETWO/homework/67025b796735d3863dc7f60dA-fountain题意:给定一条线段和一个圆,求线段上任意一点到圆上任意一点的最大距......
  • 2024-2025 20241323第二周总结
    这个作业属于https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求这个作业的目标• 作业正文数字化• 信息安全• 自学教材o 计算机科学概论(第七版)第1章教材学习内容总结计算系统:计算系统不仅仅是计算机系统,它包括硬件、软件和数据,是一种动态实体,用于解......
  • 多校A层冲刺NOIP2024模拟赛02 & csp-s模拟9
    多校A层冲刺NOIP2024模拟赛02四道题因为暑假被拉去当模拟赛暑假集训CSP提高模拟22了,遂直接把赛后代码交了上去,然后就被通知换题了。原\(100+100+100+20\)被在accodersNOI上被卡成了\(100+100+90+10\),更改longlong和int后达到了\(100+100+100+30\)。\(T1\)P318......
  • ABB_800xA学习笔记314:做一个实际的练习1
    国庆节懒了几天尽去玩了,没有学习。我把前段时间在新浪博客记录的内容转发在这里,那里把访问量清零后还没有恢复。原文地址:ABB_800xA学习笔记314:做一个实际的练习1_来自金沙江的小鱼_新浪博客(sina.com.cn)很久没有学习ABB800xA了,现场有一套800xA的设备,如果出了问题还是得区处理......
  • jsp测试缺陷管理系统3166o程序+源码+数据库+调试部署+开发环
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景随着软件行业的迅速发展,软件质量成为企业竞争力的关键因素。在软件开发过程中,测试缺陷管理系统是确保软件质量的重要环节。传统的缺陷......
  • [JOI 2024 Final] 建设工程 2
    [JOI2024Final]建设工程2题意给出一张图和\(S\),\(T\)。可在任意两点\(u,v(u<v)\)之间添加一条长度为\(L\)的边(只可添加一次)。求有多少种添加方案使得\(S\)到\(T\)的最短路长度\(\leK\)。思路首先,若\(S\)到\(T\)的最短路已经\(\leK\),答案为\(\frac{n\t......
  • 2024-2025-1 20241327 《计算机基础与程序设计》第2周学习总结
    作业信息|2024-2025-1-计算机基础与程序设计)||--|-|2024-2025-1计算机基础与程序设计第二周作业)||快速浏览一遍教材计算机科学概论(第七版),课本每章提出至少一个自己不懂的或最想解决的问题并在期末回答这些问题|作业正文|https://www.cnblogs.com/shr060414/p/18440575|教......
  • SMC 2024 游记
    (评分规则:25道五选一,满分125分,选对得5分,不选得1分,选错得0分)题目都没有什么难度啊,但是T3可以看一下:(回忆)两个标准骰子叠放在桌子上。已知:(1)两个骰子接触面上的点数相等,均为\(A\)。(2)\(9\)个可见的面(骰子之间接触面有两个,骰子与桌面的接触面有一个,这三个面不可见)的点数......