【题解】小Z的袜子

摘要:
在检查原始问题时,请戳这里,突然觉得qxy和小z是同类生物Mo Team的赤裸裸的问题。尽管Mo Team是一个暴力算法,但ta仍然是一些问题的积极解决方案。这个问题只有经过一定的数学推导才能解决。让颜色为x、y、z的袜子的数量为a、b、c……那么答案可以/简化为:/即:/所以问题变成了a^2+b^2+c^2+…x^2。这个过程可以由Mo团队实现。

查看原题请戳这里

突然感觉qxy和小z是同种生物
莫队的一道裸题

虽说莫队算是一种暴力的算法,但ta依然是某些题目的正解的。(dfs:我不服)

这道题是需要我们经过一定的数学推导才可以做出来的。

具体过程如下:

对于L,R的询问。 设其中颜色为x,y,z的袜子的个数为a,b,c… 那么答案即为 (a*(a-1)/2+b*(b-1)/2+c*(c-1)/2....)/((R-L+1)*(R-L)/2) 化简得: (a^2+b^2+c^2+...x^2-(a+b+c+d+.....))/((R-L+1)*(R-L)) 即: (a^2+b^2+c^2+...x^2-(R-L+1))/((R-L+1)*(R-L)) 于是这道题目变成了求a^2+b^2+c^2+...x^2,这个过程我们可以用莫队去实现。 附一下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define re register
#define INF 0x7fffffff

using namespace std;

long long read()
{
long long x = 0,f = 1; char ch;
ch = getchar();
while(ch >'9' || ch < '0'){if(ch == '-') f = -f; ch = getchar();}
while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0'; ch = getchar();}
return x * f;
}

long long gcd(long long a, long long b){return a == 0 ? b : gcd(b % a, a);}

long long n,m,a[50005],xsort,p1,p2,t[50005],ans,cnt,g,ll,rr,in[50005],save1[50005],save2[50005];

struct query{
long long l,r,num;
}q[50005];

long long mysort(query x, query y)
{
if(x.l / xsort == y.l / xsort) return x.r < y.r;
return x.l < y.l;
}

long long work(long long x)
{
return x * x;
}

void add(long long k)
{
long long u = a[k];
if(k == 0) return ;
ans = ans - work(t[u]);
t[u] ++;
ans = ans + work(t[u]);
}

void del(long long k)
{
long long u = a[k];
if(k == 0) return ;
ans = ans - work(t[u]);
t[u] --;
ans = ans + work(t[u]);
}

int main()
{
n = read(); m = read();
for(re int i = 1; i <= n; i ++) a[i] = read();
for(re int i = 1; i <= m; i++)
{
q[i].l = read();
q[i].r = read();
q[i].num = i;
}
xsort = sqrt(n);
sort(q + 1, q + m + 1, mysort);
for(re int i = 1; i <= m; i++)
{
ll =q[i].l; rr = q[i].r;
while(p1 < ll){del(p1); p1 ++;}
while(p1 > ll){p1 --; add(p1);}
while(p2 < rr){p2 ++; add(p2);}
while(p2 > rr){del(p2); p2 --;}
cnt = (rr - ll + 1) * (rr - ll);
save1[q[i].num] = ans - (rr - ll + 1);
save2[q[i].num] = cnt;
}
for(re int i = 1; i <= m; i++)
{
if(save1[i] != 0 && save2[i] != 0) g = gcd(save1[i],save2[i]);
else g = 1;
if(save1[i] == 0 || save2[i] == 0) {printf("0/1 "); continue ;}
printf("%d/%d ",save1[i] / g,save2[i] / g);
}
return 0;
}

免责声明:文章转载自《【题解】小Z的袜子》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Tomcat性能调优及性能测试工具配置生成公钥和私钥----OpenSSL和keytool下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

微信小程序 webview直接关闭所有回到小程序

解决方案:通过微信浏览器监控返回键和H5跳转小程序。...

关于服务器并发量的简单计算

最简单的计算方式就是根据服务器带宽与页面的大小1.假设机房带宽为10Mbs,页面的大小为20KB同时并发量的理论值:10*1024/=64个请求/秒理论上1秒钟同时可以有64个请求访问页面。本考试系统,登陆的页面容量比较大,所有的js,css以及图片未优化前在400KB左右,我们就以400KB为基准,所有后面要用的文件是在首页一次性加载下来的。这一天的测评情...

MySQL 字段类型占用空间

MySQL支持多种列类型:数值类型、日期/时间类型和字符串(字符)类型。)1或2个字节,取决于枚举值的个数SET(‘value1’,’value2’,…)1、2、3、4或者8个字节,取决于set成员的数目上表的M只是为了说明占用空间大小,在实际创建表中char、varchar,20指的是字符而不是字节;那么字符和字节的转换要看字符集,utf-8下,1字符=3...

vant上传文件到后端

Html代码&lt;Ts代码文件列表=[]/image/[a-zA-z]+/。test(file.file.type)){this.$toast(“请上传图片”);returnfalse;config).then(res=&gt;})。捕获(()=&gt;拒绝)=&gt;ts=“+newDate().getTime()).然后...

JS获取当前时间

如果有更好的方法,请提出建议。进一步解释如下:varmyDate=newDate();我的日期。getYear();//获取当前年份(2位数)myDate getFullYear();//获取完整的年份(4位数,1970-???=0)||);}//----------------------------------------------//日期格式//格式...

非线性方程(组):MATLAB内置函数 solve, vpasolve, fsolve, fzero, roots [MATLAB]

MATLAB函数求解,vpsolve,fsolve,fzero,根函数和信息概述求解函数多项式型非多项式型一维高维符号数值算法求解支持,获得所有符号解如果解可以签名,当没有符号解时获得根支持符号解方法:利用方程的性质获得标准可解函数的方法基本上是模拟手动操作vpsolve支持,获取所有数值解以获得实根支持$imes$support未知fsolve从初始值获取...