首页 > 其他分享 >逐月破星杯

逐月破星杯

时间:2024-10-21 20:32:59浏览次数:1  
标签:10 破星杯 子段 int 复杂度 逐月 maxdp dp

C. 区间排序

题目描述

给定一个数组 \(A\),你要按照如下方式对 \(A\) 排序:

  1. 将 \(A\) 分割成互不相交的子段,且每个元素恰好属于一个子段。
  2. 准备一个空数组 \(B\),按顺序把这些子段完整地插入到 \(B\) 中的任意位置。

求至少要分成几个子段。

思路

很明显我们会贪心的尽可能长的取子段直到不能取。所以我们来考虑怎么判断非法。

  • 如果当前元素小于上个元素,那么很明显不能放在同一段。
  • 或者如果当前元素大于原数组中第一个大于 \(A_l\) (\(l\) 是当前区间左端点)的元素,那么也不能放在同一段。因为当前子段一定会插在其之前,所以不能大于它。

使用 set 维护即可。

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

代码

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

const int MAXN = 1000001;

int n, a[MAXN], ans;

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n;
  for(int i = 1; i <= n; ++i) {
    cin >> a[i];
  }
  set<int> s;
  s.insert(0), s.insert(1000001);
  for(int i = 1, j = 1; i <= n; i = j) {
    int x = *s.upper_bound(a[i]);
    for(; j <= n && (i == j || a[j] >= a[j - 1]) && a[j] <= x; ++j) {
    }
    ans++;
    for(int k = i; k < j; s.insert(a[k]), ++k) {
    }
  }
  cout << ans;
  return 0;
}

D. 精准拼接

题目描述

给定两个长为 \(N\) 的数列 \(A,k\)。你要找出一个最长的且满足以下条件的数列 \(p_1,p_2,\dots,p_m\):

  • \(1\le p_1<p_2<\dots<p_m\le N\)。
  • 对于 \(\forall 1<i\le m\),都有 \(\text{popcount}(A_{p_{i-1}}\text{AND} A_{p_i})=k_{p_i}\)。

思路

令 \(dp_{i}\) 表示以 \(i\) 结尾的满足条件的子序列的最长长度。

令 \(maxdp_{i,j,k}\) 表示一个转移 \(a\rightarrow b\) 满足 \(A_a\) 二进制下最高 \(10\) 位为 \(i\),\(A_b\) 二进制下最低 \(10\) 位为 \(j\),\(A_a,A_b\) 的最低十位的 \(\text{popcount}\) 为 \(k\) 中最大的 \(dp_a\)。

我们可以这样使用 \(maxdp\) 转移(收集型):

  • 此时明显 \(j\) 已经确定,所以我们可以枚举 \(i\)。
  • 由于我们知道要求 \(k_i\),所以我们还可以求出 \(k\)。直接转移即可。

并这样更新 \(maxdp\):

  • 这次是 \(i\) 已经确定,同样枚举 \(j\)。同理 \(k\) 也确定了,直接更新即可。

空间复杂度 \(O(N+V^2\log V)\),时间复杂度 \(O(NV)\),其中 \(V=2^{10}\)。

代码

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

const int MAXN = 100001;

int n, a[MAXN], pop[1 << 20], maxdp[21][1 << 10][1 << 10], pos[11][1 << 10][1 << 10], fa[MAXN], ans, p;

void Print(int x) {
  if(!x) {
    return;
  }
  Print(fa[x]);
  cout << x << " ";
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  freopen("stitch.in", "r", stdin);
  freopen("stitch.out", "w", stdout);
  cin >> n;
  for(int i = 1; i < (1 << 20); ++i) {
    pop[i] = pop[i - (i & -i)] + 1;
  }
  for(int i = 1; i <= n; ++i) {
    cin >> a[i];
  }
  for(int i = 1, x, dp; i <= n; ++i) {
    cin >> x;
    dp = 1;
    for(int j = 0; j < (1 << 10); ++j) {
      int v = x - pop[j & (a[i] >> 10)];
      if(v >= 0 && maxdp[v][j][a[i] & ((1 << 10) - 1)] + 1 > dp) {
        dp = maxdp[v][j][a[i] & ((1 << 10) - 1)] + 1, fa[i] = pos[v][j][a[i] & ((1 << 10) - 1)];
      }
    }
    if(dp > ans) {
      ans = dp, p = i;
    }
    for(int j = 0; j < (1 << 10); ++j) {
      int v = pop[a[i] & j];
      if(dp > maxdp[v][a[i] >> 10][j]) {
        maxdp[v][a[i] >> 10][j] = dp, pos[v][a[i] >> 10][j] = i;
      }
    }
  }
  cout << ans << "\n";
  Print(p);
  return 0;
}

