首页 > 其他分享 >新赛道-2024.8 CSP-J组月赛-T3

新赛道-2024.8 CSP-J组月赛-T3

时间:2024-09-01 11:03:04浏览次数:10  
标签:赛道 tmp 王老师 三好学生 2024.8 de 100005 int 组月赛

题目描述

王老师的班级要开始评选三好学生啦,最后要评选两个人出来。

王老师班级一共有 n 个学生,编号分别为 1,2,…,n,每个人把自己心中的两名最佳三好学生 a 和 b 告诉 王老师。

  • 可能存在两个人,他们心中的两名最佳三好学生是相同的。例如样例 1 所示。

现在 王老师 要选出两个人,为了让学生们满意,至少需要 m 个人同意最后的决定。所谓同意指的是,某班级学生同意这最终名单,当且仅当该学生心中的两名最佳三好学生至少有一个出现在最终名单里。

请你帮 王老师 算算,有多少种可能的组合(与选出来的人的顺序无关),符合条件

数据范围

对于 60% 的数据,n 的范围 [3,104];

对于 100% 的数据,n 的范围 [3,105], m 的范围 [0,n],并且保证 a=b,1≤a,b≤n

 

根据题目可知,我们可以用一个后缀数组s来维护其间重复的人同意数,则我们可以枚举i,找到最小的答案,则在它后面的所有值便都是答案,最后/2去掉重复条件即可。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
int a,b,d[100005],cnt[100005],s[100005],num[100005],vis[100005],n,m,ans;
vector<int>g[100005];

signed main(){
    freopen("vote.in","r",stdin);
    freopen("vote.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a>>b;
        d[a]++,d[b]++;
        g[a].push_back(b),g[b].push_back(a);
    }
    for(int i=1;i<=n;i++)++cnt[d[i]];
    for(int i=n;i>=0;i--)s[i]=s[i+1]+cnt[i];
    for(int i=1;i<=n;i++){
        int de=m-d[i];
        if(de<=0)ans+=n-1;
        else {
            int tmp=s[de];
            if(d[i]>=de)tmp--;
            for(int j=0;j<g[i].size();j++)num[g[i][j]]=vis[g[i][j]]=0;
            for(int j=0;j<g[i].size();j++)num[g[i][j]]++;
            for(int j=0;j<g[i].size();j++){
                int v=g[i][j];
                if(vis[v])continue;
                vis[v]=1;
                if(d[v]>=de && d[v]-num[v]<de)tmp--;
            }
            ans+=tmp;
        }
    }
    cout<<ans/2;
    return 0;
} 总结:我在写这题时虽然没能想出正解,但看出了%60数据O(n^2)能过,于是用了个map来存重复数量,但是在循环内map每次新建,浪费了许多空间,需要先判断是否存在,这的确是我不知道的点,需要加强。

标签:赛道,tmp,王老师,三好学生,2024.8,de,100005,int,组月赛
From: https://www.cnblogs.com/qianqian2022/p/18391101

相关文章

  • 新赛道-2024.8 CSP-J组月赛-T1总结
    题面:王老师最近做了一道经典问题《翻纸牌》现在王老师有 n 张牌,编号分别为 1,2,3…n,每张牌一开始都是背面朝上的现在他要进行 n 轮操作,第 i 轮操作时候,他会将所有编号是 i 的倍数的牌正反翻面现在王老师想知道,当他进行完 n 轮操作以后,所有正面朝上的牌的编号......
  • Burp Suite Professional 2024.8 发布下载,新增功能概览
    BurpSuiteProfessional2024.8(macOS,Linux,Windows)-Web应用安全、测试和扫描BurpSuiteProfessional,Test,find,andexploitvulnerabilities.请访问原文链接:https://sysin.org/blog/burp-suite-pro/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgBur......
  • 2024.8.31 总结(集训 考 DP)
    今天依然是上午考DP,三个小时四道题。我觉得今天的题目较昨天更简单。考场上就想出了四个题,但是我以为T1\(O(n^3)\)的做法是暴力,想了好久T1也没想出更好的做法,于是开写,然后造数据测了测,发现跑得比较快(极限数据应该也是能在我的位置上那台电脑里1s内过的)。结果出分是330,......
  • 2024.8.31随笔
    前言开学了,不能每天写东西发博客了,但是我还是准备拿笔记录一下每一天的东西,总之最近还不会停课,可以放松一段时间。但是文化课也不能落下啊喵!自习这段时间除了最开始写了一篇字符串的博客,其他时间都在写dp题。然后坚持写做题的感想和题解,虽然今天没有遇到好题,或者说看到题但没......
  • 2024.8.31杂记
    P1249最大乘积题目描述一个正整数一般可以分为几个互不相同的自然数的和,如\(3=1+2\),\(4=1+3\),\(5=1+4=2+3\),\(6=1+5=2+4\)。现在你的任务是将指定的正整数\(n\)分解成若干个互不相同的自然数(也可以不分解,就是这个数字本身)的和,且使这些自然数的乘积最大。输入格式只一个正整......
  • 2024.8.30 总结(集训 考 DP)
    上午三个多小时考四道题的DP。赛时会的分:[100](?)+100+[30](?)+100。估分:100+100+0+100。实际分:10+100+0+100。挂巨量的分,挂了120分。下面是一些值得注意的点:T1就是分组背包。DP数组下标要考虑负数可以直接全体加一个值变成非负的,[或者用map之类的](?)(&不......
  • 2024.8.29 总结
    上午&中午按计划学了李超线段树,照着题解写过了模板题。然后本来打算去做题单里的一道Ynoi紫来练dsuontree,于是边写题解边想,结果写着写着就不会了,发现好像dsuontree不太好做,好像是两只log的。还可能大概会一个单log大常数线段树合并。看题解区发现有跑出dfs序后......
  • 2024.8.24-美团
    第3题-塔塔商店线段树,因为需要返回区间最大值的id,所以对于建树、更新、检索部分需要进行修改#include<bits/stdc++.h>usingnamespacestd;#definelcp<<1#definercp<<1|1constintN=1e5+5;intc[N];structsegtree{structnode{intl,r,id;......
  • 2024.8.28 总结
    上午做了一个很板的广义SAM题,算是练了一下广义SAM,当时基本上能自己写出广义SAM了,但是还是写错了两个地方(好像是把p写成了q)。大概是做完这道题之后我去看了看lr的博客,发现他的博客里有计划。于是我也写了一个最近的计划。在这之后我就去挑了个较基础的SA题来写。后缀......
  • 2024.8.27
    DATE#:20240827ITEM#:DOCWEEK#:TUESDAYDAIL#:捌月廿肆TAGS<BGM="Dragonflame--KiraraMagic"><theme=oi-contest><theme=oi-datastructureSegment><[空]><[空]>```渊沉鳞潜,冻血锈骨闭魂眼;披风游焰,穿峡掠谷骋日月。```......