首页 > 其他分享 >AtCoder Beginner Contest 323 (ABC 323) D、E、F 题解

AtCoder Beginner Contest 323 (ABC 323) D、E、F 题解

时间:2023-10-08 16:35:25浏览次数:35  
标签:AtCoder xb 题解 ll yb 323 ya && mod

AtCoder Beginner Contest 323 (ABC 323) D、E、F 题解

D

题目大意

给 \(n\) 种数 \(s_i\) ,每一种数有 \(c_i\) 个,每次可以把两个相同的数合并为一个数,问最后会剩下多少数?

分析

对于每一个数 \(s_i\) ,它最多被分解 \(log_2c_i\) 次,并且合并出来最大的数的大小小于 \(s_i\times c_i\)

如果将 \(s_i\) 合并,这个操作是对任意小于 \(2s_i\) 的数没有影响的。

因此考虑维护一个堆,每次将最小的数尽量合并,如果该元素只剩一个就将其踢出去并让答案+1。

Code (用优先队列写很慢~)

#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false); cin.tie(0)
using namespace std;
using ll = long long;
const int N = 1e5 + 5;
int n;
ll s[N], c[N];
map<ll, ll> cnt;

int main() {
    IO;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> s[i] >> c[i];
        cnt[s[i]] += c[i];
    }
    ll ans = 0;
    while (!cnt.empty()) {
        auto [x, y] = *cnt.begin();
        cnt.erase(cnt.begin());
        ans += y % 2;
        if (y > 1) {
            cnt[x*2] += y / 2;
        }
    }
    cout << ans;
    return 0;
}

E

题目大意

给 \(n\) 首歌,每首持续时间 \(T_i\) ,当没有歌正在播放时,在 \(n\) 首歌里随机播放一首,问第 \(x + 0.5\) 秒时第一首歌正在播放的概率

分析

应该说我的方法不如官方题解

如果第 \(x + 0.5\) 秒正在播放的是第一首歌,那么这首歌开始播放的时间应该是 \([x-t_1+1,x]\)

考虑 \(f[i][j]\) 表示当前为第 \(i\) 秒,正准备开始播放第 \(j\) 首歌的概率

那么最终的结果就是 \(\sum\limits_{i=x-t_1+1}^{x} f[i][1]\)

可以得到比较暴力的转移式子:$f[i][j] = \sum_{k=1}^{n}\frac{1}{n}f[i-t[k]][k] $

在实现的时候,可以写成 f[i+t[j]][k] += f[i][j] / n

那么注意到,无论 \(k\) 是几,都会收到 \(f[i][j]\) 的一份转移

那么用 \(sum[i]\) 记录第 \(i\) 秒会加上多少,在考虑第 \(i\) 秒时,加上 \(sum[i]\) 就可以了

注意分数逆元是可以直接加减的

对于两个分数 \(\frac{a}{b}\) 和 \(\frac{c}{d}\) ,它们各自在模 \(p\) 下的值为 \(a \times inv_b\) 和 \(c \times inv_d\)

当它们相加时,

\[\begin{aligned} (\frac{a}{b}+\frac{c}{d}) ~mod~p &= \frac{ad+bc}{bd}~mod~p \\ &= (ad+bc) \times inv_{bd} ~mod~p~(注意d\times inv_{bd}=inv_b)\\ &= (a \times inv_b + c \times inv_d)~mod~p \\ \end{aligned} \]

Code

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 998244353;
const int N = 1005, M = 3e4 + 5;
int n, x;
ll t[N];
ll qpow(ll x, ll y) {
    ll res = 1;
    while (y) {
        if (y & 1) res = res * x % mod;
        y >>= 1;
        x = x * x % mod;
    }
    return res;
}
ll f[M][N], sum[M];
ll frac(ll a, ll b) {
    return (a * qpow(b, mod - 2) % mod + mod) % mod;
}

int main() {
    cin >> n >> x;
    for (int i = 1; i <= n; i++) cin >> t[i];
    for (int i = 1; i <= n; i++)
        f[0][i] = frac(1, n);
    for (int i = 0; i <= x; i++) {
        for (int j = 1; j <= n; j++) {
            f[i][j] = (f[i][j] + sum[i]) % mod;
            sum[i+t[j]] = (sum[i+t[j]] + frac(f[i][j], n)) % mod;
        }
    }
    ll res = 0;
    for (int i = max(0ll, x - t[1] + 1); i <= x; i++) 
        res = (res + f[i][1]) % mod;
    cout << res;
    return 0;
}

F

AtCoder 你确定没有把 D 和 F 放反吗???

题目大意

\((x_a,y_a)\) 点站了一个人,\((x_b,y_b)\) 点有一个箱子,人要把箱子推到 \((x_c,y_c)\) 去,人和箱子不会出现在同一坐标,会把箱子挤走

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

ll Abs(ll a) {
    return a > 0 ? a : -a;
}

