Luogu P1494 [国家集训队]小Z的袜子
比较简单的莫队题,主要是为了熟练板子。
先考虑固定区间时我们怎么计算,假设区间\([l,r]\)内颜色为\(i\)的袜子有\(cnt_i\)只,那么对于颜色\(i\)来说,凑齐一双的情况个数为:
- \(cnt_i=0\)时,贡献为\(0\),这个我们特别处理(显然吧)
- \(cnt_i>0\)时,贡献为\(cnt_i\cdot (cnt_i-1)\) (先挑出一只再挑另一只)
最后我们考虑所有颜色以及总情况数,那么此时凑出一双的概率为:
\]
首先还是考虑如何快速地转移区间,假设我们已经求出了\([l,r]\)的贡献(即上式的分母部分)\(ans\),那么我们考虑:
- 推出\([l-1,r],[l,r+1]\)。假设此时加入的袜子颜色为\(i\),那么\(ans=ans-cnt_i\cdot(cnt_i-1)+cnt_i\cdot(cnt_i+1)\)
- 推出\([l+1,r],[l,r-1]\)。假设此时加入的袜子颜色为\(i\),那么\(ans=ans-cnt_i\cdot(cnt_i-1)+(cnt_i-2)\cdot(cnt_i-1)\)
然后就可以\(O(1)\)转移啦,剩下的就是莫队基本操作了
CODE
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=50005;
struct data
{
int l,r,id;
long long ans1,ans2;
}q[N];
int n,m,L,R,a[N],cnt[N],blk[N],size;
long long res;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void write(long long x)
{
if (x>9) write(x/10);
putchar(x%10+'0');
}
inline bool cmp1(data a,data b)
{
if (blk[a.l]==blk[b.l]) return blk[a.l]&1?a.r<b.r:a.r>b.r;
return blk[a.l]<blk[b.l];
}
inline bool cmp2(data a,data b)
{
return a.id<b.id;
}
inline void add(int col)
{
if (++cnt[col]>=2) res+=1LL*cnt[col]*(cnt[col]-1)-1LL*(cnt[col]-1)*(cnt[col]-2);
}
inline void del(int col)
{
if (--cnt[col]>=1) res+=1LL*cnt[col]*(cnt[col]-1)-1LL*cnt[col]*(cnt[col]+1);
}
inline long long gcd(long long n,long long m)
{
return m?gcd(m,n%m):n;
}
inline void divnum(long long a,long long b)
{
if (!a) { puts("0/1"); return; }
long long d=gcd(a,b); a/=d; b/=d;
write(a); putchar('/'); write(b); putchar('\n');
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i; read(n); read(m); size=sqrt(n);
for (i=1;i<=n;++i) read(a[i]),blk[i]=(i-1)/size+1;
for (i=1;i<=m;++i) read(q[i].l),read(q[i].r),q[i].id=i;
sort(q+1,q+m+1,cmp1); L=q[1].l; R=q[1].r;
for (i=L;i<=R;++i) add(a[i]); q[1].ans1=res; q[1].ans2=1LL*(R-L+1)*(R-L);
for (i=2;i<=m;++i)
{
while (L<q[i].l) del(a[L++]); while (L>q[i].l) add(a[--L]);
while (R>q[i].r) del(a[R--]); while (R<q[i].r) add(a[++R]);
q[i].ans1=res; q[i].ans2=1LL*(q[i].r-q[i].l+1)*(q[i].r-q[i].l);
}
for (sort(q+1,q+m+1,cmp2),i=1;i<=m;++i) divnum(q[i].ans1,q[i].ans2);
return 0;
}
Luogu P1494 [国家集训队]小Z的袜子的更多相关文章
- luogu P1494 [国家集训队]小Z的袜子 ( 普 通 )
题目: 链接:https://www.luogu.org/problemnew/show/P1494 题意:一些袜子排成一排,每个袜子有固定的颜色. ...
- 【luogu P1494 [国家集训队]小Z的袜子】 题解
题目链接:https://www.luogu.org/problemnew/show/P1494 #include <cstdio> #include <algorithm> ...
- P1494 [国家集训队]小Z的袜子
题目 P1494 [国家集训队]小Z的袜子 解析 在区间\([l,r]\)内, 任选两只袜子,有 \[r-l+1\choose2\] \[=\frac{(r-l+1)!}{2!(r-l-1)!}\] ...
- P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...
- P1494 [国家集训队]小Z的袜子(luogu)
P1494 小Z的袜子 终于了解了莫队算法(更专业的名称Square Root Decomposition of Queries) 莫队算法: 一般来说解决静态(实际上也有修改的但复杂度更高)的离线( ...
- 洛谷 P1494 [国家集训队] 小Z的袜子
题目概述: 小Z把N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务 ...
- P1494 [国家集训队]小Z的袜子(莫队)
题目链接:https://www.luogu.org/problemnew/show/P1494 题目大意:中文题目 具体思路:计算概率的时候,每一次是区间的移动,每一次移动,记得先将原来的记录的影响 ...
- 洛谷 P1494 [国家集训队]小Z的袜子(莫队)
题目链接:https://www.luogu.com.cn/problem/P1494 一道很经典的莫队模板题,然而每道莫队题的大体轮廓都差不多. 首先莫队是一种基于分块的算法,它的显著特点就是: 能 ...
- P1494 [国家集训队]小Z的袜子(莫队算法)
莫队板子 代码 #include <cstdio> #include <algorithm> #include <cstring> #include <cma ...
随机推荐
- 输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m
题目:编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m.要求将所有的可能组合列出来. 分析:分治的思想.可以把问题(m,n)拆分(m - n, n -1)和(m, n ...
- nginx的应用(window环境下)
nginx(背景) nginx是一个高性能的HTTP服务器,以前我经常在linux系统中配置,主要做反向代理和负载均衡,最近根据业务需要,需要在window中配置反向和负载,下面就介绍一下nginx的 ...
- (网页)javaScript增删改查(转)
转自CSDN: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...
- OneAPM大讲堂 | Metrics, Tracing 和 Logging 的关系
[编者按]这是在 OpenTracing 和分布式追踪领域内广受欢迎的一片博客文章.在构建监控系统时,大家往往在这几个名词和方式之间纠结. 通过这篇文章,作者很好的阐述了分布式追踪.统计指标与日志之间 ...
- Dell XPS 13 9306安装 macOS 10.12.6
一直在考虑买一个手上的本,轻薄,办公方便.个人很喜欢mac 下的那些软件,尤其是keynote.就锁定在Macbook Pro上,但是又觉得没有什么玩头,后来一直找,觉得xps也很符合要求,就开始调查 ...
- [20180630]truncate table的另类恢复2.txt
[20180630]truncate table的另类恢复2.txt --//上个星期做了truncate table的另类恢复,通过修改数据块的段号,再通过rowid定位收集数据,达到修复的目的.- ...
- windows防火墙安全设置指定ip访问指定端口
场景摘要: 1.我有三台腾讯云服务器 2.我日常办公网络的ip换了 3.我在腾讯云上面改了安全规则,也不能访问我A服务器的21,1433等端口 4.开始我以为是办公网络的安全设置问题 5.我进B服务器 ...
- SQL Server2008 4064错误
无法打开用户默认数据库,登录失败,其原因是登录帐户的默认数据库被删除. 解决办法是使用管理员帐户修改此登录帐户的默认数据库. 1.使用管理员帐号登入企业管理器,在"对象资源管理器& ...
- 【Java多线程】ReentrantReadWriteLock
概述 ReentrantReadWriteLock是Lock的另一种实现方式,ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个 ...
- Http实现文件下载
HttpServlet实现下载文件,重要的设置header,否则浏览器无法解析为下载. Header示例: 1:response.setContentType("application/pd ...