【BZOJ3781、2038】莫队算法2水题
【BZOJ3781】小B的询问
题意:有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数
题解:初学莫队算法,差不多明白了用莫队的情况,对于这种离线的,区间长度+1时可O(1)修改答案的题,运用莫队算法是最水的
将n分成sqrt(n)块,将询问按照左端点所在的块为第一关键字,右端点的具体位置为第二关键字排序,然后用指针l,r不断暴力平移到询问的左右端点处,并不断O(1)更新答案,这样左端点的移动距离最多为sqrt(n)*m+sqrt(n)*sqrt(n)次,右端点移动距离最多为sqrt(n)*n次,所以总复杂度为O(n*sqrt(n))
对于本题,设原区间为[l,r],我们以从[l,r]平移到[l,r+1]举例,由于只差了r+1这个数,我们设r+1这个数在[l,r]里的出现的次数为c(i),那么原来这个数对答案的贡献为c(i)*c(i),加上r+1后贡献变成了(c(i)+1)*(c(i)+1),那么r+1这一个数的贡献就是2*c(i)+1,然后用它更新答案,最后c(i)++就好了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=50010;
typedef long long ll;
struct node
{
int qa,qb,org;
ll ans;
}q[maxn];
int n,m,siz;
ll sum;
int c[maxn];
ll s[maxn];
bool cmp(node a,node b)
{
if((a.qa-1)/siz==(b.qa-1)/siz) return a.qb<b.qb;
return (a.qa-1)/siz<(b.qa-1)/siz;
}
bool cmp2(node a,node b)
{
return a.org<b.org;
}
void add(int x)
{
sum+=2*s[c[x]]+1,s[c[x]]++;
}
void rem(int x)
{
s[c[x]]--,sum-=2*s[c[x]]+1;
}
int main()
{
int i;
scanf("%d%d%d",&n,&m,&i);
siz=(int)sqrt((double)n);
for(i=1;i<=n;i++) scanf("%d",&c[i]);
for(i=1;i<=m;i++) scanf("%d%d",&q[i].qa,&q[i].qb),q[i].org=i;
sort(q+1,q+m+1,cmp);
int l=1,r=0;
for(i=1;i<=m;i++)
{
while(r<q[i].qb) add(++r);
while(r>q[i].qb) rem(r--);
while(l<q[i].qa) rem(l++);
while(l>q[i].qa) add(--l);
q[i].ans=sum;
}
sort(q+1,q+m+1,cmp2);
for(i=1;i<=m;i++) printf("%lld\n",q[i].ans);
return 0;
}
【BZOJ2038】[2009国家集训队]小Z的袜子(hose)
题意:有n个数,m个询问,每次询问求区间[l,r]中任取两个数使得这两个数相同的概率
题解:别的和上题都一样,只不过答案变成了:(s(i)表示i出现的次数)

