首页 > 编程语言 >2024“钉耙编程”中国大学生算法设计超级联赛(1)1012并

2024“钉耙编程”中国大学生算法设计超级联赛(1)1012并

时间:2024-07-30 19:50:57浏览次数:8  
标签:钉耙 x1 int 2024 x2 y1 y2 1012 MOD

题目大意 :给出n个矩形,求被k个矩形覆盖的面积的并集的期望,输出k为1-n的所一答案
思路 :由于是求期望所以是求出所有情况的和再除以可能的情况,每一种情况中的面积都由--同时被1个矩形覆盖,同时被两个矩形覆盖······同时被k个矩形覆盖组成,而且不难得出当k一定时,取被m个矩形覆盖的面积次数是一定的,如图:
image
当k为1时 所有的1取均1次,所有的2取均2次
当k为2时 所有的1取均2次,所有的2取均3次
当k为3时 所有的1取均1次,所有的2取均1次
所以现在只需要求出被i个矩形覆盖的面积即可,那么可以通过离散化加拆分在O(\(n^2\))的时间复杂度下进行,最后被k个矩形覆盖的面积就是\(\sum_1^ng(i)\) ,取到这个被覆盖的面积的概率即为总概率减去取不到的概率\(1-\frac{C_{n-i}^k}{C_n^k}\) 即总期望为: \(\sum_1^n(1-\frac{C_{n-i}^k}{C_n^k})g(i)\)

#include<bits/stdc++.h>  
  
#define int long long  
using namespace std;  
const int MOD = 998244353;  
#define all(x) x.begin(),x.end()  
const int N = 4e3 + 10;  
  
void mod(int &x, int a) { if ((x += a) >= MOD) x -= MOD; }  
  
//----------------------------------//头文件和定义  
struct rectangle {  
    int x1, y1, x2, y2;  
};  
  
int n;  
vector<rectangle> rec(N);  
vector<vector<int>> mp(N, vector<int>(N));  
vector<int> rx, ry;  
vector<int> fac(N + 1), invf(N + 1), g(N);  
//------------------------------------//变量创建  
  
void E(vector<int> &a) {  
    a.erase(unique(all(a)), a.end());  
}  
  
void presum(int x1, int x2, int y1, int y2) {  
    mp[x1][y1]++;  
    mp[x1][y2]--;  
    mp[x2][y1]--;  
    mp[x2][y2]++;  
    //cout << x1 <<' '<<x2 <<' '<<y1 <<' '<<y2 <<"\n";  
}  
  
int findidx(vector<int> a, int num) {  
    return lower_bound(all(a), num) - a.begin();  
}  
  
int qpw(int a, int b) {  
    int res = 1;  
    while (b) {  
        if (b & 1) res = res * a % MOD;  
        b >>= 1;  
        a = a * a % MOD;  
    }  
    return res;  
}  
  
void init() {  
    fac[0] = fac[1] = invf[0] = invf[1] = 1;  
    for (int i = 2; i < N; ++i) fac[i] = fac[i - 1] * i % MOD;  
    invf[N - 1] = qpw(fac[N - 1], MOD - 2);  
    for (int i = N - 1; i > 2; --i) invf[i - 1] = invf[i] * i % MOD;  
}  
  
  
//------------------------------------------//建立函数  
  
  
  
void solve() {  
    cin >> n;  
    init();  
    for (int i = 0; i < n; i++) {  
        int x1, y1, x2, y2;  
        cin >> x1 >> y1 >> x2 >> y2;  
        rec[i] = {x1, y1, x2, y2};  
        rx.emplace_back(x1);  
        rx.emplace_back(x2);  
        ry.emplace_back(y1);  
        ry.emplace_back(y2);  
    }  
    rx.emplace_back(-2e9);  
    ry.emplace_back(-2e9);  
    sort(all(rx));  
    E(rx);  
    sort(all(ry));  
    E(ry);  
    for (int i = 0; i < n; i++) {  
        int x1 = findidx(rx, rec[i].x1);  
        int x2 = findidx(rx, rec[i].x2);  
        int y1 = findidx(ry, rec[i].y1);  
        int y2 = findidx(ry, rec[i].y2);  
        presum(x1, x2, y1, y2);  
    }  
    int lrx = rx.size();  
    int lry = ry.size();  
    for (int i = 1; i < lrx; i++) {  
        for (int j = 1; j < lry; j++) {  
            mp[i][j] += mp[i][j - 1];  
        }  
    }  
  
    for (int i = 1; i < lrx; i++) {  
        for (int j = 1; j < lry; j++) {  
            mp[i][j] += mp[i - 1][j];  
            //cout <<i<<' '<<j<<" "<< mp[i][j]<<'\n';  
            g[mp[i][j]] = (g[mp[i][j]] + (rx[i + 1] - rx[i]) * (ry[j + 1] - ry[j]) % MOD) % MOD;  
        }  
    }  
    for (int k = 1; k <= n; ++k) {  
        int ans = 0;  
        for (int t = 1; t <= n; ++t) {  
            if (n - t - k >= 0)  
                ans = (ans + g[t] * (MOD + 1 -  
                                     fac[n - t] * invf[n - t - k] % MOD * fac[n - k] % MOD * invf[n] %  
                                     MOD) % MOD) % MOD;  
            else ans = (ans + g[t]) % MOD;  
        }  
        cout << ans << '\n';  
    }  
}  
  
