首页 > 其他分享 >0724 考试记录

0724 考试记录

时间:2024-07-24 13:52:00浏览次数:5  
标签:10 0724 记录 int 复杂度 long MAXN 考试 MOD

0724 考试记录

总结:

  1. 多打暴力,不费时间并且对分数非常有用
  2. 交之前检查一遍代码,包括静态查错以及 记得关掉注释!!! (本场比赛因此爆零)
  3. 对于以上,建议保证在写下一道题的时候反复检查上一道的代码为成品

以下是考试题目分析&总结:

T1

题意简述:

给你一个序列 $ l $ 与正整数 \(T\) , 求出满足条件\(\lfloor \frac{l_a} {l_b} \rfloor + \lfloor \frac{l_c}{l_d} \rfloor = T\) 的四元组\((a, b, c, d)\)数量

$ 1≤n≤10^6 ,,, 0≤T ≤10^6 ,,, 1≤ l_i ≤10^6 $

思路:

首先一个非常显然的思路是我们去枚举 \(a, b\) , 然后组合计数即可

但是这样的复杂度我们显然是不能接受的

我们考虑优化. 不难发现我们可以用桶+前缀和来快速求得某一连续区间的数的数量, 结合整数分块, 我们可以做到\(O(n \sqrt n)\)的复杂度. 这个复杂度我们可以做到80pts

我们考虑进一步优化. 在这个算法中有三个求解量: \(s_a \,\,\,s_b\,\,\,\lfloor\frac{s_a}{s_b}\rfloor\) 我们刚刚相当于枚举了\(s_a \,\,\,s_b\) 然后进行了优化.我们此时可以考虑枚举\(s_b {和} \lfloor\frac{s_a}{s_b}\rfloor\)看看复杂度能否获得提升

我们不难发现对于一个固定的\(s_b\)和商, 其对应的\(s_a\)范围非常好找, 即\([s_b * i, s_b * i + s_ b- 1]\)

对于一个固定的\(s_b\), 其能做出的贡献次数为 \(\frac{n}{s_b}\) 根据调和级数, 总和为\(\log n\)级别 至此, 我们完成了复杂度的优化, AC本题.

\(n \sqrt n\)做法
#include<bits/stdc++.h>
using namespace std;

const int MAXN = 1e6 + 10, MOD = 998244353;
int n, T;
int l[MAXN];
long long t[MAXN];
long long ans[MAXN];

long long sum = 0;

vector <pair<int, int> > pir[MAXN];

inline void ad(long long &to, long long a){
    to = (to + a) % MOD;
}

int main(){

    freopen("floor.in","r",stdin);
    freopen("floor.out","w", stdout);

    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);

    cin >> n >> T;

    for(int i = 1; i <= n; i++){
        cin >> l[i]; t[l[i]] ++;
    }   

    for(int i = 1; i <= 1e6; i++) t[i] += t[i - 1];

    // for(int i = 1; i <= 10; i++) cout << t[i] << " ";
    // cout << "\n";

    for(int i = 1; i <= 1e6; i++){
        if(t[i] == t[i - 1]) continue;

        // cout << "getin " << i << "\n";
        int nownum = t[i] - t[i - 1];

        // ad(ans[l], 1ll * nownum * nownum);

        double sq = sqrt(i); int last = 1;

        for(int j = 1; j <= sq; j++){
            // cout << "first part of " << i << " with " << j << "\n";
            ans[i / j] = (ans[i / j] + 1ll * nownum * (t[j] - t[j - 1])) % MOD;
            last = j + 1;
        }


        // cout << last << "\n";

        for(int j = last - 1; j >= 1 && last <= i; j--){
            // cout << "second part of " << i << " with " << j << "\n";
            int nex = i / j;
            ans[j] = (ans[j] + 1ll * nownum * (t[nex] - t[last - 1])) % MOD;
            last = nex + 1;

            // cout << ans[j] << "\n";
        }

        ans[0] += nownum * (t[(int)1e6] - t[i]);
    }
    // cout << "\n";
//    for(int i = 0; i <= 100; i++) cout << ans[i] << "\n";
//     cout << "\n";
    for(int i = 0; i <= T; i++) ad(sum, 1ll * ans[i] * ans[T - i]);

    cout << sum;
    return 0;
}

100pts做法

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

const int MAXN = 2e6 + 10, MOD = 998244353;
int n, T;
int l[MAXN];
long long t[MAXN];
long long ans[MAXN];

long long sum = 0;

vector <pair<int, int> > pir[MAXN];

inline void ad(long long &to, long long a){
	a %= MOD;
    to = (to + a) % MOD;
}

