首页 > 其他分享 >CSP模拟 17

CSP模拟 17

时间:2023-08-10 21:57:43浏览次数:59  
标签:cnt 17 ++ else -- ans CSP 模拟 Mod

今天挂了 \(\text{85 \ pts}\),谨记本地编译要开 \(\operatorname{O}_2\),离线处理的题最后输出一定要再排序排回来。

A. 弹珠游戏

考虑用一个 01 串表示每个人的状态,表示每个人所拥有球的情况。

例如 R->100G->010B->001RG->110RB->101BG->011

考虑贪心,对于一个新的弹珠,优先给即将达到三种弹珠都有的人。

举个栗子,对于一个字符串 RGRB

第一个 R 无所谓给谁,对于这个 G 我们还是给第一个得到 R 的人,第二个 R 不能给第一个已经有 R 的人。

对于 B,我们考虑前面两人产生贡献的区间,我们优先交给得到 RG 的人,就可以使得其贡献区间终结,减少多个贡献区间重叠的部分,以使得总的不满意度之和最小。

过程中记录每种状态的人数,随时乘起来就好。

Code

#include <bits/stdc++.h>

using namespace std;

const int Mod = 998244353;

int n;

string st;

int cnt[10];

long long ans = 1;
// R 100
// G 010
// B 001
// RG 110
// RB 101
// BG 011

int main() {
    cin >> n;
    cin >> st;
    
    cnt[000] = n;
    
    for(int i = 0;i < 3 * n; i++) {
        if(st[i] == 'R') {
            if(cnt[011]) {
                ans = (ans * cnt[011]) % Mod;
                cnt[111] ++;
                cnt[011] --;
            }
            else if(cnt[010]) {
                ans = (ans * cnt[010]) % Mod;
                cnt[110] ++;
                cnt[010] --;
            }
            else if(cnt[001]) {
                ans = (ans * cnt[001]) % Mod;
                cnt[101] ++;
                cnt[001] --;
            }
            else if(cnt[000]) {
                ans = (ans * cnt[000]) % Mod;
                cnt[100] ++;
                cnt[000] --;
            }
        }
        else if(st[i] == 'G') {
            if(cnt[101]) {
                ans = (ans * cnt[101]) % Mod;
                cnt[111] ++;
                cnt[101] --;
            }
            else if(cnt[001]) {
                ans = (ans * cnt[001]) % Mod;
                cnt[011] ++;
                cnt[001] --;
            }
            else if(cnt[100]) {
                ans = (ans * cnt[100]) % Mod;
                cnt[110] ++;
                cnt[100] --;
            }
            else if(cnt[000]) {
                ans = (ans * cnt[000]) % Mod;
                cnt[010] ++;
                cnt[000] --;
            }
        }
        else {
            if(cnt[110]) {
                ans = (ans * cnt[110]) % Mod;
                cnt[111] ++;
                cnt[110] --;
            }
            else if(cnt[100]) {
                ans = (ans * cnt[100]) % Mod;
                cnt[101] ++;
                cnt[100] --;
            }
            else if(cnt[010]) {
                ans = (ans * cnt[010]) % Mod;
                cnt[011] ++;
                cnt[010] --;
            }
            else if(cnt[000]) {
                ans = (ans * cnt[000]) % Mod;
                cnt[001] ++;
                cnt[000] --;
            }
        }
    }

    cout << ans;
    return 0;
}

B. 晚会

暴力思路是跑类似 Floyd 的方式多次,跑到出现合法状况为止,复杂度 \(\mathcal{O}(kn^3)\),\(k\) 为未知常数。


考虑树的情况。

假设两棵树内部已经是连好的,那么考虑两棵树之间如何连边。

如果给出的边中有使这两个连通块相连的边,边权为 \(w\),那么这两个连通块中任何两个点之间我们都可以连边权为 \(w\) 的边,这样使得不管两个连通块内部的边权为多少,都满足不会出现不友好情况。

如果给出的边没有使这两个连通块相连的边,也可以理解为最后连完边发现整张图不连通,那我们就可以把这些连通块直接的边都连为 \(1\)。既可以满足保持友好,也能够使得总和最小。

两个连通块之间的连边操作不是真的暴力去连,而是一个限制,未来判断无解的限制。

例如两个连通块之间的边都已经连为 \(5\) 了,那么如果后来出现在这两个连通块间边权为 \(3\) 的点就会产生无解情况。

