题目链接:hdu_5286_wyh2000 and sequence

题意:

给一段长度为N的序列,每次询问l-r(l和r和上一次询问的答案有关)内 不同的数的 出现次数的次方 的和。强制在线

题解:

这里贴个达哥的题解:

大体思路就是,把n个数分成sqrt(n)块,每块sqrt(n)个数,然后求出任意两块i到j(包含第i块和第j块)的ans,对于每次询问l和r,找到刚好包含l和r的一段连续的块,因为我们已经知道了这段连续块的答案,所以只要再去掉两段多出来的一部分,就好了。

为了得到任意两块间的答案G[i][j],我们可以枚举每个块的起点,然后for到最后,暴力一边,就好了,

对于多出来的一部分,我们只要知道这一部分里的数,在包含它的连续块中已经出现了几次,然后就可以很容易地更新答案了。于是我们可以先预处理出一个后缀和cnt[i][j]:表示从第i块开始,第j小的数出现了多少次,然后,对于每次询问q,我们 只要 只要 只要 (后缀和减一下)找到这一部分里的数在连续的块中出现了次数就好了,别的数就算了,都找的话,肯定超时。

之前还要预处理各种数次方的结果,还要排序,去重。

cnt[i][j]:从第i块开始到最后第j小的数出现的次数

pos[i]:在A中下标为i的数是第几小

 #include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
typedef long long ll; const int N=5e4+,P=1e9+; int sqr,n,m,l,r,len,t,pos[N],cnt[][N];
ll A[N],a[N],num[N],vis[N];
vector<ll>v[N];//第i小的数的j次方
ll G[][];//块i到j的答案 int T_T(int l,int r)
{
int L=l/sqr,R=r/sqr;
ll ans=G[L][R];
int LL=L*sqr,RR=min(n-,(R+)*sqr-);
F(i,LL,l-)num[pos[i]]=cnt[L][pos[i]]-cnt[R+][pos[i]];
F(i,r+,RR)num[pos[i]]=cnt[L][pos[i]]-cnt[R+][pos[i]];
while(LL<l)
{
ans-=v[pos[LL]][num[pos[LL]]];
ans+=v[pos[LL]][--num[pos[LL]]];
LL++;
}
while(RR>r)
{
ans-=v[pos[RR]][num[pos[RR]]];
ans+=v[pos[RR]][--num[pos[RR]]];
RR--;
}
return (ans%P+P)%P;
} int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
F(i,,n-)scanf("%lld",a+i),A[i]=a[i];
sort(a,a+n),len=unique(a,a+n)-a;
F(i,,len-)v[i].clear(),v[i].push_back(),vis[i]=;
F(i,,n-)vis[pos[i]=lower_bound(a,a+len,A[i])-a]++;
F(i,,len-)
{
ll p=;
F(j,,vis[i])v[i].push_back(p=p*a[i]%P);
}
sqr=sqrt(n+0.5);
memset(cnt,,sizeof(cnt));
for(int i=;i*sqr<n;i++)
{
ll ans=;
memset(num,,sizeof(num));
for(int j=i*sqr;j<n;j++)
{
cnt[i][pos[j]]++;
ans-=v[pos[j]][num[pos[j]]];
ans+=v[pos[j]][++num[pos[j]]];
if((j+)%sqr==||j==n-)G[i][j/sqr]=(ans%P+P)%P;
}
}
int la=;
while(m--)
{
int L,R;
scanf("%d%d",&L,&R);
l=(L^la)%n,r=(R^la)%n;
if(l>r)l^=r,r^=l,l^=r;
printf("%d\n",la=T_T(l,r));
}
}
return ;
}

hdu_5286_wyh2000 and sequence(分块)的更多相关文章

  1. hdu 5057 Argestes and Sequence(分块算法)

    Argestes and Sequence Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  2. hdu5057 Argestes and Sequence 分块

    Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Submiss ...

  3. HDU - 6395 Sequence (分块+快速矩阵幂)

    给定递推式: 求Fn. 分析:给出的公式可以用快速矩阵幂运算得到,但 P/n 整除对于不同的i,值是不同的. 可以根据P将3-n分成若干块,每块中P整除n的值是相同的.分块的时候要注意判断. 将每块的 ...

  4. [hdu-6395]Sequence 分块+矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6395 因为题目数据范围太大,又存在递推关系,用矩阵快速幂来加快递推. 每一项递推时  加的下取整的数随 ...

  5. Sequence( 分块+矩阵快速幂 )

    题目链接 #include<bits/stdc++.h> using namespace std; #define e exp(1) #define pi acos(-1) #define ...

  6. 杭电多校第七场 1010 Sequence(除法分块+矩阵快速幂)

    Sequence Problem Description Let us define a sequence as below f1=A f2=B fn=C*fn-2+D*fn-1+[p/n] Your ...

  7. HDU-6395 多校7 Sequence(除法分块+矩阵快速幂)

    Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  8. HDU5286 wyh2000 and sequence【分块 均摊复杂度】

    HDU5286 wyh2000 and sequence 题意: 给出长为\(N\)的序列\(A_1,A_2,A_3,\cdots,A_n\),\(q\)次询问,每次询问给出区间\([L,R]\),假 ...

  9. poj 1141 Brackets Sequence 区间dp,分块记录

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 35049   Accepted: 101 ...

随机推荐

  1. RPC 框架原理详解

    首先了解什么叫RPC,为什么要RPC,RPC是指远程过程调用?也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网 ...

  2. Java learning notes (1):Basic Knowlege points

    Basic Knowlege points: 1: it's necessary that there is only one public class in per .java file 2: .j ...

  3. 杂谈3之English

    1.面向过程(OPP):Orient Procedure Program (C语言) 2.面向对象(OOP):Orient ObjectProgram(Java) 3.面向对象的三大特征:继承Inhe ...

  4. 《css揭秘》

    <css揭秘> 第一章:引言 引言 案例们 第二章:背景与边框 背景和边框 半透明边框(rgba/hsla.background-clip) 多重边框(box-shadow) 灵活的背景定 ...

  5. VR应用向导,全球Top10 VR应用排行榜

    2016年国际知名产商索尼.三星.HTC.Oculus.YouTube等等都推出了自己的VR设备,与此同时还有自有的VR应用平台,供各位玩家下载应用体验沉浸式VR,当然每个平台的VR应用下载量各不相同 ...

  6. Python学习笔记——进阶篇【第九周】———协程

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...

  7. ubuntu 安装Matlab 解决显示中文乱码

    在ubuntu 14.04中安装Matlab 2015a打开后发现中文乱码,这主要是由于JAVA中文支持问题.   解决方法如下: 进入Maltab的安装路径: 进入JRE目录: cd Matlab目 ...

  8. swift label不同颜色、不同字体

    let string = "点击注册按钮,即表示您已同意隐私条款和服务协议" let ranStr = "同意" let attrstring:NSMutabl ...

  9. redhat 安装配置samba实现win共享linux主机目录

    [转]http://blog.chinaunix.net/uid-26642180-id-3135941.html redhat 安装配置samba实现win共享linux主机目录 2012-03-1 ...

  10. 怎样取json对应的值

    { "轮胎1":[{"数量": "1","型号": "195 65R15","售价&quo ...