洛谷P1494 小Z的袜子

本文深入探讨了莫队算法的原理与实现,通过具体题目解析了如何在区间查询问题中高效地计算任意两个元素相同的概率。文章详细介绍了算法的核心思想,包括数据结构的运用、时间复杂度的优化以及具体的代码实现。

题意:在[l, r]之中任选两个数,求它们相同的概率。

解:

莫队入门。

概率这个很好搞,就是cnt * (cnt - 1) / 2。

然后发现每次挪指针的时候,某一个cnt会+1或-1。这时候差值就是2 * cntsmall

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cmath>
 4 
 5 typedef long long LL;
 6 const int N = 50010;
 7 
 8 int a[N], bin[N], fr[N];
 9 LL ans;
10 
11 struct ASK {
12     int id, l, r;
13     LL ans;
14     inline bool operator <(const ASK &w) const {
15         if(fr[l] != fr[w.l]) {
16             return fr[l] < fr[w.l];
17         }
18         return r < w.r;
19     }
20 }ask[N];
21 
22 inline bool cmp(const ASK &a, const ASK &b) {
23     return a.id < b.id;
24 }
25 
26 inline LL gcd(LL a, LL b) {
27     if(!b) {
28         return a;
29     }
30     return gcd(b, a % b);
31 }
32 
33 inline void add(int x) {
34     ans += bin[a[x]] << 1;
35     bin[a[x]]++;
36     return;
37 }
38 
39 inline void del(int x) {
40     bin[a[x]]--;
41     ans -= bin[a[x]] << 1;
42 }
43 
44 int main() {
45     int n, m;
46     scanf("%d%d", &n, &m);
47     int T = sqrt(n);
48     for(int i = 1; i <= n; i++) {
49         scanf("%d", &a[i]);
50         fr[i] = (i - 1) / T + 1;
51     }
52     for(int i = 1; i <= m; i++) {
53         ask[i].id = i;
54         scanf("%d%d", &ask[i].l, &ask[i].r);
55     }
56     std::sort(ask + 1, ask + m + 1);
57 
58     int L = 1, R = 1;
59     bin[a[1]]++;
60     for(int i = 1; i <= m; i++) {
61         if(ask[i].l == ask[i].r) {
62             continue;
63         }
64         while(ask[i].l < L) {
65             add(--L);
66         }
67         while(R < ask[i].r) {
68             add(++R);
69         }
70         while(L < ask[i].l) {
71             del(L++);
72         }
73         while(ask[i].r < R) {
74             del(R--);
75         }
76         ask[i].ans = ans;
77     }
78 
79     std::sort(ask + 1, ask + m + 1, cmp);
80     for(int i = 1; i <= m; i++) {
81         if(!ask[i].ans || ask[i].l == ask[i].r) {
82             puts("0/1");
83             continue;
84         }
85         int g = gcd(ask[i].ans, 1ll * (ask[i].r - ask[i].l + 1) * (ask[i].r - ask[i].l));
86         printf("%lld/%lld\n", ask[i].ans / g, 1ll * (ask[i].r - ask[i].l + 1) * (ask[i].r - ask[i].l) / g);
87     }
88     return 0;
89 }
AC代码

 

转载于:https://www.cnblogs.com/huyufeifei/p/10187683.html

【3D应力敏感度分析拓扑优化】【基于p-范数全局应力衡量的3D敏感度分析】基于伴随方法的有限元分析和p-范数应力敏感度分析(Matlab代码实现)内容概要:本文档介绍了基于伴随方法的有限元分析与p-范数全局应力衡量的3D应力敏感度分析,并结合拓扑优化技术,提供了完整的Matlab代码实现方案。该方法通过有限元建模计算结构在载荷作用下的应力分布,采用p-范数对全局应力进行有效聚合,避免传统方法中应力约束过多的问题,进而利用伴随法高效求解设计变量对应力的敏感度,为结构优化提供关键梯度信息。整个流程涵盖了从有限元分析、应力评估到敏感度计算的核心环节,适用于复杂三维结构的轻量化与高强度设计。; 适合人群:具备有限元分析基础、拓扑优化背景及Matlab编程能力的研究生、科研人员与工程技术人员,尤其适合从事结构设计、力学仿真与多学科优化的相关从业者; 使用场景及目标:①用于实现高精度三维结构的应力约束拓扑优化;②帮助理解伴随法在敏感度分析中的应用原理与编程实现;③服务于科研复现、论文写作与工程项目中的结构性能提升需求; 阅读建议:建议读者结合有限元理论与优化算法知识,逐步调试Matlab代码,重点关注伴随方程的构建与p-范数的数值处理技巧,以深入掌握方法本质并实现个性化拓展。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值