博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NPY and girls
阅读量:5898 次
发布时间:2019-06-19

本文共 1496 字,大约阅读时间需要 4 分钟。

NPY and girls

题目链接:

莫队算法

注意到没有修改区间的操作,使用莫队算法:将整个区间分成若干个块,将询问区间按块优先升序排序,同块内按区间右界升序排序,添加一个元素,满足条件的值sum就变为sum=(sum*times[a[r]]/(r-l+1));减少一个值同理。从第一个区间一直推到最后一个区间即可。(之前TLE一直以为是区间大小的问题,现在发现是这句话while(x<0)x+=M,不过因为这题M比较大,改改区间居然被我水过去了...)

代码如下:

1 #include
2 #include
3 #include
4 #include
5 #define N 30005 6 #define M 1000000007 7 #define LL long long 8 #define B 250/**((int)sqrt((double)n)) sqrt(n) will be TLE**/ 9 #define mst(x) memset(x,0,sizeof(x)) 10 using namespace std; 11 LL times[N]; 12 LL T,n,m,x,y; 13 LL a[N]; 14 struct nod{ 15 LL l,r,no,value; 16 }q[N]; 17 LL exGCD(LL a,LL b){ 18 if(b==0){ 19 x=1; 20 y=0; 21 return a; 22 } 23 LL r=exGCD(b,a%b); 24 LL tmp=x; 25 x=y; 26 y=tmp-(a/b)*y; 27 return r; 28 } 29 bool cmp_by_range(nod x,nod y){ 30 if(x.l/B==y.l/B){ 31 return x.r
q[i].r){ 73 exGCD((r-l+1),M); 74 while(x<0)x+=M; 75 sum=((sum*times[a[r]])%M*x)%M; 76 times[a[r]]--; 77 r--; 78 } 79 while(l
q[i].l){ 87 l--; 88 times[a[l]]++; 89 exGCD(times[a[l]],M); 90 while(x<0)x+=M; 91 sum=((sum*(r-l+1)%M)*x)%M; 92 } 93 q[i].value=sum; 94 } 95 } 96 int main(void){ 97 scanf("%I64d",&T); 98 while(T--){ 99 init();100 solve();101 sort(q,q+m,cmp_by_no);102 for(LL i=0;i

 

转载于:https://www.cnblogs.com/barrier/p/5769673.html

你可能感兴趣的文章
细节决定成败----Android应用程序的优化(二)
查看>>
正则表达式30分钟入门教程
查看>>
finsh indexMain
查看>>
Struts2国际化
查看>>
ChartDirector创建数据点的方法
查看>>
最近运气不咋好
查看>>
OpenSuSE 关闭防火墙
查看>>
WLAN漫游
查看>>
read 和 echo
查看>>
S3C2440的内存管理
查看>>
列表,元组,字典的异同
查看>>
在MyEclipse中构建SQL查询语句
查看>>
Linux/Centos 重置Mysql root用户密码
查看>>
2017-10-9linux文本处理
查看>>
CALayer的那些事(二)
查看>>
[C语言]unicode与utf-8编码转换(一)
查看>>
root用户可以引入cx_Oracle包,其他用户不可以导入
查看>>
Linux防火墙iptables学习笔记(二)参数指令
查看>>
Prometheus监控的最佳实践——关于监控的3项关键指标
查看>>
单向的1:n
查看>>