首页 > 其他分享 >2024/10/03

2024/10/03

时间:2024-10-03 20:11:08浏览次数:1  
标签:tmp 10 03 int LL cin kMaxN 2024 dp

\(100+20+0+55=175\),T4 数组开小挂了 \(45\),T3 暴力写挂挂了 \(20\)

#A. 旋律的总数

这真的是提高组的题吗

不考虑同构有 \(m^n\) 种排法,一种同构的排法可以偏移 \(m\) 次,直接相除得到答案 \(m^{n-1}\)

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

using namespace std;
using LL = long long;

const LL kP = 1e9 + 7;

LL t, n, m, ans;

LL P(LL x, LL y, LL ret = 1) {
  for (; y; (y & 1) && ((ret *= x) %= kP), (x *= x) %= kP, y >>= 1) {
  }
  return ret;
}

int main() {
  freopen("sum.in", "r", stdin), freopen("sum.out", "w", stdout);
  for (cin >> t; t; t--) {
    cin >> n >> m;
    cout << P(m, n - 1) << '\n';
  }
  return 0;
}

#B. 水果加工

二分答案,二分时间限制 \(T\),在限制下跑背包即可

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

using namespace std;
using LL = long long;

const int kMaxN = 50 + 5;

int n, a[kMaxN], m[3], c[3][kMaxN];
LL d[3][kMaxN], u[3][kMaxN], ans, dp[kMaxN][kMaxN][kMaxN], p;

LL Calc(LL x) {
  for (int i = 0; i <= n; i++) {
    for (int l = 0; l <= m[1]; l++) {
      for (int r = 0; r <= m[2]; r++) {
        dp[i][l][r] = (i == 0 ? 0 : 1e18);
      }
    }
  }
  dp[0][0][0] = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= a[i]; j++) {
      LL e = j, w = a[i] - j;
      if (e * d[1][i] > x || w * d[2][i] > x) {
        continue;
      }
      for (int l = 0; l <= m[1]; l++) {
        for (int r = 0; r <= m[2]; r++) {
          if (e == 0 && r >= c[2][i]) {
            dp[i][l][r] = min(dp[i][l][r], max(dp[i - 1][l][r - c[2][i]], w * u[2][i]));
          } else if (w == 0 && l >= c[1][i]) {
            dp[i][l][r] = min(dp[i][l][r], max(dp[i - 1][l - c[1][i]][r], e * u[1][i]));
          } else if (l >= c[1][i] && r >= c[2][i]) {
            dp[i][l][r] = min(dp[i][l][r], max({dp[i - 1][l - c[1][i]][r - c[2][i]], e * u[1][i], w * u[2][i]}));
          }
        }
      }
    }
  }
  return dp[n][m[1]][m[2]];
}

int main() {
  freopen("fruit.in", "r", stdin), freopen("fruit.out", "w", stdout);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  cin >> m[1] >> m[2];
  for (int i = 1; i <= n; i++) {
    cin >> c[1][i];
  }
  for (int i = 1; i <= n; i++) {
    cin >> c[2][i];
  }
  for (int i = 1; i <= n; i++) {
    cin >> d[1][i];
  }
  for (int i = 1; i <= n; i++) {
    cin >> d[2][i];
  }
  for (int i = 1; i <= n; i++) {
    cin >> u[1][i];
  }
  for (int i = 1; i <= n; i++) {
    cin >> u[2][i];
  }
  for (ans = 1e11; p < 1e11;) {
    LL l = p, r = 1e18, o = Calc(l);
    for (ans = min(ans, l + o); l + 1 < r;) {
      LL mid = (l + r) >> 1, A = Calc(mid);
      (A == o) ? (l = mid, o = A) : (r = mid);
    }
    p = l + 1;
  }
  cout << ans << '\n';
  return 0;
}

#C. 最佳位置

直接开两个 set 维护,一个按照段长排序,一个按照编号排序,直接二分查找维护即可

代码还在调,咕咕咕

#D. 跑步路线

MST + LCA 例题,边权不同,所以最小生成树唯一,那么路径是固定的。按顺序枚举要达到的相邻两点,用 LCA 维护两点之间距离即可

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

using namespace std;
using LL = long long;
#define int __int128_t

const int kMaxN = 2e5 + 5, kMaxM = 1e6 + 5, kL = 18 + 2;

struct E {
  int u, v;
  __int128_t w;
  bool operator<(const E &o) const {
    return w < o.w;
  }
};

int n, m, k, e[kMaxM], fa[kMaxN], tot, f[kMaxN][kL];
LL tmp_t;
__int128_t t, dis[kMaxN], ans, d[kMaxN];
vector<pair<int, __int128_t>> g[kMaxN];
E r[kMaxM];

int F(int x) { return fa[x] == x ? x : fa[x] = F(fa[x]); }
void DFS(int u, int fa) {
  f[u][0] = fa, d[u] = d[fa] + 1;
  for (auto i : g[u]) {
    LL v = i.first, w = i.second;
    if (v != fa) {
      dis[v] = dis[u] + w, DFS(v, u);
    }
  }
}
void Init() {
  for (int i = 1; i < kL; i++) {
    for (int j = 1; j <= n; j++) {
      f[j][i] = f[f[j][i - 1]][i - 1];
    }
  }
}
int LCA(int x, int y) {
  if (d[x] < d[y]) {
    swap(x, y);
  }
  for (int i = kL - 1; ~i; i--) {
    (d[f[x][i]] >= d[y]) && (x = f[x][i]);
  }
  if (x == y) {
    return x;
  }
  for (int i = kL - 1; ~i; i--) {
    (f[x][i] != f[y][i]) && (x = f[x][i], y = f[y][i]);
  }
  return f[x][0];
}
void print(__int128_t x) {
  if (x > 9) {
    print(x / 10);
  }
  putchar(x % 10 + 48);
}

