[bzoj2038]莫队算法学习
2024-08-26 09:34:33
解题关键:莫队最重要的是区间之间以$O(1)$的复杂度进行转化,由于电脑原因,后续补上公式推导。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
ll n,m,ans;
struct node{
ll l,r,id;
}b[];
struct nd{
ll a,b;
}as[];
ll a[],pos[],s[]; bool cmp1(const node &a,const node &b){
return ((pos[a.l]==pos[b.l])&&(a.r<b.r))||(pos[a.l]<pos[b.l]);
} void init(){
ll block=sqrt(n);
for(int i=;i<=n;i++) pos[i]=(i-)/block+;
} void update(ll p,ll add){
/*ans-=s[a[p]]*s[a[p]];
s[a[p]]+=add;
ans+=s[a[p]]*s[a[p]];*/
ans+=*add*s[a[p]]+(add==?:);
s[a[p]]+=add;
} void solve(){
for(int i=,l=,r=;i<=m;i++){
for(;r<b[i].r;r++) update(r+,);
for(;r>b[i].r;r--) update(r, -);
for(;l<b[i].l;l++) update(l, -);//这里注意搞清楚
for(;l>b[i].l;l--) update(l-,);
if(b[i].l==b[i].r){
as[b[i].id].a=,as[b[i].id].b=;//题目要求
continue;
}
ll c=ans;
ll d=(b[i].r-b[i].l+)*(b[i].r-b[i].l);
ll k=__gcd(c,d);
c/=k,d/=k;
as[b[i].id].a=c,as[b[i].id].b=d;
}
}
int main(){
cin>>n>>m;
for(int i=;i<=n;i++) cin>>a[i];
for(int i=;i<=m;i++){
cin>>b[i].l>>b[i].r;
b[i].id=i;
}
init();
sort(b+,b+m+,cmp1);
solve();
for(int i=;i<=m;i++){
cout<<as[i].a<<"/"<<as[i].b<<"\n";
}
}
最新文章
- Elastic学习第一天遇到的问题以及添加的一些操作
- Redis安装和配置
- asp.net生成缩略图
- ZOJ 1241 Geometry Made Simple
- Chp4: Trees and Graphs
- Java学习笔记之:Java StringBuffer类
- iBeacon开发
- 检查mysql数据库是否存在坏表脚本
- [转]C++智能指针的创建
- 简单的mvc之一:简单的开始
- allegro 导Gerber文件
- scroll抖动问题
- Tomcat 组件介绍
- Oracle 存储过程以及存储函数
- AUC计算 - 进阶操作
- 多线程——C++
- 前端入门5-CSS弹性布局flex
- esp8266 免费wifi强推广告神器(0) 项目介绍
- windows命令行(DOS批处理)添加任务计划
- 在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持
热门文章
- HDU - 3081 Marriage Match II 【二分匹配】
- iOS 发大招 otherButtonTitles:(nullable NSString *)otherButtonTitles, ... 写法 &;&; 编写通用类的时候关于可变参数的处理
- iOS 屏幕原点坐标 &;&; 导航栏风格的自定义
- Java多线程系列 JUC锁07 ConditionObject分析
- [原创]java WEB学习笔记01:javaWeb之tomcat的安装和配置
- <;Perl算法小菜>;排序加速--Schwatzian变换及Guttman-Rosler变换
- 系统安装记录 install OS
- 剑指offer之 二叉搜索树与双向链表
- jupyter- 运维
- MATLAB卷积运算(conv、conv2)解释