AC日记——[国家集训队2010]小Z的袜子 cogs 1775
思路:
传说中的莫队算法(优雅的暴力);
莫队算法是一个离线的区间询问算法;
如果我们知道[l,r],
那么,我们就能O(1)的时间求出(l-1,r),(l+1,r),(l,r-1),(l,r+1);
莫队算法怎么保证时间呢?
把询问排序;
然后进行暴力;
但是这样仍然需要很长很长的时间;
所以,我们引入一个根号方法,分块;
把区间的点分块;
然后每个询问的l,r按l所属的块为第一关键字,l,r为第二第三;
排序完后,就可以保证复杂度是O(n*sqrt(n));
然后再看这个题目本身;
询问l,r中的同种颜色袜子的概率;
稍微思考一下便可列出式子:
a1*(a1-1)+a2*(a2-1)+...+ai*(ai-1)/(r-l+1)*(r-l)
ai为第i种颜色的个数;
改变一下就可以得到:
a1*a1+a2*a2+...+ai*ai-a1-a2-...-ai/(r-l+1)*(r-l)
因为每种颜色袜子的总个数为r-l+1,所以:
a1*a1+a2*a2+...+ai*ai-r+l-1/(r-l+1)*(r-l)
来,上代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 50005
#define ll long long struct QueryType {
ll l,r,id;
};
struct QueryType qu[maxn]; ll n,m,col[maxn],ans[maxn],pos=,fa[maxn],num[maxn],bel[maxn],size; inline void in(ll &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} bool cmp(QueryType iposa,QueryType iposb)
{
if(bel[iposa.l]==bel[iposb.l]) return iposa.r<iposb.r;
else return iposa.l<iposb.l;
} inline void updata(ll now,ll dis)
{
now=col[now];
pos-=num[now]*num[now];
num[now]+=dis;
pos+=num[now]*num[now];
} ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
} int main()
{
freopen("hose.in","r",stdin);
freopen("hose.out","w",stdout);
in(n),in(m);size=sqrt(n);
for(ll i=;i<=n;i++) in(col[i]),bel[i]=(i-)/size;
for(ll i=;i<=m;i++) in(qu[i].l),in(qu[i].r),qu[i].id=i;
sort(qu+,qu+m+,cmp);
ll li=,ri=;
for(ll j=;j<=m;j++)
{
if(ri>qu[j].r) for(ll i=ri;i>qu[j].r;i--) updata(i,-);
else for(ll i=ri+;i<=qu[j].r;i++) updata(i,);
if(li>qu[j].l) for(ll i=li-;i>=qu[j].l;i--) updata(i,);
else for(ll i=li;i<qu[j].l;i++) updata(i,-);
ri=qu[j].r,li=qu[j].l,ans[qu[j].id]=pos-(ri-li+);
if(qu[j].r-qu[j].l>=) fa[qu[j].id]=(ri-li+)*(ri-li);
}
for(ll i=;i<=m;i++)
{
if(fa[i]==||ans[i]==)
{
printf("0/1\n");
continue;
}
ll o=gcd(fa[i],ans[i]);
printf("%lld/%lld\n",ans[i]/o,fa[i]/o);
}
return ;
}
AC日记——[国家集训队2010]小Z的袜子 cogs 1775的更多相关文章
- 洛谷 1775. [国家集训队2010]小Z的袜子
1775. [国家集训队2010]小Z的袜子 ★★★ 输入文件:hose.in 输出文件:hose.out 简单对比时间限制:1 s 内存限制:512 MB [题目描述] 作为一个生活 ...
- 数据结构(莫队算法):国家集训队2010 小Z的袜子
[题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到 ...
- [国家集训队2010]小Z的袜子
★★★ 输入文件:hose.in 输出文件:hose.out 简单对比 时间限制:1 s 内存限制:512 MB [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜 ...
- 1775. [国家集训队2010]小Z的袜子
[题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到 ...
- cogs1772 [国家集训队2010]小Z的袜子
沉迷于文化的我N年没更blog了...(\(N \in (0,1)\)) 然后回到机房就沉迷于 \(generals.io\) 无法自拔...QAQ 然后想打一遍splay(然后是LCT),然后放弃了 ...
- 【bzoj2038】[国家集训队2010]小Z的袜子 莫队
莫队:就是一坨软软的有弹性的东西Duang~Duang~Duang~ 为了防止以左端点为第一关键字以右端点为第二关键字使右端点弹来弹去,所以让左端点所在块为关键字得到O(n1.5)的时间效率,至于分块 ...
- 「国家集训队」小Z的袜子
「国家集训队」小Z的袜子 传送门 莫队板子题. 注意计算答案的时候,由于分子分母都要除以2,所以可以直接约掉,这样在开桶算的时候也方便一些. 参考代码: #include <algorithm& ...
- 【BZOJ2038】【2009国家集训队】小Z的袜子(hose) 分块+莫队
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
- AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867
[国家集训队2011]旅游(宋方睿) 思路: 树链剖分,边权转点权: 线段树维护三个东西,sum,max,min: 当一个区间变成相反数时,sum=-sum,max=-min,min=-max: 来, ...
随机推荐
- Insertion Sort Gym - 101955C 思路+推公式
题目:题目链接 题意:对长为n的1到n的数列的前k个数排序后数列的最长上升子序列长度不小于n-1的数列的种数,训练赛时怎么都读不明白这个题意,最后还是赛后问了旁队才算看懂,英语水平急需拯救55555 ...
- hadoop完全分布式集群的搭建
集群配置: jdk1.8.0_161 hadoop-2.6.1 linux系统环境:Centos6.5 创建普通用户 dummy 准备三台虚拟机master,slave01,slave02 hado ...
- Maven 用Eclipse创建web项目后报错的解决方式
1.maven中创建web项目后jsp可能会报错,因为其没有相关的依赖(包),和自带的动态网页项目创建不一样.所以在配置文件中要添加相关的依赖,比如servlet的 2.项目右键-maven-upda ...
- mysql 分组查询前n条数据
今天去面试,碰到一道面试题: 有一个学生成绩表,表中有 表id.学生名.学科.分数.学生id .查询每科学习最好的两名学生的信息: 建表sql: CREATE TABLE `stuscore` ( ` ...
- IOS笔记047-代理传值和block传值
在两个不同的控制器之间传递数据,可以使用代理传值或者block传值. 例子是一个简单通讯录. 主界面如下: 添加联系人界面 查看/编辑联系人界面:默认是查看模式,点击编辑后进入编辑模式 编辑模式 数据 ...
- Python+Selenium框架设计篇之-什么是自动化测试框架
1.什么是自动化测试框架 简单来说,自动化测试框架就是由一些标准,协议,规则组成,提供脚本运行的环境.自动化测试框架能够提供很多便利给用户高效完成一些事情,例如,结构清晰开发脚本,多种方式.平台执行脚 ...
- Form 组件动态绑定数据
1.Form 组件的作用: a.对用户提交的数据进行验证(form表单/ajax) b.保留用户上次输入的信息 c.可以生成html标签(input表单类的标签) 2..由于form组件中每个字段都是 ...
- Leetcode 546.移除盒子
移除盒子 给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色.你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止.每一轮你可以移除具有相同颜色的连续 k 个盒子(k > ...
- 菜鸟之路——机器学习之线性回归个人理解及Python实现
这一节很简单,都是高中讲过的东西 简单线性回归:y=b0+b1x+ε.b1=(Σ(xi-x–)(yi-y–))/Σ(xi-x–)ˆ2 b0=y--b1x- 其中ε取 为均值为0的正态 ...
- 【转】netstat 查看端口占用情况
netstat用来查看系统当前系统网络状态信息,包括端口,连接情况等,常用方式如下: netstat -atunlp,各参数含义如下: -t : 指明显示TCP端口 -u : 指明显示UDP端口 -l ...