bzoj 3551: [ONTAK2010]Peaks加强版

本文详细解析了ONATK2010竞赛中的Peaks加强版问题,介绍了使用Kruskal算法进行重构树的解决策略,通过主席树维护连通性,实现在线查询,提供了一段完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3551: [ONTAK2010]Peaks加强版

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 3889  Solved: 1143
[Submit][Status][Discuss]

Description

【题目描述】同3545

Input

第一行三个数N,M,Q。
第二行N个数,第i个数为h_i
接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径。
接下来Q行,每行三个数v x k,表示一组询问。v=v xor lastans,x=x xor lastans,k=k xor lastans。如果lastans=-1则不变。
 

Output

同3545

Sample Input

 

Sample Output

 

HINT

 

【数据范围】同3545
 
 
这题是kruskal重构树,这题一定要在线,而3545可以离线,离线的话我们可以排序以后用线段树合并维护连通性。  
构树以后,由于答案都在子树里面,而子树在dfs序里面是一个连续的区间,所以我们维护一个主席树。 
  1 #include<bits/stdc++.h>
  2 using namespace std; 
  3 int const N=200000+10;  
  4 int const M=500000+10;  
  5 #define  mid (l+r)/2 
  6 struct edge{
  7     int to,nt;   
  8 }e[N];  
  9 struct E{
 10     int x,y,z;  
 11     bool operator < (const E &rhs) const{
 12         return z<rhs.z;  
 13     }
 14 }t[M];   
 15 int a[N],b[N],n,m,q,c[N],f[N],val[N],h[N],cnt,sum[N*20],rt[N],tin[N],tout[N],T,id[N],lch[N*20],rch[N*20];    
 16 int d[N][20],anc[N][20];  
 17 void read(int &x){
 18     x=0; char c=getchar();  
 19     while (!isdigit(c)) c=getchar();  
 20     while (isdigit(c)) x=x*10+(c^48),c=getchar(); 
 21 }
 22 int find(int x){
 23     return x==f[x]? x: f[x]=find(f[x]); 
 24 }
 25 void add(int a,int b){
 26     e[++cnt].to=b; 
 27     e[cnt].nt=h[a]; 
 28     h[a]=cnt; 
 29 } 
 30 void kruscal(){
 31     int id=n;  
 32     for(int i=1;i<2*n;i++) f[i]=i;  
 33     for(int i=1;i<=m;i++){
 34         int fx=find(t[i].x); 
 35         int fy=find(t[i].y);  
 36         if(fx!=fy){  
 37             id++;  
 38             f[fx]=f[fy]=id;  
 39             val[id]=t[i].z;  
 40             add(id,fx);     
 41             add(id,fy);  
 42             d[fx][0]=d[fy][0]=t[i].z; 
 43             anc[fx][0]=anc[fy][0]=id;     
 44             if(id==2*n-1) break;   
 45         }
 46     }
 47 }
 48 void dfs(int x){
 49     tin[x]=++T; 
 50     id[T]=x;    
 51     for(int i=h[x];i;i=e[i].nt){
 52         int v=e[i].to;  
 53         dfs(v);  
 54     }
 55     tout[x]=T;  
 56 }
 57 void insert(int now,int &x,int l,int r,int p){
 58     x=++cnt;  
 59     lch[x]=lch[now];rch[x]=rch[now];sum[x]=sum[now];  
 60     if(l==r) {
 61         sum[x]++;  
 62         return;   
 63     }
 64     if(p<=mid) insert(lch[now],lch[x],l,mid,p);  
 65     else insert(rch[now],rch[x],mid+1,r,p);  
 66     sum[x]=sum[lch[x]]+sum[rch[x]];  
 67 }
 68 int query(int x,int y,int l,int r,int k){
 69     if(l==r) return b[r];  
 70     int num=sum[lch[y]]-sum[lch[x]];  
 71     if(num>=k) return query(lch[x],lch[y],l,mid,k);  
 72     else return query(rch[x],rch[y],mid+1,r,k-num);  
 73 }
 74 int main(){
 75     //scanf("%d%d%d",&n,&m,&q); 
 76     read(n);read(m); read(q);    
 77     for(int i=1;i<=n;i++)
 78         read(a[i]),b[i]=a[i];  
 79     sort(b+1,b+n+1); 
 80     int rk=unique(b+1,b+n+1)-b-1; 
 81     for(int i=1;i<=n;i++)  
 82         c[i]=lower_bound(b+1,b+rk+1,a[i])-b; 
 83     int last=0;  
 84     for(int i=1;i<=m;i++) 
 85     //    scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].z); 
 86         read(t[i].x),read(t[i].y),read(t[i].z);    
 87     sort(t+1,t+m+1);  
 88     kruscal();        
 89     cnt=0;  
 90     for(int i=2*n-1;i>=1;i--)  
 91         if(!tin[i]) { 
 92             anc[i][0]=i;  
 93             dfs(i);  
 94         }
 95         /* 
 96      for(int i=2*n-1;i>=1;i--){
 97         cout<<i<<"*** "<<val[i]<<" ** ";  
 98         for(int j=h[i];j;j=e[j].nt){
 99             cout<<e[j].to<<" ";  
100         }
101         cout<<endl;  
102     }  */ 
103     for(int j=1;j<20;j++)  
104         for(int i=1;i<2*n;i++){
105             d[i][j]=max(d[i][j-1],d[anc[i][j-1]][j-1]);  
106             anc[i][j]=anc[anc[i][j-1]][j-1];  
107         }
108     for(int i=1;i<2*n;i++){
109         if(id[i]<=n) insert(rt[i-1],rt[i],1,rk,c[id[i]]);  
110         else rt[i]=rt[i-1];   
111     }    
112     while (q--){
113         int v,x,k;  
114     //    scanf("%d%d%d",&v,&x,&k); 
115         read(v); read(x);read(k);   
116         if(last!=-1){
117             v^=last; 
118             x^=last;  
119             k^=last;  
120         }
121         int t=v;  
122         for(int i=19;i>=0;i--)  
123             if(d[t][i]<=x) t=anc[t][i];   
124         int l=tin[t];  
125         int r=tout[t];
126         int num=sum[rt[r]]-sum[rt[l-1]];    
127         if(num<k) printf("%d\n",last=-1);  
128         else {
129             k=num-k+1;      
130             //cout<<"nima"<<k<<endl;  
131             printf("%d\n",last=query(rt[l-1],rt[r],1,rk,k)); 
132         }
133         //last=0;   
134     }
135     return 0;  
136 
137 }
View Code

 

