NPY and girls
NPY and girls
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5145
莫队算法
注意到没有修改区间的操作,使用莫队算法:将整个区间分成若干个块,将询问区间按块优先升序排序,同块内按区间右界升序排序,添加一个元素,满足条件的值sum就变为sum=(sum*times[a[r]]/(r-l+1));减少一个值同理。从第一个区间一直推到最后一个区间即可。(之前TLE一直以为是区间大小的问题,现在发现是这句话while(x<0)x+=M,不过因为这题M比较大,改改区间居然被我水过去了...)
代码如下:
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define N 30005
#define M 1000000007
#define LL long long
#define B 250/**((int)sqrt((double)n)) sqrt(n) will be TLE**/
#define mst(x) memset(x,0,sizeof(x))
using namespace std;
LL times[N];
LL T,n,m,x,y;
LL a[N];
struct nod{
LL l,r,no,value;
}q[N];
LL exGCD(LL a,LL b){
if(b==){
x=;
y=;
return a;
}
LL r=exGCD(b,a%b);
LL tmp=x;
x=y;
y=tmp-(a/b)*y;
return r;
}
bool cmp_by_range(nod x,nod y){
if(x.l/B==y.l/B){
return x.r<y.r;
}else return (x.l/B<y.l/B);
}
bool cmp_by_no(nod x,nod y){
return x.no<y.no;
}
void init(){
mst(times);
scanf("%I64d%I64d",&n,&m);
for(LL i=;i<n;++i)
scanf("%I64d",&a[i]);
for(LL i=;i<m;++i){
LL l,r;
scanf("%I64d%I64d",&l,&r);
l--,r--;
q[i].l=l;
q[i].r=r;
q[i].no=i;
q[i].value=;
}
sort(q,q+m,cmp_by_range);
}
void solve(){
LL l=q[].l,r=q[].r,sum=;
times[a[l]]++;
for(LL i=l+;i<=r;++i){
times[a[i]]++;
exGCD(times[a[i]],M);
while(x<)x+=M;
sum=((sum*(i-l+))%M*x)%M;
}
q[].value=sum;
for(LL i=;i<m;++i){
//l=q[i-1].l,r=q[i-1].r;
while(r<q[i].r){
r++;
times[a[r]]++;
exGCD(times[a[r]],M);
while(x<)x+=M;
sum=((sum*(r-l+))%M*x)%M;
}
while(r>q[i].r){
exGCD((r-l+),M);
while(x<)x+=M;
sum=((sum*times[a[r]])%M*x)%M;
times[a[r]]--;
r--;
}
while(l<q[i].l){
exGCD((r-l+),M);
while(x<)x+=M;
sum=((sum*times[a[l]])%M*x)%M;
times[a[l]]--;
l++;
}
while(l>q[i].l){
l--;
times[a[l]]++;
exGCD(times[a[l]],M);
while(x<)x+=M;
sum=((sum*(r-l+)%M)*x)%M;
}
q[i].value=sum;
}
}
int main(void){
scanf("%I64d",&T);
while(T--){
init();
solve();
sort(q,q+m,cmp_by_no);
for(LL i=;i<m;++i)
printf("%I64d\n",q[i].value);
}
}
NPY and girls的更多相关文章
- HDU 5145 NPY and girls 莫队+逆元
NPY and girls Problem Description NPY's girlfriend blew him out!His honey doesn't love him any more! ...
- 【HDU 5145】 NPY and girls(组合+莫队)
pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...
- hdu5145 NPY and girls
人生中第一道莫队,本来以为是一道水题的.. 首先这题只有区间查询,没有修改操作,使用莫队比较明显,但统计答案有点麻烦.. 根据题意,在n个人里选m个不相同种类的人,设第i种人数量为ai,总方案为c(n ...
- HDU 5145 - NPY and girls
题意: cases T(1≤T≤10) (0<n,m≤30000) (0<ai≤30000) n个数ai 表示n个女孩所在教室 m次询问 [L,R](1 <= L <= ...
- HDU 5145 NPY and girls(莫队算法+乘法逆元)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5145 [题目大意] 给出一个数列,每次求一个区间数字的非重排列数量.答案对1e9+7取模. [题解 ...
- HDU 5145 NPY and girls (莫队分块离线)
题目地址:HDU 5145 莫队真的好奇妙.. 这种复杂度竟然仅仅有n*sqrt(n)... 裸的莫队分块,先离线.然后按左端点分块,按块数作为第一关键字排序.然后按r值作为第二关键字进行排序. 都是 ...
- HDU5145:5145 ( NPY and girls ) (莫队算法+排列组合+逆元)
传送门 题意 给出n个数,m次访问,每次询问[L,R]的数有多少种排列 分析 \(n,m<=30000\),我们采用莫队算法,关键在于区间如何\(O(1)\)转移,由排列组合知识得到,如果加入一 ...
- hdu 5145(莫队算法+逆元)
NPY and girls Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- NPY and girls-HDU5145莫队算法
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...
随机推荐
- 微信--高效解决token及授权用户openid的持久化处理办法
摘要 关于微信开发的话题,例子确实已经有不少,但大部分都是人云亦云,很多小细节或者需要注意的地方却大多没有讲清楚,这令很多刚开始开发的人感觉大很迷茫.而我今天要说的话题,主要着眼于两个方面. 一:如 ...
- ORACLE查询语句
--建表FAMILYINF CREATE TABLE FAMILYINFO( FNO NUMBER CONSTRAINT FC001 PRIMARY KEY,--把字段fno约束为主键 ...
- FunDA(3)- 流动数据行操作:FDAPipeLine operations using scalaz-stream-fs2
在上节讨论里我们介绍了数据行流式操作的设想,主要目的是把后台数据库的数据载入前端内存再拆分为强类型的数据行,这样我们可以对每行数据进行使用和处理.形象点描述就是对内存里的一个数据流(data-stre ...
- Oracle 列操作(增加列,修改列,删除列)
1.增加一列: Alter table 表名 add 列名 varchar2(10); 2.修改一列: Alter table 表名 modify 列名 varchar2(20); 3.删除一列: A ...
- centos6.4、6.5、7.0环境下载及安装
centos6.4.6.5.7.0下载地址: http://www.cnblogs.com/zhwl/p/3657958.html或 http://www.linuxdown.net/CentOS/2 ...
- D3.js:完整的柱形图
一个完整的柱形图包含三部分:矩形.文字.坐标轴.本章将对前几章的内容进行综合的运用,制作一个实用的柱形图,内容包括:选择集.数据绑定.比例尺.坐标轴等内容. (1) 添加SVG画布 //画布大小 va ...
- qdoc 写法
Qdoc 注释 Qdoc注释有一些命令, 能够对文档进行组织. QDoc能识别以下3种类型的命令 主题(topic command) 主题命令确定了文档的元素,例如C++类(class),函数(fun ...
- qdoc 简介
Qdoc 介绍 Qdoc是开发者用于在软件工程中生成文档的一个工具.它从工程的源文件中提取qdoc类型注释,并以html页面或者DITA XML文档的形式格式化到文件中.Qdoc在.cpp和.qdoc ...
- JS判断在哪个浏览器打开
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- logstash通过kafka传输nginx日志(三)
单个进程 logstash 可以实现对数据的读取.解析和输出处理.但是在生产环境中,从每台应用服务器运行 logstash 进程并将数据直接发送到 Elasticsearch 里,显然不是第一选择:第 ...