博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu4849 寻找宝藏 (cdq分治+dp)
阅读量:5051 次
发布时间:2019-06-12

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

设f[i]是已经走到i号点的值。

先要给第四维离散化、然后去重

第一维排序,第二维cdq分治,第三维cdq分治,第四维树状数组,找到满足j(x,y,z,w)<=i(x,y,z,w)的j,给i统计答案就可以。

然后在做的时候可以直接统计左区间内部答案、统计左区间给右区间造成的答案,但是一定要在这两个做完以后再统计右区间内部的答案,因为用右区间的某个j去更新i时,那个j是会被前面的区间影响的

然后就被卡常了QAQ...分治里一定要写尽量少的sort啊...

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #define LL long long int 9 #define inf 0x3f3f3f3f 10 #define lowbit(x) ((x)&(-(x))) 11 using namespace std; 12 const int maxn=80080,mod=998244353; 13 14 LL rd(){ 15 LL x=0;char c=getchar();int neg=1; 16 while(c<'0'||c>'9'){ if(c=='-') neg=-1;c=getchar();} 17 while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); 18 return x*neg; 19 } 20 21 struct Node{ 22 int x,y,z,w,i; 23 LL v;bool b; 24 }tmp1[maxn],tmp2[maxn],tmp3[maxn],arr1[maxn]; 25 int N,M,mv[maxn],fv[maxn]; 26 LL ma[maxn],fa[maxn]; 27 const int sizN=sizeof(Node); 28 29 inline void change(int x,LL y,int z){ 30 if(z==0){ 31 while(x&&x<=M) ma[x]=mv[x]=0,x+=lowbit(x); 32 return; 33 } 34 while(x&&x<=M){ 35 if(ma[x]
a) re=mv[x],a=ma[x]; 48 else if(ma[x]==a) re=(re+mv[x])%mod; 49 x-=lowbit(x); 50 }return re; 51 } 52 53 inline bool cmpw(Node a,Node b){ return a.w
=r) return; 66 //printf("!%d %d\n",l,r); 67 int m=l+r>>1,p=l,q=m+1,t=l; 68 cdq2(l,m);sort(tmp1+l,tmp1+m+1,cmpz); 69 memcpy(tmp3+m+1,tmp1+m+1,sizN*(r-m));sort(tmp1+m+1,tmp1+r+1,cmpz); 70 while(p<=m&&q<=r){ 71 if(tmp1[p].z<=tmp1[q].z){ 72 if(!tmp1[p].b){ 73 change(tmp1[p].w,fa[tmp1[p].i],fv[tmp1[p].i]); 74 }p++; 75 }else{ 76 if(tmp1[q].b){ 77 LL a=querya(tmp1[q].w)+tmp1[q].v;int v=queryv(tmp1[q].w); 78 if(v){ 79 if(a>fa[tmp1[q].i]) fa[tmp1[q].i]=a,fv[tmp1[q].i]=v; 80 else if(a==fa[tmp1[q].i]) fv[tmp1[q].i]=(fv[tmp1[q].i]+v)%mod; 81 } 82 } 83 q++; 84 } 85 }while(q<=r){ 86 if(tmp1[q].b){ 87 LL a=querya(tmp1[q].w)+tmp1[q].v;int v=queryv(tmp1[q].w); 88 if(v){ 89 if(a>fa[tmp1[q].i]) fa[tmp1[q].i]=a,fv[tmp1[q].i]=v; 90 else if(a==fa[tmp1[q].i]) fv[tmp1[q].i]=(fv[tmp1[q].i]+v)%mod; 91 } 92 } 93 q++; 94 }for(int i=l;i
=r) return;100 int m=l+r>>1,p=l,q=m+1,t=l;101 cdq1(l,m);sort(arr1+l,arr1+m+1,cmpy);102 memcpy(tmp2+m+1,arr1+m+1,sizN*(r-m));sort(arr1+m+1,arr1+r+1,cmpy);103 while(p<=m&&q<=r){104 if(arr1[p].y<=arr1[q].y){105 tmp1[t]=arr1[p++];tmp1[t].b=0;106 }else{107 tmp1[t]=arr1[q++];tmp1[t].b=1;108 }t++;109 }while(p<=m) tmp1[t]=arr1[p++],tmp1[t++].b=0;110 while(q<=r) tmp1[t]=arr1[q++],tmp1[t++].b=1;111 cdq2(l,r);112 memcpy(arr1+m+1,tmp2+m+1,sizN*(r-m));cdq1(m+1,r);113 }114 115 int main(){116 //freopen("xzbz.in","r",stdin);117 int i,j,k;118 N=rd(),M=rd();119 for(i=1;i<=N;i++){120 tmp1[i].i=i;tmp1[i].x=rd();tmp1[i].y=rd();121 tmp1[i].z=rd();tmp1[i].w=rd();tmp1[i].v=rd();122 }sort(tmp1+1,tmp1+N+1,cmpw);123 for(i=1,j=0;i<=N;i++){124 tmp2[i]=tmp1[i];125 if(tmp1[i].w==tmp1[i-1].w) tmp2[i].w=j;126 else tmp2[i].w=++j;127 }M=j;128 sort(tmp2+1,tmp2+N+1,cmpx);129 for(i=1,j=0;i<=N;i++){130 if(tmp2[i].x==tmp2[i-1].x&&tmp2[i].y==tmp2[i-1].y&&tmp2[i].z==tmp2[i-1].z&&tmp2[i].w==tmp2[i-1].w){131 arr1[j].v=(arr1[j].v+tmp2[i].v)%mod;132 fa[j]=arr1[j].v;133 }else{134 arr1[++j]=tmp2[i];arr1[j].i=j;135 fa[j]=arr1[j].v;fv[j]=1;136 }137 }N=j;138 cdq1(1,N);139 LL a=0;int v=0;140 for(i=1;i<=N;i++){141 if(fa[i]>a) a=fa[i],v=fv[i];142 else if(fa[i]==a) v=(v+fv[i])%mod;143 }printf("%lld\n%d",a,v);144 return 0;145 }

 

转载于:https://www.cnblogs.com/Ressed/p/9535598.html

你可能感兴趣的文章
[BZOJ1083] [SCOI2005] 繁忙的都市 (kruskal)
查看>>
Centos6.4安装JDK
查看>>
201521123069 《Java程序设计》 第4周学习总结
查看>>
线性表的顺序存储——线性表的本质和操作
查看>>
【linux】重置fedora root密码
查看>>
pig自定义UDF
查看>>
输入名字显示其生日,没有则让输入生日,做记录
查看>>
Kubernetes 运维学习笔记
查看>>
并查集 经典 畅通工程
查看>>
Spark MLlib 之 Naive Bayes
查看>>
php修改SESSION的有效生存时间
查看>>
spring security 11种过滤器介绍
查看>>
Hibernate一对多、多对一关联
查看>>
一、记录Git使用中遇到的问题及解决方法
查看>>
学习网址
查看>>
前端表格插件datatables
查看>>
内部类
查看>>
树链剖分入门
查看>>
图解算法时间复杂度
查看>>
UI_搭建MVC
查看>>