标签:10,破星杯,子段,int,复杂度,逐月,maxdp,dp
From: https://www.cnblogs.com/yaosicheng124/p/18490303

相关文章

  • 逐月信息学——2024初秋集训——提高组 #22
    A.牛牛的方程式题目描述给定一个三元一次方程\(ax+by+cz=d\),求该方程是否存在整数解。思路由于若干个\(a,b,c\)只能凑出\(\gcd(a,b,c)\)的倍数,所以只需判断\(d\)是否为\(\gcd(a,b,c)\)的倍数即可。特别的,若\(a,b,c\)均为\(0\),则显然只有\(d=0\)时存在整数解。......
  • GEE案例:利用MODIS数据计算长时序逐月的NDVI数据和下载
    简介详细流程如下:1.打开GoogleEarthEngine(GEE)平台的网站https://earthengine.google.com/。2.点击右上角的"SignIn"按钮,使用您的Google账号登录。3.在GEE界面中,点击左上角的"CodeEditor"按钮,进入代码编辑器页面。4.在代码编辑器页面的左上方,点击"A......
  • 逐月信息学 2024 提高组 #4
    \(\color{black}\texttt{A.转盘锁}\)题目描述给定一个四位转盘锁,每个转盘上都有\(0\)到\(9\)的数字。数字\(i\)的下一个数字是\((i+1)\bmod10\),上一个数字是\((i-1)\bmod10\)。每次你可以将一段连续的区间全部往上翻或往下翻一个数字。现在给定一个初始时的转盘,求最......
  • 逐月信息学 2024 提高组 #3
    \(\color{black}\texttt{A.反转Dag图}\)题目描述给定一个有向图,每次操作可以花费\(w_i\)的代价来反转边\(i\),最终总代价为每次操作代价的最大值。求最少需要多少代价才能使这张图变为一个DAG。思路首先看这个问题的简化版:把反转操作变为删除操作。可以用二分解决:二分出......
  • 逐月信息学 2024 提高组 #2
    \(\color{black}\texttt{A.序列}\)题目描述给定\(N\)个数,每个数均可写成\(pq(p,q\in\mathbb{P},p<q)\)的形式,问最长能找到多长的子序列使得任意相邻两项\(x_i=p_1q_1,x_{i+1}=p_2q_2(p_1,q_1,p_2,q_2\in\mathbb{P},p_1<q_1,p_2<q_2)\)满足\(q_1=p_2\)?思路按照\(p\)......
  • 逐月信息学 2024 提高组 #6
    \(\color{black}\texttt{A.数字涡旋}\)题目描述有一张无线大的表格,里面填着所有正整数,表格如下:\[\begin{matrix}1&2&9&\dots\\4&3&8\\5&6&7\\\vdots&&&\ddots\end{matrix}\]求数字\(N\)出现在表格的几行几列。思路推式子体。代码#include<bits/st......
  • 逐月信息学 2024 提高组 #5
    \(\color{black}\texttt{A.党同伐异}\)题目描述有\(N\)个候选人,每个候选人都有一个不同的政治倾向\(c_i\),进行\(N-1\)次选举。每轮选举中,所有未被淘汰的候选人给另一个没被淘汰的候选人。每一个候选人会将票投给\(c_i\)与自己差的绝对值最大的候选人。如果有多个这样的......
  • 逐月生存指南
    学生篇小心同学!!!小心同学!!!小心同学!!!(重要的事情说三遍)xhr典型的笑里藏刀,演技高手。案例:每当xhr给别人东西事,只要表情不对,就一定不能接。(注意表情不对的范围很广)每当他说一道题不会时,就说明他有\(99.99999999999999\cdots\cdots\%\)的概率AK。(xhr你可不可以放放……)wsy似......
  • Solution Set - “潮汐守候终结放逐月圆”
    目录0.「NOISimu.」游戏⭐1.「NOISimu.」海盗⭐2.「集训队作业2020-2021」「LOJ#3405」GemIsland2⭐3.「UR#12」「UOJ#181」密码锁⭐4.「UR#25」「UOJ#805」设计草图5.「UR#25」「UOJ#806」见贤思齐⭐6.「NOISimu.」哈密顿路7.「NOISimu.」统一省选8.「NOISim......