首页 > 其他分享 >2024.7.2

2024.7.2

时间:2024-07-02 15:22:22浏览次数:13  
标签:const 2024.7 int 复杂度 lx freopen dp

党同伐异

可以发现, 每次只会是 \(a_i\) 最大或者 \(a_i\) 最小的人被淘汰, 所以留下的肯定是从小到大排序后的一段区间。

还可以发现一个单调性, 越靠近左边就越不可能票左边, 所以可以通过二分求出左右两边各被票了多少。

#include<bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;

struct Node{
  int x, id;
}a[N];

int l, r, lx, rx, mid, n;

int main(){
  freopen("election.in", "r", stdin);
  freopen("election.out", "w", stdout);
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n;
  for(int i = 1; i <= n; ++i){
    cin >> a[i].x;
    a[i].id = i;
  }
  sort(a + 1, a + n + 1, [](const Node &i, const Node &j){  return i.x < j.x;});
  l = 1, r = n;
  while(l < r){
    lx = l, rx = r + 1;
    while(lx < rx){
      mid = (lx + rx) >> 1;
      if(a[mid].x - a[l].x > a[r].x - a[mid].x){
        rx = mid;
      }
      else{
        lx = mid + 1;
      }
    }
    if(lx - l < r - rx + 1){
      l++;
    }
    else{
      r--;
    }
  }
  cout << a[l].id;
  return 0;
}

时间复杂度 \(O( n \log n)\)

空间复杂度 \(O(n)\)

混乱谜团

考虑对于一个序列 \(1, 2, 3 \dots n\) 进行反转操作

如果反转 \(2, 3, 4, \dots n\), 代价增加 \(n - 2\)

如果反转 \(3, 4, 5, \dots n\), 代价增加 \(n - 3\)

\(\dots\)

反转直接还是相互独立的, 应为不管有多少次 \(< i\) 的操作, \(i, i + 1, \dots n\) 都一定在反转的区间里。

反转 = 填数

#include<bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5;

long long n, k, l, r, a[N];

int main(){
  freopen("chaos.in", "r", stdin);
  freopen("chaos.out", "w", stdout);
  cin >> n >> k;
  k -= (n - 1);
  l = 2, r = n;
  a[1] = 1;
  for(int kk = 2; l != r; ++kk){
    if(n - kk <= k){
      k -= (n - kk);
      a[r] = kk;
      (r > l ? r-- : r++);
      swap(l, r);
    }
    else{
      a[l] = kk;
      (l > r ? l-- : l++);
    }
  }
  a[l] = n;
  for(int i = 1; i <= n; ++i){
    cout << a[i] << ' ';
  }
  return 0;
}

时空复杂度 \(O(n)\)

固若金汤

考虑 DP

状态 \((i, j)\) 表示考虑前 \(i\) 个人, 最后一个人编号 \(i\), 倒数第二个人编号 \(j\)

维护最大值数组 \(s_{i, j}\) 表示末尾为 \(i\) 时 \(a_i\) 和前一个二进制下第 \(j\) 位为 1 的最多人数

转移 :
\((i, j) = s_{j, k}\) 其中, \(a_i\) 二进制下第 \(k\) 位为 1, \(j \le i\)
\(s_{i, k} = (i, j)\) 其中, \((a_i \operatorname{and} a_j)\) 二进制下第 \(k\) 位为 1

#include<bits/stdc++.h>

using namespace std;

const int N = 2005;

int n, a[N], ans, dp[N], s[N][40], ok;

int main(){
  freopen("defend.in", "r", stdin);
  freopen("defend.out", "w", stdout);
  //freopen("samples3.in", "r", stdin);
  cin >> n;
  for(int i = 1; i <= n; ++i){
    cin >> a[i];
  }
  ans = (n >= 2 ? 2 : 1);
  for(int i = 1; i <= n; ++i){
    for(int j = 1; j < i; ++j){
      dp[j] = -1e9;
    }
    dp[i] = 1;
    for(int j = 0; j < 31; ++j){
      s[i][j] = -1e9;
      if(a[i] & (1 << j)){
        for(int k = 1; k < i; ++k){
          dp[k] = max(dp[k], s[k][j] + 1);
        }
      }
    }
    for(int k = 1; k <= i; ++k){
      ok = (a[i] & a[k]);
      for(int j = 0; j < 31; ++j){
        if(ok & (1 << j)){
          s[i][j] = max(s[i][j], dp[k]);
        }
      }
    }
    for(int i = 1; i <= n; ++i){
      ans = max(ans, dp[i]);
    }
  }
  cout << ans;
  return 0;
}

时间复杂度 \(O(n^2 \log_2 V)\)

降维后时间复杂度 \(O(n \log_2 V)\)

替身使者

先对 \(k_i\) 从小到大排序, 这样, 就可以简单的处理宽带

状态 \((i, s)\) 表示考虑前 \(i\) 个替身, 可以完成题目的二进制串为 \(s\) 时的不算宽带最小花费

转移当前状态与上能解决的题目 + 费用

答案 \(\min \limits_{i = 1}^n \{ dp[i][全集] + b \cdot k_i \}\)

#include<bits/stdc++.h>

using namespace std;

const int N = 105, M = (1 << 21) + 5;