转载于:https://www.cnblogs.com/ZJXXCN/p/11511765.html

内容概要:本文档详细介绍了基于MATLAB实现的多头长短期记忆网络(MH-LSTM)结合Transformer编码器进行多变量时间序列预测的项目实例。项目旨在通过融合MH-LSTM对时序动态的细致学习和Transformer对全局依赖的捕捉,显著提升多变量时间序列预测的精度和稳定性。文档涵盖了从项目背景、目标意义、挑战与解决方案、模型架构及代码示例,到具体的应用领域、部署与应用、未来改进方向等方面的全面内容。项目不仅展示了技术实现细节,还提供了从数据预处理、模型构建与训练到性能评估的全流程指导。 适合人群:具备一定编程基础,特别是熟悉MATLAB和深度学习基础知识的研发人员、数据科学家以及从事时间序列预测研究的专业人士。 使用场景及目标:①深入理解MH-LSTM与Transformer结合的多变量时间序列预测模型原理;②掌握MATLAB环境下复杂神经网络的搭建、训练及优化技巧;③应用于金融风险管理、智能电网负荷预测、气象预报、交通流量预测、工业设备健康监测、医疗数据分析、供应链需求预测等多个实际场景,以提高预测精度和决策质量。 阅读建议:此资源不仅适用于希望深入了解多变量时间序列预测技术的读者,也适合希望通过MATLAB实现复杂深度学习模型的开发者。建议读者在学习过程中结合提供的代码示例进行实践操作,并关注模型训练中的关键步骤和超参数调优策略,以便更好地应用于实际项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值