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的更多相关文章

  1. HDU 5145 NPY and girls 莫队+逆元

    NPY and girls Problem Description NPY's girlfriend blew him out!His honey doesn't love him any more! ...

  2. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  3. hdu5145 NPY and girls

    人生中第一道莫队,本来以为是一道水题的.. 首先这题只有区间查询,没有修改操作,使用莫队比较明显,但统计答案有点麻烦.. 根据题意,在n个人里选m个不相同种类的人,设第i种人数量为ai,总方案为c(n ...

  4. 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 <= ...

  5. HDU 5145 NPY and girls(莫队算法+乘法逆元)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5145 [题目大意] 给出一个数列,每次求一个区间数字的非重排列数量.答案对1e9+7取模. [题解 ...

  6. HDU 5145 NPY and girls (莫队分块离线)

    题目地址:HDU 5145 莫队真的好奇妙.. 这种复杂度竟然仅仅有n*sqrt(n)... 裸的莫队分块,先离线.然后按左端点分块,按块数作为第一关键字排序.然后按r值作为第二关键字进行排序. 都是 ...

  7. HDU5145:5145 ( NPY and girls ) (莫队算法+排列组合+逆元)

    传送门 题意 给出n个数,m次访问,每次询问[L,R]的数有多少种排列 分析 \(n,m<=30000\),我们采用莫队算法,关键在于区间如何\(O(1)\)转移,由排列组合知识得到,如果加入一 ...

  8. hdu 5145(莫队算法+逆元)

    NPY and girls Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  9. NPY and girls-HDU5145莫队算法

    Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...

随机推荐

  1. jQuery核心结构简单分析

    以下分析均采取沙箱模式 (function (window) { //为了提高性能把需要的变量统一提前声明 var arr = [], push = arr.push; //为区别jQuery,此文章 ...

  2. 第10章:DOM

  3. java集合图示

  4. Leetcode-34-Search for a Range-(Medium)

    这道题借助二分查找算法来查找目标值的index 然后向前和向后分别搜索起始边界 注意开始排除异常值优化速度 #!/usr/local/bin/python3 # -*- coding: utf-8 - ...

  5. 5754Life Winner Bo

    给定一个n*m的矩阵,有四种棋子(国际象棋的王,王后,骑士,车).起点在(1,1)先走到(n,m)获胜. 分析:车是nim博弈.王后是威佐夫博弈.王和骑士写两个1000*1000的预处理即可. hdu ...

  6. 对于行高(line-height)的一些理解

    刚一开始学习这个特性的时候,总是出一些当时看起来很奇怪的问题.现在决定重新整理一下.毕竟使用css,十行揉在一起凑出效果是一种使用,知道为什么会有这种效果也是一种使用.我们需要做一些测试,所以首先需要 ...

  7. iOS UIImageView自适应图片大小

    窗口大小获取: CGRect screenBounds = [ [UIScreenmainScreen]bounds];//返回的是带有状态栏的Rect CGRect rect = [ [UIScre ...

  8. 【Android】策略模式封装百度地图路线规划模块

    百度地图的Demo里有个路线规划的功能,但是,这个功能和Activity耦合性太高,所以需要单独抽离出路径规划功能,进行"解耦". 注:由于项目原因,本文只针对驾车路线规划进行封装 ...

  9. python绝技 — 用Scapy测试无线网卡的嗅探功能

    代码 #!/usr/bin/python #--*--coding=utf-8--*-- from scapy.all import * def pktPrint(pkt): if pkt.hasla ...

  10. 3-Dom

    HTML DOM 对象DOM DocumentDOM ElementDOM AttributeDOM Event Document对象 每个载入浏览器的 HTML 文档都会成为 Document 对象 ...