JZOJ 5428. 【NOIP2017提高A组集训10.27】查询
来源:互联网 发布:中世纪2优化9丹麦 编辑:程序博客网 时间:2024/05/14 21:12
题目
给出一个长度为n的序列a[]
给出q组询问,每组询问形如
数据范围
1<=n<=8000,1<=q<=500000,
题解
很容易想到,每次询问的时候,
然而这样做有个缺点:每一次都要
将x和y出现的位置找出来,排个序,然后做一遍。
总时间复杂度
蒟蒻有个问题,怎么计算答案。
我们知道相邻两个位置之间的t是一样的,所以只要计算t=w(w为一个数)时的t的个数,即可得到答案。
代码
#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>#define N 8010#define P(a) putchar(a)#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;struct note{ int to,next;};note edge[N*10];struct note1{ int d,w;};note1 qu[N*2];int a[N],a1[N],b[N];int o[N],head[N],q1[N],q2[N];int ans[N][N];int i,j,k,l,r,l1,r1,n,q,sum,wz,last;int cnt[N*2],bz[N*2],cn,CNT,c1,c2,tot;int read(){ int res=0,fh=1;char ch; while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')fh=-1,ch=getchar(); while(ch>='0'&&ch<='9')res=res*10+ch-'0',ch=getchar(); return res*fh;}void write(int x){ if(x>9)write(x/10); P(x%10+'0');}int calc(int n){return n*(n+1)/2;}int calc1(int n){return n*(n-1)/2;}void lb(int x,int y){edge[++tot].to=y;edge[tot].next=head[x];head[x]=tot;}bool cmp(note1 x,note1 y){return x.d<y.d;}int main(){ freopen("query.in","r",stdin); freopen("query.out","w",stdout); n=read(),q=read(); fo(i,1,n)a[i]=read(),b[i]=a[i]; memcpy(a1,a,sizeof(a1));sort(b+1,b+n+1);cn=unique(b+1,b+n+1)-b-1; fo(i,1,n){ a1[i]=lower_bound(b+1,b+cn+1,a1[i])-b; o[a1[i]]=a[i]; } fd(i,n,1)lb(a1[i],i); fo(i,1,cn-1) fo(j,i+1,cn){ c1=0; for(k=head[i];k;k=edge[k].next) qu[++c1].d=edge[k].to,qu[c1].w=1; for(k=head[j];k;k=edge[k].next) qu[++c1].d=edge[k].to,qu[c1].w=2; sort(qu+1,qu+c1+1,cmp); CNT++; bz[8000]=CNT;cnt[8000]=qu[1].d; qu[c1+1].d=n+1; wz=8000; ans[i][j]=calc1(qu[1].d); fo(k,1,c1){ if(qu[k].w==1)wz++;else wz--; if(CNT!=bz[wz]){ bz[wz]=CNT; cnt[wz]=0; } ans[i][j]+=calc1(qu[k+1].d-qu[k].d)+cnt[wz]*(qu[k+1].d-qu[k].d); cnt[wz]+=qu[k+1].d-qu[k].d; } ans[j][i]=ans[i][j]; } fo(i,1,q){ l=read(),r=read(); l1=lower_bound(b+1,b+cn+1,l)-b; r1=lower_bound(b+1,b+cn+1,r)-b; if(o[l1]!=l)l=l1=0;if(o[r1]!=r)r=r1=0; if((!l&&!r) ||(l1==r1)){ write(calc(n));P('\n'); continue; } if((!l&&r) || (!r&&l)){ sum=last=0; if(r)l1=r1; for(k=head[l1];k;k=edge[k].next){ sum+=calc(edge[k].to-1-last); last=edge[k].to; } sum+=calc(n-last); write(sum);P('\n'); continue; } write(ans[l1][r1]); P('\n'); } return 0;}
阅读全文
2 0
- JZOJ 5428. 【NOIP2017提高A组集训10.27】查询
- 【JZOJ 5428】【NOIP2017提高A组集训10.27】查询
- 【JZOJ 5429】【NOIP2017提高A组集训10.27】排列
- 【JZOJ 5430】【NOIP2017提高A组集训10.27】图
- JZOJ 5432. 【NOIP2017提高A组集训10.28】三元组
- 【JZOJ 5432】【NOIP2017提高A组集训10.28】三元组
- JZOJ 5407. 【NOIP2017提高A组集训10.21】Deep
- JZOJ 5408. 【NOIP2017提高A组集训10.21】Dark
- 【JZOJ 5409】【NOIP2017提高A组集训10.21】Fantasy
- JZOJ 5410. 【NOIP2017提高A组集训10.22】小型耀斑
- 【JZOJ 5410】【NOIP2017提高A组集训10.22】小型耀斑
- 【JZOJ 5411】【NOIP2017提高A组集训10.22】友谊
- JZOJ 5414. 【NOIP2017提高A组集训10.22】幸运值
- JZOJ 5407. 【NOIP2017提高A组集训10.21】Deep
- 【JZOJ 5414】【NOIP2017提高A组集训10.22】幸运值
- 【JZOJ 5415】【NOIP2017提高A组集训10.22】公交运输
- 【JZOJ 5416】【NOIP2017提高A组集训10.22】密码
- JZOJ 5415. 【NOIP2017提高A组集训10.22】公交运输
- phpcms 缓存
- C#-LINQ
- 【LC解题报告】11. Container With Most Water
- 完整复现何恺明ICCV获奖论文结果并开源 !(附论文&开源代码)
- MySQL 设置允许远程登录
- JZOJ 5428. 【NOIP2017提高A组集训10.27】查询
- 51nod 1091 线段的重叠
- 修改srpingBoot Banner
- 51 nod 1003:一个数阶乘后0的个数
- 【一】如果让我学习TensorFlow,我该怎么学?
- 余额宝惨败,马云担心的事情发生了!
- 2017.10.26 測試總結并今日總結
- R 语言 wordcloud 与 wordcloud2 包的安装及参数说明
- android 解决华为 SlidingMenu出现白屏