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

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

时间:2024-10-04 19:44:04浏览次数:1  
标签:dots frac int 30 2024 cdot MAXN dist 初秋

B. 硬币问题

题目描述

有 \(N\) 种硬币,每种都有无限个。求 \([1,m]\) 中有多少种面额是不能被凑出来的。

思路

我们可以先求出不使用 \(w_1\) 凑出来的数,由于之后可以再添加若干个 \(w_1\)。所以对于 \(\bmod w_1\) 同余的数只需看较小的数。这明显就是一个最短路。对于每种余数求出有多少种即可。

空间复杂度 \(O(N+\min\{w_i\})\),时间复杂度 \(O(N\min \{w_i\})\)。

代码

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

const int MAXN = 101, MAXV = 1000001;
const ll INF = (ll)(1e18);

int n, a[MAXN];
ll m, ans, dist[MAXV];
bool vis[MAXV];

void dij() {
  priority_queue<pii, vector<pii>, greater<pii>> pq;
  fill(dist, dist + a[1], INF);
  dist[0] = 0;
  pq.push({0, 0});
  for(; !pq.empty(); ) {
    ll dis = pq.top().first, u = pq.top().second;
    pq.pop();
    if(vis[u]) {
      continue;
    }
    vis[u] = 1;
    for(int i = 2; i <= n; ++i) {
      if(dis + a[i] < dist[(u + a[i]) % a[1]] && dis + a[i] <= m) {
        dist[(u + a[i]) % a[1]] = dis + a[i];
        pq.push({dis + a[i], (u + a[i]) % a[1]});
      }
    }
  }
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for(int i = 1; i <= n; ++i) {
    cin >> a[i];
  }
  sort(a + 1, a + n + 1);
  dij();
  for(int i = 0; i < a[1]; ++i) {
    ans += (dist[i] == INF ? 0ll : (m - dist[i]) / a[1] + 1);
  }
  cout << ans - 1;
  return 0;
}

D. 期望长度

题目描述

有 \(N\) 个数 \(A_1,A_2,\dots,A_N\)。你要从中选出一个区间 \([l,r]\),使得其最大值为 \(x\)。

对于 \(\forall 1\le x\le N\),求出你选出区间的期望长度。

思路

看到这种题目,首先想到枚举最大值。并用单调栈求出每个数左/右边第一个大于当前数的下标 \(l_i,r_i\)。很显然最大值 \(=A_i\) 的方案数为 \((i-l_i)\cdot (r_i-i)\)。接着我们来推一下长度之和,这里我们令 \(a=i-l_i,b=r_i-l_i-1\):

\[\begin{array}{l} &(a+\dots+b)+((a-1)+\dots+(b-1))+\dots+(1+\dots+(b-a+1))\\ =&\frac{(a+b)\cdot (b-a+1)}{2}+\frac{(a+b-2)\cdot (b-a+1)}{2}+\dots+\frac{(b-a+2)\cdot (b-a+1)}{2}\\ =&\frac{b-a+1}{2}\cdot ((a+b)+(a+b-2)+\dots(b-a+2))\\ =&\frac{b-a+1}{2}\cdot \frac{(2b+2)\cdot a}{2}\\ =&\frac{(b-a+1)\cdot (b+1)\cdot a}{2} \end{array} \]

时空复杂度均为 \(O(N)\)。

代码

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

const int MAXN = 100001, MOD = int(1e9) + 7, inv2 = 500000004;

int n, a[MAXN], stk[MAXN], top, l[MAXN], r[MAXN], sum[MAXN], cnt[MAXN];

int Pow(int a, int b) {
  int ret = 1;
  for(; b; a = 1ll * a * a % MOD, b >>= 1) {
    if(b & 1) {
      ret = 1ll * ret * a % MOD;
    }
  }
  return ret;
}

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];
    r[i] = n + 1;
  }
  for(int i = 1; i <= n; ++i) {
    for(; top && a[stk[top]] < a[i]; r[stk[top--]] = i) {
    }
    l[i] = stk[top];
    stk[++top] = i;
  }
  for(int i = 1; i <= n; ++i) {
    cnt[a[i]] = (cnt[a[i]] + 1ll * (i - l[i]) * (r[i] - i) % MOD) % MOD;
    int L = i - (l[i] + 1) + 1, R = (r[i] - 1) - (l[i] + 1) + 1;
    sum[a[i]] = (sum[a[i]] + 1ll * (R - L + 1) * (R + 1) % MOD * L % MOD * inv2 % MOD) % MOD;
  }
  for(int i = 1; i <= n; ++i) {
    cout << 1ll * sum[i] * Pow(cnt[i], MOD - 2) % MOD << "\n";
  }
  return 0;
}

