P1494 小Z的袜子
P1494 小Z的袜子
- 莫队板子题,对询问进行排序+分块,从而得到巧妙的复杂度
对于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∗(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))(a2+b2+c2+...x2−(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))(a2+b2+c2+...x2−(R−L+1))/((R−L+1)∗(R−L))
我们需要解决的一个问题
求一个区间内每种颜色数目的平方和。
- 大佬博客
- 代码:
#include <cstdio>
#include <iostream>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std; typedef long long LL;
#define res register int
inline int read()
{
int x(0),f(1); char ch;
while(!isdigit(ch=getchar())) if(ch=='-') f=-1;
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
return f*x;
} const int N=50005;
struct node{int x,y,z;LL p,q;}a[N];
int pos[N],c[N];
LL cnt[N];
int n,m,block; inline bool cmp1(const node &n1,const node &n2)
{
if(pos[n1.x]==pos[n2.x]) return n1.y<n2.y;
return n1.x<n2.x;
}
inline bool cmp2(const node &a,const node &b)
{ return a.z<b.z; } inline LL gcd(LL a,LL b) { return b?gcd(b,a%b):a; } LL ans;
inline void update(int i,int d)
{
ans-=cnt[c[i]] * cnt[c[i]];
cnt[c[i]]+=d;
ans+=cnt[c[i]] * cnt[c[i]];
} inline void solve()
{
ans=0;
int l=1,r=0;
for(res i=1 ; i<=m ; ++i)
{
if(a[i].x==a[i].y)
{
a[i].p=0; a[i].q=1;
continue;
}
for( ; r<a[i].y ; ++r) update(r+1,1);
for( ; r>a[i].y ; --r) update(r,-1);
for( ; l<a[i].x ; ++l) update(l,-1);
for( ; l>a[i].x ; --l) update(l-1,1); LL len=a[i].y-a[i].x+1;
a[i].p=ans-len;
a[i].q=len*(len-1);
LL tmp=gcd(a[i].p,a[i].q);
a[i].p/=tmp; a[i].q/=tmp;
}
}
int main()
{
n=read(); m=read();
for(res i=1 ; i<=n ; ++i) c[i]=read();
for(res i=1 ; i<=m ; ++i)
a[i].x=read(),a[i].y=read(),a[i].z=i; block = sqrt(n);
for(res i=1 ; i<=n ; ++i) pos[i]=(i-1)/block+1; sort(a+1,a+m+1,cmp1);
solve();
sort(a+1,a+m+1,cmp2);
for(res i=1 ; i<=m ; ++i)
printf("%lld/%lld\n",a[i].p,a[i].q);
return 0;
}
P1494 小Z的袜子的更多相关文章
- Bzoj2038/洛谷P1494 小Z的袜子(莫队)
题面 Bzoj 洛谷 题解 考虑莫队算法,首先对询问进行分块(分块大小为\(sqrt(n)\)),对于同一个块内的询问,按照左端点为第一关键字,右端点为第二关键字排序.我们统计这个区间内相同的颜色有多 ...
- P1494 小Z的袜子 【普通莫队】
我的第二道莫队题,对莫队又有了自己的看法. 在第一题的基础上之上,觉得莫队有个很关键的地方在于 莫队所维护的值是什么,怎么推出维护的公式来. 这道题就是这样,一开始还没自己推出公式来,也有几个坑点. ...
- P1494 小Z的袜子 莫队
题干 就是将$add$和$del$函数里的$ans$变化变成组合数嘛, 先预处理出$x$只相同袜子一共有$f[x] = 1+2+...+$$(x-1)$种组合, 要注意,由于$f[x]$是一直加到$x ...
- 洛谷P1494 小Z的袜子
题意:在[l, r]之中任选两个数,求它们相同的概率. 解: 莫队入门. 概率这个很好搞,就是cnt * (cnt - 1) / 2. 然后发现每次挪指针的时候,某一个cnt会+1或-1.这时候差值就 ...
- 洛谷P1494小Z的袜子 [国家集训队] 莫队
正解:莫队 解题报告: 这是,传送门qwq 昂大概是莫队板子题? 首先可以推出来答案是(∑C(2,color[i]))/C(2,r-l+1)趴?挺显然的不解释了qwq 然后显然除数直接做就成,考虑怎么 ...
- P1494 [国家集训队]小Z的袜子(luogu)
P1494 小Z的袜子 终于了解了莫队算法(更专业的名称Square Root Decomposition of Queries) 莫队算法: 一般来说解决静态(实际上也有修改的但复杂度更高)的离线( ...
- P1494 [国家集训队]小Z的袜子
题目 P1494 [国家集训队]小Z的袜子 解析 在区间\([l,r]\)内, 任选两只袜子,有 \[r-l+1\choose2\] \[=\frac{(r-l+1)!}{2!(r-l-1)!}\] ...
- P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...
- 【洛谷】1494:[国家集训队]小Z的袜子【莫队】
P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… ...
随机推荐
- socketpair初识
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/typ ...
- 2018.10.02 NOIP模拟 矩阵分组(二分答案)
传送门 考场上并不会写二分的check函数,下来看了看题解发现真是妙极. 不难想到每次直接从四个角各按阶梯状拓展出合法区域A,再检验B是否合法就行了.(然而考场上写的弃疗了) 于是题解用了一些小技巧优 ...
- 2018.09.25 51nod1597 有限背包计数问题(背包+前缀和优化)
传送门 dp好题. 我认为原题的描述已经很清楚了: 你有一个大小为n的背包,你有n种物品,第i种物品的大小为i,且有i个,求装满这个背包的方案数有多少. 两种方案不同当且仅当存在至少一个数i满足第i种 ...
- 2018.08.21 bzoj4668: 冷战(并查集+启发式合并)
传送门 可以发现需要维护连通性和两点连通时间. 前者显然是并查集的常规操作,关键就在于如何维护两点的连通时间. 然后会想到这个时候不能用路径压缩了,因为它会破坏原本树形集合的结构,因此可以启发式按si ...
- java中的类、对象、方法
类=一个种类(class)东西 对象=属于该种类的一个对象/物件(object,台湾翻译为‘物件’)方法=对这个种类的东西都可以进行的操作 比如我有一辆汽车-类 public class car {. ...
- VHDL实例化过程
第二步:建立一个名为MUX_0的乘法器 第三步:在程序中例化,看以下程序. -- 该程序用来实现复数的乘法,端口分别定义的复数的 -- 输入的实部和虚部和输出的实部和虚部 LIBRARY IEEE; ...
- autolayout之后获取uiview的frame
这个只要一行代码就搞定了.详细请看: In order to get the right frame/bounds of your UIImageView after resizing, you ne ...
- obj-c的优缺点
优点: 1) Cateogies : 类别 2) Posing : 扮演 3) 动态识别 : 编译时与运行时动态识别类型 4) 指标计算 : 指针计算 指针的 +- * / 5) 弹性信息传递 : 某 ...
- The First Android App----Starting Another Activity
To respond to the button's on-click event, open the activity_main.xml layout file and add the androi ...
- EF学习笔记-CODE FIRST-约定
首先EF对关系数据库的映射遵循如下规则: Fluent API 配置 override 数据注释 override 约定 System.Data.Entity.ModelConfiguration.C ...