signed main() {
  freopen("run.in", "r", stdin), freopen("run.out", "w", stdout);
  cin >> tmp_t, n = tmp_t, cin >> tmp_t, m = tmp_t;
  for (int i = 1, u, v, w; i <= m; i++) {
    cin >> tmp_t, u = tmp_t;
    cin >> tmp_t, v = tmp_t;
    cin >> tmp_t, w = tmp_t;
    r[i] = (E){u, v, w};
  }
  cin >> tmp_t, k = tmp_t;
  cin >> tmp_t, t = tmp_t;
  for (int i = 1; i <= k; i++) {
    cin >> tmp_t, e[i] = tmp_t;
  }
  for (int i = 1; i <= n; i++) {
    fa[i] = i;
  }
  sort(r + 1, r + m + 1);
  for (int i = 1; i <= m; i++) {
    if (F(r[i].u) != F(r[i].v)) {
      tot++, g[r[i].u].push_back({r[i].v, r[i].w}), g[r[i].v].push_back({r[i].u, r[i].w});
      fa[F(r[i].u)] = F(r[i].v);
    }
    if (tot == n - 1) {
      break;
    }
  }
  d[1] = 1, DFS(1, 0);
  Init();
  for (int i = 1; i < k; i++) {
    if (e[i + 1] == e[i]) {
      continue;
    }
    int l = LCA(e[i], e[i + 1]);
    ans += t * (d[e[i]] + d[e[i + 1]] - d[l] - d[l]);
    ans += dis[e[i]] + dis[e[i + 1]] - dis[l] - dis[l];
  }
  print(ans - t), cout << '\n';
  return 0;
}

标签:tmp,10,03,int,LL,cin,kMaxN,2024,dp
From: https://www.cnblogs.com/bluemoon-blog/p/18445955

相关文章

  • 用Python实现运筹学——Day 10: 线性规划的计算机求解
    一、学习内容1.使用Python的scipy.optimize.linprog进行线性规划求解scipy.optimize.linprog是Python中用于求解线性规划问题的函数。它实现了单纯形法、内点法等算法,能够处理求解最大化或最小化问题,同时满足线性约束条件。线性规划问题的形式:线性规划问题可以描......
  • Leecode热题100-75.颜色分类
    给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。必须在不使用库内置的sort函数的情况下解决这个问题。示例1:输入:num......
  • Cornell cs3110 - Chapter5 Exercises
    (*Exercise:complexsynonym*)moduletypeComplexSig=sigtypecomplexvalzero:complexvaladd:complex->complex->complexend(*Exercise:complexencapsulation*)moduleComplex:ComplexSig=structtypecomplex=float*flo......
  • 10月3日 J 组 测 逝
    智障行为+1T1T2T3T450100500T150pts【问题描述】现在有......
  • 题解:CF2009G1 Yunli's Subarray Queries (easy version)
    题目要求\(a_i=a_{i-1}+1\),设\(b_i=a_i-i\),如果\(b_i=b_j\),那么\(i\)和\(j\)就在正确的相对位置上。这应该很好理解吧,\(a\)是一个公差为\(1\)的等差数列,下标也是一个公差为\(1\)的等差数列,对应位置相减就相等了。我们在输入\(a_i\)的时候减去\(i\),然后用滑动窗口......
  • 民宿酒店预订系统V1.0.10
    多门店民宿酒店预订管理系统,快速部署属于自己民宿酒店的预订小程序,包含预订、退房、WIFI连接、吐槽、周边信息等功能。提供全部无加密源代码,支持私有化部署。V1.0.10修复海报分享错误......
  • CSP-S 2024 第八次
    忘记写了,补一下A依次加入每个\(a_i\),拿个大根堆维护当前以\(i\)结尾的和最大子段,和超过\(s\)了就弹堆顶直到和不超过\(s\)。不过好像出现了一些语文事故,先不管了。B倍增预处理出\(f_i\)表示\(i\)上方第一个大于\(a_i\)的点,询问\(u,v,c\)时,先倍增找到\(u\)上......
  • 『模拟赛』多校A层冲刺NOIP2024模拟赛01
    Rank打得还可以总A.构造字符串签,但是挂了40pts。发现判条件只有相等和不相等,于是想到并查集维护连通块,将强制相同的两个位置的连通块合并,强制不同的先记下,最后统一判断。重点在细节处理,合并连通块时要将位置靠后的合并到靠前的上,注意\(LCP(x,y)=z\)在\(x+z,y+z\le......
  • 数据表或视图不存在 [错误代码]SQLSTATE[42S02]: Base table or view not found: 1146
    这个错误表明在执行SQL查询时,尝试访问的数据表或视图 ey_product_content 在数据库 bb9e8d602 中不存在。这可能是由于以下几个原因导致的:表名拼写错误:检查表名是否正确无误。数据库选择错误:确认当前使用的数据库是否正确,确保没有混淆数据库名称。表被删除:可能该表已经......
  • 多校A层冲刺NOIP2024模拟赛【衡中】
    多校A层冲刺NOIP2024模拟赛01构造字符串咕咕咕寻宝咕咕咕点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintmaxn=50009;intn,m,k,q,tot,cnt,vis[32767];inta[4]={1,-1,0,0};intb[4]={0,0,-1,1};map<int,short>mp[maxn];queue<pair<int,int>>......