int main(){

    freopen("floor.in","r",stdin);
    freopen("floor.out","w", stdout);

    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);

    cin >> n >> T;

    for(int i = 1; i <= n; i++){
        cin >> l[i]; t[l[i]] ++;
    }   

    for(int i = 1; i <= 2e6; i++) t[i] += t[i - 1];

    for(int i = 1; i <= 1e6; i++){
        if(t[i] == t[i - 1]) continue;
        
        long long nownum = t[i] - t[i - 1];

        for(int j = 1; j * i <= 1e6; j++){
			ans[j] += 1ll * nownum * ((t[i * (j + 1) - 1] - t[i * j - 1]) % MOD);
			ans[j] %= MOD; 
		}
		
		ans[0] += t[i - 1] * nownum;
		ans[0] %= MOD;
    }
    
    for(int i = 0; i <= T; i++) ad(sum, 1ll * ans[i] * ans[T - i]);

    cout << sum;
}

标签:10,0724,记录,int,复杂度,long,MAXN,考试,MOD
From: https://www.cnblogs.com/wwzzhhone/p/18320740

相关文章

  • 2024-07-24 想法记录,关于 可以准点睡觉 和 拖延寄快递
    2024-07-24     昨天晚上可以及时睡觉,比原来早,12点以前睡下来,11点半闭上的眼。之前的晚睡,怎么突然在这一会就可以变回来了呢? 我思考了一下,最重要的原因,我看见自己下巴和两鬓的白胡子,白发了。我才人到中年而已,年纪不大就已经头发胡子都变白了,不敢再熬夜了。再仔细感受......
  • 微信小游戏0基础学习记录:1.起步-制作简单游戏的新手引导(完成)
     前情提要: 微信小游戏0基础学习记录:0.一些准备知识&起步 上一篇博客介绍到了官方教程“制作简单游戏的新手引导”的第一阶段,“创建并编译3D场景”。这一篇将继续完成新手引导的剩余内容,包括2D场景的创建与编辑、游戏项目的播放与构建等等。官方文档:快速上手|微信开放......
  • Python函数获取匹配和错误记录
    我有一个以下格式的json文件:[{"type":"BEGIN","id":"XYZ123"},{"type":"END","id":"XYZ123",},{"type":&......
  • Codeforces Round 961 (Div. 2) 补题记录(A~D)
    上大分,赢!A考虑将每一条对角线上可以存放的砝码数量都记录一下,从大到小排序,然后直接暴力贪心选择。此时可以发现数量一定形如\(n,n-1,n-1,n-2,n-2,n-3,n-3,\ldots,1,1\)这样的形式。直接暴力减即可。时间复杂度为\(O(n)\)。#include<bits/stdc++.h>#defineintlonglong......
  • Verilog HDL 的简单组合逻辑设计代码学习记录
    1.比较数据a和b,若两个数据相同则输出1,否则输出0(a、b均为单比特)看需求就简单设置输入a,b,输出o。modulecompare(a,b,o);inputa;inputb;outputo;//先来第一种写法,使用?:,这里是默认全是wire类型assigno=(a==b)?1'b1:1'b0;//第二种写法,使用ifelserego;alwa......
  • 记录下Visual Studio 2022配置mysql
    visualstudio能够连接mysql只需要以下几步即可寻找mysql安装路径,如果你没有选择默认在C盘下ProgramFiles下mysql文件夹里,找到include和lib文件夹,分别复制路径。我们接下来来到visualstudio中,右键项目选择properties再将刚才复制的include跟lib的路径添加到Include......
  • 记录一下oracle 19c的集群节点移除、新增操作
    虽然掌握得不够深入,但越来越讨厌oracle数据库这个软件了,实在不愿意再孤岛这个笨重、复杂的oracle了。今天花了好几个小时操作一个实验环境的迁移、配置,记录几个步骤吧,也许后续会有用。■查看数据库配置信息[oracle@node1:0~]$srvctlconfigdatabase-dblikingdbDatabaseu......
  • shardingjdbc 使用记录
    注意几个概念:数据源,数据源别名(shardingjdbc的配置会给每个数据源配置别名)db实例(物理概念),逻辑库如果db实例是同一个的话,那么可以只配置一个数据源,通过shardingjdbc的路由策略来路由到具体的逻辑库。这样可以降低db的连接数。  配置了hint的路由策略,但是没有生效,断点......
  • 2024年华为OD机试真题-执行时长-C++-OD统一考试(C卷D卷)
    2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述:为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务,假设GPU最多一次执行n个任务,一次执行耗时1秒,在保证GPU......
  • Three.js针对.gltf类型建模文件封装记录
    记录Three.js代码组件封装片段,支持定制旋转位置大小配置three.js官方连接:Three.js中文网3D模型文件下载地址:3D模型可视化编辑器完整效果图片封装文件位置:utils文件夹下 依赖安装:"dependencies":{"three":"^0.165.0","three-obj-mtl-loader":"^1.......