int main() {
    ll xa, ya, xb, yb, xc, yc;
    cin >> xa >> ya >> xb >> yb >> xc >> yc;
    ll ans = 0;
    ans = Abs(xa - xb) + Abs(ya - yb) + Abs(yc - yb) + Abs(xc - xb) - 1;
    if (xa == xb && xb == xc) {
        if ((ya < yb && yc < yb) || (ya > yb && yc > yb))
            ans += 4;
        cout << ans;
        return 0;
    }
    if (ya == yb && yb == yc) {
        if ((xa < xb && xc < xb) || (xa > xb && xc > xb))
            ans += 4;
        cout << ans;
        return 0;
    }
    if ((xa <= xb && xc < xb) || (xa >= xb && xc > xb))
        ans += 2;
    if ((ya <= yb && yc < yb) || (ya >= yb && yc > yb))
        ans += 2;
    if ((ya < yb && yb < yc && xa > xb && xb > xc) || (ya > yb && yb > yc && xa < xb && xb < xc))
        ans += 2;
    if ((ya < yb && yb < yc && xa < xb && xb < xc) || (ya > yb && yb > yc && xa > xb && xb > xc))
        ans += 2;
    cout << ans;
    return 0;
}

标签:AtCoder,xb,题解,ll,yb,323,ya,&&,mod
From: https://www.cnblogs.com/tonyhgf/p/17749523.html

相关文章

  • Hadoop问题解决(3)
    在启动hadoop过程中,出现如下错误:192.168.10.100:Invalidmaximumheapsize:-Xmx0m192.168.10.100:CouldnotcreatetheJavavirtualmachine.192.168.10.100:jobtracker已死,但pid文件仍存此时查看jobtracker的日志,1[root@ccloud100manager]#vim/var/log/hado......
  • hadoop问题解决(4)
    默认配置是将datanode,namenode,jobtracker,tasktracker,secondarynamenode的pid存放在/tmp目录下,随着linux的定期清理,这些pid就不见了,当然就无法停止了,怎么解决呢?在/tmp目录创建或者修改hadoop-hadoop用户名-datanode.pid 里面写入对应的pid, 可通过jps查看. namen......
  • ABC323
    LinkA很简单Bsort+struct+cmp函数C排个序举行D显然的,我们可以从最小的开始进行合并,合并的越多越好。但是可以注意到\(S_i\)的跨度相当的大,这怎么办呢?我们可以使用STl中的map来解决,每一次取出map.begin()出来并且将其删除来解决。E一个很简单的线形DP,定义\(dp_i\)为在i处......
  • 【UVA 12657】Boxes in a Line 题解(静态双向链表)
    您在编号为1的表格上有n个方框。n从左到右。您的任务是模拟4命令类型:•1XY:将框X向左移动到Y(如果X已经是Y的左侧,则忽略此项)•2XY:将框X向右移动到Y(如果X已经是Y的右侧,则忽略此项)•3XY:交换盒X和Y•4:反转整条线路。命令保证有效,即X不等于Y。例如,如果n=6,在执行114之后,该行......
  • AtCoder Beginner Contest 323
    E-Playlist首先需要算出第x+0.5秒后,第一首歌播放的概率1.要在x+0.5秒后播放第一首,需要在x,x-1,x-2,...,x-t[1]+1,时就要开始播放第一首,并且概率是1/n,概率之和除以n2.概率dp,dp[i]表示播放i的概率,那么可以转换成,dp[i]+=dp[i-j]/n%mod(i>=t[j])3.答案就是x,x-1,...,x-t[1]+1概率之和......
  • UNIQUE VISION Programming Contest 2023 Autumn(AtCoder Beginner Contest 323)
    UNIQUEVISIONProgrammingContest2023Autumn(AtCoderBeginnerContest323)A.WeakBeats解题思路:按题意模拟即可。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;voidsolve(){strings;cin>>s;intn=s.size();......
  • 题解:洛谷P1119 灾后重建
    题解:洛谷P1119灾后重建题目传送门前言:没有掌握floyed求最短路的精髓是每次增加选一个中转点,导致写了2h才勉强卡过法1:最暴力的想法就是开个三维数组把前i个点的dis状态全部存下来,跑N次floyed,当然由于每次点数时递增的,所以实际复杂度远远小于O(N^4),算了下大概200个点跑了4e8多一......
  • 网络规划设计师真题解析--独立磁盘冗余阵列(二)(容量的计算)
    假如有3块容量是160G的硬盘做RAID5阵列,则这个RADI5的容量是(1);而如果有2块160G的盘和1块80G的盘,此时RAID5的容量是(2)。(1)A.320G    B.160G     C.80G     D.40G(2)A.40G     B.80G     C.160G    D.200G答案:(1)A (2)C解析:常见的RAID......
  • destoon : 后台无法登录问题解决
    经常有朋友在destoon搬家的时候,数据还原之后,会出现后台无法登录的情况.具体表现为后台帐号密码输入后点击确定,页面刷新.并没有跳转到相应后台页面.但是如果帐号密码输入错误,会提示密码错误的情况.这种情况多半是原系统设置中,设置了cookie作用域的问题,如......
  • ABC323
    T1:WeakBeats模拟代码实现s=input()foriinrange(1,len(s),2):ifs[i]=='1':exit(print('No'))print('Yes')T2:Round-RobinTournament模拟代码实现#include<bits/stdc++.h>#definerep(i,n)for(inti=0......