struct Node{
  int x, k, w;
}a[N];

long long dp[M], n, m, b, x, ans = 2e18, len;

int main(){
  freopen("standin.in", "r", stdin);
  freopen("standin.out", "w", stdout);
  //freopen("samples3.in", "r", stdin);
  cin >> n >> m >> b;
  for(int i = 1; i <= n; ++i){
    cin >> a[i].x >> a[i].k >> len;
    a[i].w = 0;
    for(int j = 1; j <= len; ++j){
      cin >> x;
      x--;
      a[i].w |= (1 << x);
    }
  }
  sort(a + 1, a + n + 1, [](const Node &i, const Node &j){  return i.k < j.k;});
  for(int s = 1; s < (1 << m); s++){
    dp[s] = 2e18;
  }
  for(int i = 1; i <= n; ++i){
    for(int s = (1 << m) - 1; s >= 0; s--){
      dp[s | a[i].w] = min(dp[s | a[i].w], dp[s] + a[i].x);
    }
    ans = min(ans, dp[(1 << m) - 1] + a[i].k * b);
  }
  cout << (ans == 2e18 ? -1 : ans);
  return 0;
}

时空复杂度 \(O(n2^m)\)

标签:const,2024.7,int,复杂度,lx,freopen,dp
From: https://www.cnblogs.com/liuyichen0401/p/18279777

相关文章

  • 2024.7.2 集训
    ###数位DP1.记录:1.是否顶上限;2.是否当前填了的都是前导$0$;3.当前位是否是从左往右数第一位。(2和3是两种做法,2是在Query里只调用一次DFS,3是在Query里枚举第一个非$0$位调用多次DFS)。2.记忆化的数组可以不用记所有内容。3.注意DFS返回时要返回res,而不是记......
  • 云原生周刊:Argo Rollouts 支持 Kubernetes Gateway API 1.0 | 2024.7.1
    开源项目KubetoolsRecommenderSystemKubetoolsRecommenderSystem(Krs)是一个基于GenAI的工具,用于帮助管理和优化Kubernetes集群。buoybuoy是Kubernetes的声明式TUI仪表板。你可以在JSON文件中定义仪表板,它将从Kubernetes集群中获取信息并构建仪表板,以便在......
  • 2024.7.1 - 7.15
    Question1-[ABC360G]SuitableEditforLIS给定一个长度为\(n\)的序列\(A\),你可以执行如下操作恰好一次,最大化LIS的长度:选定一个下标\(x\)满足\(1\leqx\leqn\),选定一个任意的整数\(y\),然后将\(A_x\)替换为\(y\)。\(1\leqn\leq2\times10^5,1\leqA_i\le......
  • 记录:2024.7.1,VMware17免费后的安装方法
    省流:下载地址:VMware17.5.2forLinux:https://www.123pan.com/s/RBdkTd-1rM3d.htmlVMware17.5.2forWindows:https://www.123pan.com/s/RBdkTd-xrM3d.htmlVMware在2024年5月13宣布VMwarepro免费给个人用户使用,并且所有VMware支持都被迁移到博通网站VMwareFusionPro:......
  • 2024.7 - 做题记录与方法总结
    2024/07/01AtCoderBeginnerContest360E-RandomSwapsofBalls期望\(dp\)题问题陈述有\(N-1\)个白球和一个黑球。这些\(N\)个球排成一排,黑球最初位于最左边的位置。高桥正好要进行下面的操作\(K\)次。在\(1\)和\(N\)之间均匀随机地选择一个整数,包括两......
  • 2024.7.1 之后的做题小记
    7.1P7124[Ynoi2008]stcm维护一个\(O(n\logn)\)级别的子树补不删除莫队。Solution1:考虑菊花图,忽略根节点,一个显然的做法是把这些节点扔进线段树,然后遍历某个节点时候就把它的兄弟节点内所有点加进来。这个做法是线段树所有节点大小和即\(O(n\logn)\)。然后在一条链上......
  • 2024.7.1 初识Linux
    1、Linux安装:(1)VmwareWorkstation安装(2)Centos7系统安装(3)使用Mobaxterm远程操控Linux虚拟机2、Linux命令(1)ipaddress查看本机的ip地址(2)cal查看日历用法:cal[选项][[[日]月]年]选项:-1,--one只显示当前月份(默认)-3,--three显示上个月、当月和下......
  • 2024.7~8 训练日记
    \(\color{grey}\bigstar\)可以秒杀的题。\(\color{green}\bigstar\)思考一会儿后可以秒的题。\(\color{blue}\bigstar\)需要较长时间思考的题。\(\color{#F1C40F}\bigstar\)看题解、稍加指点就会做的题。\(\color{red}\bigstar\)看题解后需要较长时间消化,甚至现在都没有......
  • 【周考】Round1 2024.7.6
    SummaryScore:\(100+90+0+50+4=244\)T1减法操作考虑对\(n\)分奇偶讨论:偶数:显然最小质因子为\(2\),而每次减\(2\)后仍是偶数。所以偶数一定进行了\(\dfracn2\)次操作;奇数:因为是奇数,所以最小质因子一定也是奇数,减去后则变为偶数,接着可以转化为偶数处理。code......