然后我们发现,边权越小,对其他边的限制就越严格,所以我们跑一个类似最大生成树的操作,优先去连较大的边。

我们把相同边权的边存在一起,第一遍去判这些边是否合法,第二遍去连边,防止出现上一次产生的限制出锅导致判不出无解的情况。

标签:cnt,17,++,else,--,ans,CSP,模拟,Mod
From: https://www.cnblogs.com/baijian0212/p/csp-17.html

相关文章

  • CSP模拟17
    CSP模拟17T1弹珠游戏考虑贪心,枚举右端点,产生贡献的是没有填满的人,所以先让某些人填满是最优的。优先填满已经填了2个的,再填1个的。方案数就是每次填了相同个数的人数的乘积。code#include<iostream>#include<cstdio>#include<cstring>#include<vector>usingnamespaces......
  • LOJ #6039「雅礼集训 2017 Day5」珠宝
    给定\(n\)个物品,第\(i\)个物品有体积\(c_i\),价值\(v_i\)。给定\(K\),对\(1\simK\)的所有\(i\)求大小为\(i\)的背包的最大价值。\(n\leq10^6\),\(K\leq5\times10^4\),\(c_i\leq300\),\(0\leqv_i\leq10^9\),时限\(\text{2.0s}\)。注意到\(c_i\)范......
  • 2023.8.7模拟
    T1DescriptionSolutionCode点击查看T2DescriptionSolutionCode点击查看T3DescriptionSolutionCode点击查看T4抽卡I([THUPC2023决赛]老hu机)link:https://www.luogu.com.cn/problem/P9379Description俺のターン,ドロー!(然后对面就翻开神宣把你拍出去......
  • 【考后总结】8 月 CSP-S 模拟赛 3
    8.10CSP模拟17BohemianRhapsody-QueenIsthisthereallife?Isthisjustfantasy?Caughtinalandslide,noescapefromrealityOpenyoureyes,lookuptotheskiesandseeI'mjustapoorboy,IneednosympathyBecauseI'measycome,eas......
  • 疯狂模拟四V我165分总结
    模拟4总结目录模拟4总结总体上个体上:第一题:第二题没看第三题老师布置的题目:第四题,eZ题目总体上个人感觉这一次做题非常舒服,第一题和第四题都想出来了,只可惜第三题做对了一点(最大值)个体上:第一题:很可惜,tarjan写错了,实际得分是65分......说明算法流程不是很掌握确实tarjan容......
  • CSP模拟-17
    前言仔细想了想,考试的时候其实对正解有些思路,但自己认为正确性有问题,所以没这么写,大寄,考了倒2,呜呜呜┭┮﹏┭┮T1弹珠游戏下面的匹配的含义:\(R\)的匹配指\(G,B\),其中\(R\)为被匹配字母,\(G,B\)为匹配字母;\(G\)的匹配指\(R,B\)以此类推。我们用把每个人现在手里的牌用十......
  • 23 暑假友谊赛 No.4(UKIEPC 2017)
    23暑假友谊赛No.4(UKIEPC2017)ProblemAAlienSunsethh,开始一眼差分,但是写寄了qwq,后来换枚举过了(Orz,但是看学长差分是能做的,我就说嘛,差分肯定能做(说下枚举思路吧,就是把每个区间都存起来,选出自转周期的最大值为\(ma\),然后去枚举\(0\simma\times1825\),每次看......
  • Audition Au 2017音频编辑软件下载和安装教程
    Audition是一款完善的工具集,其中包含用于创建、混合、编辑和复原音频内容的多轨、波形和光谱显示功能。这一强大的音频工作站旨在加快视频制作工作流程和音频修整的速度,并且还提供带有纯净声音的精美混音效果。软件介绍新机载体验为新用户提供了常见任务的一系列指导解决方法,例如......
  • CLO Standalone 7(3D服装设计软件) v7.1.178.42210 (x64)中文永久使用
    CLOStandalone7是一款专业的3D服装设计软件,它为服装设计师和制造商提供了先进的工具和功能,以快速而准确地创建、模拟和可视化服装设计。点击获取CLOStandalone7 CLOStandalone7具有以下主要特点和功能:三维虚拟设计:CLOStandalone7使用先进的三维建模技术,可以在虚拟......
  • UKIEPC 2017
    A-AlienSunset这到题,用一个数组表示当前时间有多少个星球是夜晚,这样就转换成了区间修改单点查询。因为只查询一次,所以用差分即可。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintm=1825*100+5;int32_tmain(){ios::sync_wi......