signed main() {  
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);  
    int _ = 1;  
    //cin >> _;  
    while (_--) {  
        solve();  
    }  
}

标签:钉耙,x1,int,2024,x2,y1,y2,1012,MOD
From: https://www.cnblogs.com/yoez123/p/18333239

相关文章

  • 【调试笔记-20240730-Linux-OpenWrt 23.05 安装 Docker 配置 bitnami/Wordpress-with-
    调试笔记-系列文章目录调试笔记-20240730-Linux-OpenWrt23.05安装Docker配置bitnami/Wordpress-with-NGINX实现微信用户在线注册登录文章目录调试笔记-系列文章目录调试笔记-20240730-Linux-OpenWrt23.05安装Docker配置bitnami/Wordpress-with-NGINX实现......
  • 2024-7-30 信友队模考总结
    开考这次的题目看着比较简单,第一题一眼前缀和,第二题是双指针,三四题不很一眼,感觉可以冲300pts。果然T1直接秒掉,J组难度。开写第二题感觉是双指针,而且也很有单调性,但是怎么实现并没有一下想出来,写了大概10min过了样例和自测,但是观摩的时候发现假了,我写的是伪双指针,\(\math......
  • 企业常用源代码加密软件,2024五款源代码加密软件推荐
    在现代企业中,源代码是核心资产之一,其安全性对企业的竞争力和创新能力至关重要。为了防止代码泄露和未经授权的访问,许多企业选择使用源代码加密软件。以下是2024年五款值得推荐的源代码加密软件,为企业提供可靠的安全保障。1.安秉源代码加密软件安秉源代码加密软件是一款专为......
  • 2024夏令营CTF部分wp
    misc前面几题基本来源于这篇文章>https://blog.csdn.net/qq_45894840/article/details/128346180?spm=1001.2014.3001.5502算是misc的入门级题目,就不多说了1.easy_stego_1是盲水印分离的题目首先拿到题目附件>http://nnd.edaker.com:8999/directlink/2/misc_easy_stego_1.p......
  • 2024 年求职不易,有没有什么效率高的求职方法?
    对于很多打工人来说,今年过得并不容易,不管是打工还是求职,都感觉艰难许多。市场竞争力变大,让许多打工人都感受到了浓浓的“求职焦虑”。对于应届生而言,今年更是具有挑战性的一年,毕业人数量高达1179万人,又创历史新高,毕业生的增多,就意味着就业竞争压力更大…在这样的就业形势下,最......
  • 【往届会后三个半月内EI检索 | EI会议征稿 】第四届物联网与机器学习国际学术会议(IoTM
     第四届物联网与机器学习国际学术会议(IoTML2024)20244th InternationalConferenceonInternetofThingsandMachineLearning重要信息大会时间:2024年8月9-11日         大会地点:中国-南昌        大会官网:www.iotml.cn   会......
  • 2024口碑最好五大骑行耳机精选,实测体验在线分享!
    作为有着多年骑行经验的数码博主,我深刻的明白,在骑行过程中,选择一款合适的耳机至关重要,一款合适的骑行耳机不仅可以增加骑行中的体验,还能保证骑行中的安全,骨传导耳机凭借不入耳佩戴更健康,以及开放式听音等优点成为众多骑行爱好者的首要选择。但随着骨传导耳机热度增加,市面上开始......
  • 2024.7.30 test
    A有一个数\(n\)和\(m\)种操作,第\(i\)次操作使得\(n\getsn/A_i\),问最多遍历多少个数。\(n\le10^5,m\le10\)。不难发现暴力即可通过。B给定集合\(S\),对于每个\(i\in[1,m]\)你需要求出选择数最多和最少的值使得\(\gcd=i\)。\(n,S_i\le3e5\)。首先对于每个\(i......
  • 中国游戏出海启示录:2024市场复苏下的对策
    2024年,全球游戏市场迎来了新的复苏浪潮。根据《2023年中国游戏出海研究报告》的数据,全球游戏市场规模达到了11773.79亿元,同比增长6.00%。然而,在这股复苏的浪潮中,中国游戏出海企业却面临着前所未有的挑战。人民币收付:跨境电商的痛点对于外国的跨境电商来说,进入中国市场是一个充满......
  • 2024/07/30 每日一题
    LeetCode2961双模幂运算方法1:快速幂classSolution:defgetGoodIndices(self,variables:List[List[int]],target:int)->List[int]:ans=list()fori,(a,b,c,m)inenumerate(variables):res=self.getVal(a%10,b)......