小Z的袜子(hose) &&作业 (莫队)
莫队:一种非常优雅的暴力,时间复杂度一般情况下是n*根号n,还是很优秀的。
今天水了三道莫队题,对普通莫队有了些了解
1.莫队l和r为指针,维护当前区间的某些信息,一般可以是当前区间不同权值的个数,(或许可以再加些限制)
2.莫队指针移动时的操作一定是O(1)最多O(log(n)),
3.当减值时先减当前的再加,加则反。
T1
水题,维护当前区间sum[i]*sum[i]的和,在进行操作即可
- 1 #include<iostream>
- 2 #include<cstdio>
- 3 #include<cstring>
- 4 #include<string>
- 5 #include<algorithm>
- 6 #include<cmath>
- 7 #include<stack>
- 8 #include<map>
- 9 #include<queue>
- 10 #define ps push_back
- 11 #define MAXN 55101
- 12 #define ll long long
- 13 using namespace std;
- 14 ll kuan;
- 15 struct node{ll l,r,id,zi,mu;}e[MAXN];
- 16 ll se[MAXN],sum[MAXN];
- 17 bool cmp(node a,node b)
- 18 {
- 19 return ((a.l/kuan)!=(b.l/kuan))?(a.l<b.l):(a.r<b.r);
- 20 }
- 21 bool CMP(node a,node b)
- 22 {
- 23 return a.id<b.id;
- 24 }
- 25 ll n,m;ll ans=0;
- 26 void jian(ll x)
- 27 {
- 28 ans-=sum[se[x]]*sum[se[x]];sum[se[x]]--;ans+=sum[se[x]]*sum[se[x]];
- 29 }
- 30 void add(ll x)
- 31 {
- 32 ans-=sum[se[x]]*sum[se[x]];sum[se[x]]++;ans+=sum[se[x]]*sum[se[x]];
- 33 }
- 34 ll gcd(ll a,ll b)
- 35 {
- 36 return (b==0)?a:gcd(b,a%b);
- 37 }
- 38 int main()
- 39 {
- 40 scanf("%lld%lld",&n,&m);kuan=sqrt(n);
- 41 for(ll i=1;i<=n;++i)
- 42 {
- 43 ll x;
- 44 scanf("%lld",&se[i]);
- 45 }
- 46 for(ll i=1;i<=m;++i)
- 47 {
- 48 ll l,r;
- 49 scanf("%lld%lld",&e[i].l,&e[i].r);
- 50 e[i].id=i;
- 51 }
- 52 sort(e+1,e+m+1,cmp);
- 53 ll l=1,r=0;
- 54 for(ll i=1;i<=m;++i)
- 55 {
- 56 //printf("l=%lld e[i].l=%lld r=%lld e[i].r=%lld\n",l,e[i].l,r,e[i].r);
- 57 while(l<e[i].l){jian(l++);}
- 58 while(l>e[i].l){add(--l);}
- 59 while(r<e[i].r){add(++r);}
- 60 while(r>e[i].r){jian(r--);}
- 61 e[i].zi=ans-(e[i].r-e[i].l+1);
- 62 e[i].mu=(e[i].r-e[i].l+1)*(e[i].r-e[i].l);
- 63 if(e[i].zi==0){e[i].mu=1;continue;}
- 64 ll gcdd=gcd(e[i].zi,e[i].mu);
- 65 e[i].zi/=gcdd;e[i].mu/=gcdd;
- 66 //printf("%lld %lld\n",e[i].zi,e[i].mu);
- 67 }
- 68 sort(e+1,e+m+1,CMP);
- 69 for(ll i=1;i<=m;++i)
- 70 {
- 71 printf("%lld/%lld\n",e[i].zi,e[i].mu);
- 72 }
- 73
- 74 }
T2
树状数组一个维护当前区间中<=某个数的个数
一个维护<=某个数出现的不同权值的个数
- 1 #include<iostream>
- 2 #include<cstdio>
- 3 #include<cstring>
- 4 #include<string>
- 5 #include<algorithm>
- 6 #include<cmath>
- 7 #include<stack>
- 8 #include<map>
- 9 #include<queue>
- 10 #define ps push_back
- 11 #define MAXN 205101
- 12 #define ll long long
- 13 using namespace std;
- 14 struct node{int l,r,id,A,B,ans1,ans2;}e[10*MAXN];
- 15 int kuan;int se[MAXN],c[MAXN];
- 16 bool cmp(node a,node b){return (a.l/kuan!=b.l/kuan)?(a.l<b.l):(a.r<b.r);}
- 17 bool CMP(node a,node b){return a.id<b.id;}
- 18 int lowbit(int x){return x&(-x);}int n,m;
- 19 void shu_add(int x,int k)
- 20 {
- 21 for(int i=x;i<=n;i+=lowbit(i))
- 22 {
- 23 c[i]+=k;
- 24 }
- 25 }
- 26 int get_sum(int x)
- 27 {
- 28 int ans=0;
- 29 for(int i=x;i>=1;i-=lowbit(i))
- 30 {
- 31 ans+=c[i];
- 32 }
- 33 return ans;
- 34 }
- 35 int d[MAXN];int sum[MAXN];
- 36 void shu_cishu(int x,int k)
- 37 {
- 38 for(int i=x;i<=n;i+=lowbit(i))
- 39 {
- 40 d[i]+=k;
- 41 }
- 42 }
- 43 int get_sum_cishu(int x)
- 44 {
- 45 int ans=0;
- 46 for(int i=x;i>=1;i-=lowbit(i))
- 47 {
- 48 ans+=d[i];
- 49 }
- 50 return ans;
- 51 }
- 52 void add(int x)
- 53 {
- 54 if(sum[se[x]]==0)
- 55 {
- 56 shu_cishu(se[x],1);
- 57 }
- 58 sum[se[x]]++;
- 59 shu_add(se[x],1);
- 60 }
- 61 void jian(int x)
- 62 {
- 63 sum[se[x]]--;
- 64 if(sum[se[x]]==0)
- 65 {
- 66 shu_cishu(se[x],-1);
- 67 }
- 68 shu_add(se[x],-1);
- 69 }
- 70 int main()
- 71 {
- 72 scanf("%d%d",&n,&m);
- 73 kuan=sqrt(n);
- 74 for(int i=1;i<=n;++i)
- 75 {
- 76 scanf("%d",&se[i]);
- 77 }
- 78 for(int i=1;i<=m;++i)
- 79 {
- 80 scanf("%d%d%d%d",&e[i].l,&e[i].r,&e[i].A,&e[i].B);
- 81 if(e[i].r>n)e[i].r=n;
- 82 if(e[i].A>n)e[i].A=n;
- 83 if(e[i].B>n)e[i].B=n;
- 84 e[i].id=i;
- 85 }
- 86 sort(e+1,e+m+1,cmp);
- 87 int l=1,r=0;
- 88 for(int i=1;i<=m;++i)
- 89 {
- 90 while(l<e[i].l){jian(l++);}
- 91 while(l>e[i].l){add(--l);}
- 92 while(r<e[i].r){add(++r);}
- 93 while(r>e[i].r){jian(r--);}
- 94 int A=e[i].A,B=e[i].B;
- 95 e[i].ans1=get_sum(B)-((A-1!=0)?get_sum(A-1):0);
- 96 e[i].ans2=get_sum_cishu(B)-((A-1!=0)?get_sum_cishu(A-1):0);
- 97 }
- 98 sort(e+1,e+m+1,CMP);
- 99 for(int i=1;i<=m;++i)
- 100 {
- 101 printf("%d %d\n",e[i].ans1,e[i].ans2);
- 102 }
- 103 }
小Z的袜子(hose) &&作业 (莫队)的更多相关文章
- BZOJ_2038_[2009国家集训队]小Z的袜子(hose)_莫队
BZOJ_2038_[2009国家集训队]小Z的袜子(hose)_莫队 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 9894 Solved: 4561[Subm ...
- 2038: [2009国家集训队]小Z的袜子(hose) (莫队算法)
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 专题练习: http://acm.hust.edu.cn/vjudge/conte ...
- BZOJ2038 2009国家集训队 小Z的袜子(hose) 【莫队】
BZOJ2038 2009国家集训队 小Z的袜子(hose) Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼 ...
- [bzoj2038][2009国家集训队]小Z的袜子(hose)_莫队
小Z的袜子 hose 2009-国家集训队 bzoj-2038 题目大意:给定一个n个袜子的序列,每个袜子有一个颜色.m次询问:每次询问一段区间中每种颜色袜子个数的平方和. 注释:$1\le n,m\ ...
- bzoj 2038 小Z的袜子(hose)(莫队算法)
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 11542 Solved: 5166[Sub ...
- 【BZOJ2038】【2009国家集训队】小Z的袜子(hose) 分块+莫队
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法】
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法模版】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意概括: 有 N 只袜子(分别编号为1~N),有 M 次查询 (L, R)里面随机 ...
- BZOJ:2038: [2009国家集训队]小Z的袜子(hose)(莫队算法模板)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 解题心得: 第一次接触莫队算法,很神奇,很巧妙.莫队算法主要就是用来解决多次询问时 ...
随机推荐
- selenium之利用cookie绕过验证登录
方法一 第一步 2.第二步 方法二.重点:1.打开验证码页(登录页面):2.首次登录等待三十秒手工输入账密:3.保存cookie至excel后利用cookie脚本登录 1.导入第三方模块xlwt 2. ...
- CCNA 第五章 变长子网掩码、汇总和TCP/IP故障排除
1:VLSM:即变长子网掩码,使用长度不同的子网掩码将大型网络划分为众多子网,以满足不同类型的网络设计. 2:运行老式的路由器和例如:RIP V1协议的网络不能使用VLSM,因为它使用分类路由器选择. ...
- 测开之Python自动化全栈工程师+性能专项(送思维导图)
测开之Python自动化全栈工程师+性能专项 功能测试基础 接口测试基础接口的通信原理与本质cookie.session.token详解接口测试的意义与测试方法接口测试用例的设计 app测试 app流 ...
- SpringBoot+MyBatis练手项目笔记汇总
以下是我在练习SpringBoot+MyBatis训练时候个人一些笔记汇总(可以点击跳转),献丑了,网上很多大佬的文章都比我写的详细,一些好的文章,我会将贴到各个内容中. 1. 插入数据返回id和内部 ...
- Codeforces Round #688 (Div. 2)
A. Cancel the Trains 题意:给定两个数组,找出这两个数组中有多少重复元素,然后输出 思路:直接找 代码: 1 #include<iostream> 2 #include ...
- OO_Unit2_多线程电梯
CSDN博客链接 一.第一次作业 1.需求分析 单部多线程傻瓜调度(FAFS)电梯 2.实现方案 输入接口解析 类似于Scanner,我们使用ElevatorInput进行阻塞式读取(第一次作业较简单 ...
- 29.Map,可变参数
1.Map集合 1.1Map集合概述和特点[理解] 单列集合一次存一个元素 双列集合一次存两个元素 键:不能重复的 值:可以重复的 Map集合概述 interface Map<K, ...
- Git安装教程最新版本(国内gitee国外github)
Git安装教程最新版本(国内gitee国外github) 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 获取大师使用的typora主题: http://w ...
- git远端账号问题
1. gitlab密码修改后git因保存密码无法下载,403 在.git/config添加如下 [credential] helper = store 添加了此项配置之后, github的账号信息就会 ...
- [刷题] PTA 7-32 说反话-加强版
题目描述: 给定一个英语句子,各个单词之间用空格分隔.要求编写程序,将所有单词倒序输出 输入示例: Hello World Here I Come 输出示例: Come I Here World He ...