忽视分母,对于新加的r+1,显然贡献是s(i),然后s(i)++
这题我long long 开得好像不太对~
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=50010;
typedef long long ll;
struct node
{
int qa,qb,ans,org;
}q[maxn];
int n,m,siz;
ll sum;
int c[maxn];
ll s[maxn];
int gcd(int a,int b)
{
return (b==0)?a:gcd(b,a%b);
}
bool cmp(node a,node b)
{
if((a.qa-1)/siz==(b.qa-1)/siz) return a.qb<b.qb;
return (a.qa-1)/siz<(b.qa-1)/siz;
}
bool cmp2(node a,node b)
{
return a.org<b.org;
}
void add(int x)
{
sum+=s[c[x]],s[c[x]]++;
}
void rem(int x)
{
s[c[x]]--,sum-=s[c[x]];
}
int main()
{
scanf("%d%d",&n,&m);
siz=(int)sqrt((double)n);
int i;
ll a,b,g;
for(i=1;i<=n;i++) scanf("%d",&c[i]);
for(i=1;i<=m;i++) scanf("%d%d",&q[i].qa,&q[i].qb),q[i].org=i;
sort(q+1,q+m+1,cmp);
int l=1,r=0;
for(i=1;i<=m;i++)
{
while(r<q[i].qb) add(++r);
while(r>q[i].qb) rem(r--);
while(l<q[i].qa) rem(l++);
while(l>q[i].qa) add(--l);
q[i].ans=sum;
}
sort(q+1,q+m+1,cmp2);
for(i=1;i<=m;i++)
{
a=q[i].ans,b=(ll)(q[i].qb-q[i].qa)*(q[i].qb-q[i].qa+1)/2,g=gcd(a,b);
if(a==0) printf("0/1\n");
else printf("%lld/%lld\n",a/g,b/g);
}
return 0;
}
【BZOJ3781、2038】莫队算法2水题的更多相关文章
- bzoj 2038 莫队算法
莫队算法,具体的可以看10年莫涛的论文. 大题思路就是假设对于区间l,r我们有了一个答案,那么对于区间l,r+1,我们 可以暴力的转移一个答案,那么对于区间l1,r1和区间l2,r2,需要暴力处理 的 ...
- HYSBZ 2038 莫队算法
小Z的袜子(hose) Time Limit:20000MS Memory Limit:265216KB 64bit IO Format:%lld & %llu Submit ...
- NBUT 1457 莫队算法 离散化
Sona Time Limit:5000MS Memory Limit:65535KB 64bit IO Format: Submit Status Practice NBUT 145 ...
- bzoj 3781 小B的询问(莫队算法)
[题意] 若干个询问sigma{ cnt[i]^2 } cnt[i]表示i在[l,r]内的出现次数. [思路] 莫队算法,裸题. 一个cnt数组即可维护插入与删除. [代码] #include< ...
- [Codeforces86D]Powerful array(莫队算法)
题意:定义K[x]为元素x在区间[l,r]内出现的次数,那么它的贡献为K[x]*K[x]*x 给定一个序列,以及一些区间询问,求每个区间的贡献 算是莫队算法膜版题,不带修改的 Code #includ ...
- BZOJ 4540 [Hnoi2016]序列 (单调栈 + ST表 + 莫队算法)
题目链接 BZOJ4540 考虑莫队算法. 这题难在$[l, r]$到$[l, r+1]$的转移. 根据莫队算法的原理,这个时候答案应该加上 $cal(l, r+1) + cal(l+1, r+1) ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 9894 Solved: 4561[Subm ...
- BZOJ 2038 小Z的袜子(hose) 莫队算法模板题
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题目大意: 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法模版】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意概括: 有 N 只袜子(分别编号为1~N),有 M 次查询 (L, R)里面随机 ...
随机推荐
- JS和JSP的差别
近期非常多同学在纠结于名词缩写之间的相似性.因此本人也来写一篇,讲讲JS和JSP的差别. SUN首先发展出SERVLET,其功能比較强劲,体系设计也非常先进,仅仅是,它输出HTML语句还是採用了老的C ...
- jquery.validate校验+jquery.form提交,配合使用
原文链接:http://www.cnblogs.com/datoubaba/archive/2012/06/06/2538873.html 概述:本篇主要讨论jquery.validate结合jque ...
- Mysql 修改数据库,mysql修改表类型,Mysql增加表字段,Mysql删除表字段,Mysql修改字段名,Mysql修改字段排列顺序,Mysql修改表名
对于已经创建好的表,尤其是已经有大量数据的表,如果需要对表做一些结构上的改变,我们可以先将表删除(drop),然后再按照新的表定义重建表.这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载 ...
- Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道
Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道 Keyword::截取文本文件后部分 查看提示max_allowed_packet限制 Target Se ...
- location 禁止以/data开头的文件
[root@web01 default]# tree data/ data/ └── index.html directories, file [root@web01 default]# cat da ...
- tornado WebSocket详解
1.什么是WebSocketwebsocket和长轮询的区别是客户端和服务器之间是持久连接的双向通信.协议使用ws://URL格式,但它在是在标准HTTP上实现的. 2.tornado的WebSock ...
- WWDC 2014 Session笔记 - iOS界面开发的大一统
本文是我的 WWDC 2014 笔记 中的一篇,涉及的 Session 有 What's New in Cocoa Touch Building Adaptive Apps with UIKit Wh ...
- iOS应用代码段瘦身办法
iOS应用代码段瘦身办法 大型app应对苹果官方代码段大小限制的小伎俩… 背景 苹果官方文档 对二进制 __TEXT 段大小有限制: 代码实在瘦不下去怎么办? 解决方案 利用 rename_secti ...
- C语言 · 复数归一化
算法提高 复数归一化 时间限制:1.0s 内存限制:512.0MB 编写函数Normalize,将复数归一化,即若复数为a+bi,归一化结果为a/sqrt(a*a+b*b) + i ...
- linux - camera capture
//cut a picture#include <stdio.h>#include <stdlib.h>#include <string.h>#include &l ...