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. for循环和while循环

    for循环和while循环 --道心 for循环 name1_list=['daoxin','wuxin','zhixin']for ele in name1_list: #找到"wuxin ...

  2. xhtml头文件设置

    设置字符集编码: <head> <meta http-equiv="Content-Type" Content="text/html" cha ...

  3. kibana使用的lucene查询语法

    kibana在ELK阵营中用来查询展示数据elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 kibana4官方演示页面 全文搜索 在搜索栏输入login,会返回所有字段值 ...

  4. D3.js:力导向图

    var nodes = [ { name: "桂林" }, { name: "广州" }, { name: "厦门" }, { name: ...

  5. python爆破zip脚本

    最近在提高自己编程能力,拿一些实用的小工具练下.该脚本为python语言,主要涉及模块zipfile,threadings模块. 功能:暴力猜解zip解压密码 #coding: utf-8 impor ...

  6. 继承,多态,集合,面向对象,XML文件解析,TreeView动态加载综合练习----->网络电视精灵项目练习、分析

    网络电视精灵 项目运行状态如图: 项目完成后的类: 首先,将程序分为二部分进行: 一:TreeView节点内容的设计及编写: 1.1遍写XML文件:管理(FullChannels.xml),A类电视台 ...

  7. 用CSS实现文本框尖角

    经常看到这样的尖角,以前不懂,以为都是用图片做出来的,后来惊奇的发现,原来很多都是用CSS做出来的,既美观又节省资源,真是两全其美啊! 那么,用CSS怎么实现这种效果呢?首先,来写一个简单的代码: & ...

  8. HDU 5887 Herbs Gathering

    背包,$map$,优化. 和普通背包一样,$map$加一个$erase$优化一下就可以跑的很快了. #pragma comment(linker, "/STACK:1024000000,10 ...

  9. 常用网页标签重置CSS

    做前端开发时常需要将网页中所有标签的格式清空,从而使各个浏览器标签样式一样.以下是网络上常见的CSS代码 /* =s Reset (by YUI 3) */ html{color:#000;} bod ...

  10. javascript和jquery比较中学习

    获取input的值: document.getElementById("id").value;这里查的是input的name属性 $('input').val(); 设置input ...