标签:dots,frac,int,30,2024,cdot,MAXN,dist,初秋
From: https://www.cnblogs.com/yaosicheng124/p/18447177

相关文章

  • NOIP2024集训Day43 博弈论
    NOIP2024集训Day43博弈论F.多边形之战如果这个三角形三个顶点相邻,则先手必胜(第一刀就可以切)否则当黑色三角形只有一边与白色三角形相邻时才可以被切,显然那个白色三角形是最后一个白色三角形于是转化为:有\(n\)个石子,一次只能取一个,问取最后一个的人是谁做完了。G.[BZO......
  • 20241003 模拟赛
    这场...打得还行吧。(至少没有爆零A.旋律的总数难度:橙签到题。只要第一个都选\(1\),就能保证不同。答案为\(m^{n-1}\)。#include<bits/stdc++.h>#definelllonglong#definemod1000000007usingnamespacestd;intT;lln,m;llquickpow(lla,llb){llre......
  • 10.2 代码源 2024 CSP-S 模拟赛 Day 7
    省流:\(55+5+0+10=70\)简称:唐诗T1第一眼发现在二进制下加法不能进位,然后码了个DP就放那了……DP代码:intS=(1<<14)|1;fd(i,0,r[1])f[1][i]=1;fd(i,2,n){fd(j,0,S){f[i][j]=f[i-1][j];for(ints=j;s;s=(s-1)&j){(f......
  • 【刷题笔记】2024.10.4 test
    2024.10.4test虹色的北斗七星思路题目要求\[maxn-minn-len\]的最大值,其中\(maxn\)为区间的最大值,\(minn\)为区间的最小值,\(len\)为区间的长度注意性质,最优的状态一定是区间的左右端点为最大值和最小值时。因为,如果区间左右端点不为最大值或最小值,那么区间长度就可以继续......
  • The 2024 CCPC Shandong Invitational Contest and Provincial Collegiate Programmin
    Preface传说中被杭电1h十题的比赛,结果打到结束也只会10题这场开局就不太顺,一个Easy题C卡到2h的时候才出,虽然中期题基本都能想到但还是出的很慢最后1h讨论了下L的大致做法发现了几个关键性质后觉得写不完了,遂摆烂滚去打炉石了A.Printer签到,二分答案大力检验即......
  • 羊城杯2024WP
    羊城杯-2024webweb2进题信息搜集一下,dirsearch发现了login路由可访问,先随便点一下,发现了一个文件读取:http://139.155.126.78:30148/lyrics?lyrics=Rain.txt我尝试了一下:http://139.155.126.78:30148/lyrics?lyrics=../../../../../../../../etc/passwd发现可以读取:本以为是任意文......
  • [DMY]2024 CSP-S 模拟赛 Day 7
    题目T1T2T3T4当前分数这场打成一坨了。几乎写的全是暴力。赛时开T1,不太会正解,先写了个暴力丢到那儿。胡了一个\(\mathcal{O}(n^2)\)的做法,但是样例假了,照着手推一遍发现错的很彻底。已经过了1h,于是去看T2。T2还是先写出来了暴力思路。感觉这东西......
  • 【题解】Solution Set - NOIP2024集训Day42 博弈论
    【题解】SolutionSet-NOIP2024集训Day42博弈论https://www.becoder.com.cn/contest/5574https://www.cnblogs.com/CloudWings/p/17813917.html「中山市选2009」谁能赢呢?一道经典的「二分图博弈」在棋盘问题上的应用。https://www.luogu.com.cn/article/h8a79k3i......
  • 10.4 代码源 2024 CSP-S 模拟赛 Day 9
    省流:\(100+0+0+0=100\)简称:唐诗T1先写了个暴力,然后在想怎么优化,然后想了个区间DP但是写的时候又不会了……然后发现如果这一块数的二进制每一位都有一个数的这一位为\(0\)或者都相同,那么这些数合并起来一定最优,然后双指针搞,复杂度\(O(30n)\)。(这么绕口)赛后听别人说有......
  • [DMY]2024 CSP-S 模拟赛 Day 9
    T2调了1h没调出来,丢了一坨没分的shi扔了。我想放一下作为开头:include<bits/stdc++.h>#defineintlonglongusingnamespacestd;inlineintread(){intw=1,s=0;charch=getchar();while(!isdigit(ch)){if(ch'-')w=-1;ch=getchar();}while(isdigit(ch)){s=s10+(ch-......