正解:$kruscal$重构树

解题报告:

传送门$QwQ$

语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$

所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海拔.有$Q$组询问,每次查询从$x$出发,经过海拔超过$p$的所有路径,能到达的节点中距离1号节点的最短路径长是多少$QwQ$

首先看到这个对海拔的限制就显然考虑$kruscal$重构树呗$QwQ$,然后说是所有海拔超过$p$的路径能到达的点中最短路最小的点$QwQ$?

可以理解成把最短路作为一个点的属性,然后问$kruscal$重构树中一棵子树中的属性$min$是多少$QwQ$?

那不给每个节点记录下子树内的属性$min$然后每次查询就跳下就成$QwQ$?

然后就做完了鸭$QwQ$

$overrrrrr$

然后$attention$,那个$lastans$在每一轮都要清零,,,因为它是说每个第一天$lastans$都等于0$QwQ$

$over$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define mp make_pair
#define int long long
#define P pair<int,int>
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define fy(i) edge_krus[i].wei
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];i;i=edge[i].nxt) const int N=+,M=+;
int ed_cnt,ed_tr_cnt,head[N],as[N<<],fat[N<<][],nod_cnt,n,m,fa[N<<],lstas,val[N<<];
bool vis[N];
struct ed{int to,nxt,wei;}edge[M<<];
struct ed_tr{int fr,to,wei;}edge_krus[M]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il bool cmp(ed_tr gd,ed_tr gs){return gd.wei>gs.wei;}
int fd(ri x){return fa[x]==x?x:fa[x]=fd(fa[x]);}
il void ad(ri x,ri y,ri z){edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;}
il void dij()
{
priority_queue< P,vector<P>,greater<P> >Q;
memset(vis,,sizeof(vis));memset(as,,sizeof(as));as[]=;Q.push(mp(,));
while(!Q.empty())
{
ri nw=Q.top().second;Q.pop();if(vis[nw])continue;vis[nw]=;
e(i,nw)if(as[t(i)]>as[nw]+w(i))as[t(i)]=as[nw]+w(i),Q.push(mp(as[t(i)],t(i)));
}
}
il int jump(ri x,ri y){my(i,,)if(val[fat[x][i]]>y)x=fat[x][i];return x;} signed main()
{
freopen("return.in","r",stdin);freopen("return.out","w",stdout);
ri T=read();
while(T--)
{
n=read();m=read();rp(i,,n<<)fa[i]=i;nod_cnt=n;ed_cnt=;memset(head,,sizeof(head));lstas=;
rp(i,,m){ri x=read(),y=read(),z=read(),p=read();ad(x,y,z);ad(y,x,z);edge_krus[i]=(ed_tr){x,y,p};}
dij();sort(edge_krus+,edge_krus++m,cmp);
//rp(i,1,n)printf("as[%d]=%d\n",i,as[i]);
rp(i,,m)
{
ri x=fd(edge_krus[i].fr),y=fd(edge_krus[i].to);if(x==y)continue;
//printf("x=%d y=%d z=%d fy=%d\n",edge_krus[i].fr,edge_krus[i].to,edge_krus[i].wei,fy(i));
fa[x]=fa[y]=fat[x][]=fat[y][]=++nod_cnt;as[nod_cnt]=min(as[x],as[y]);val[nod_cnt]=fy(i);
//printf("val[fa[%d]=fa[%d]=%d]=%d nod_cnt=%d\n",x,y,fa[x],val[fa[x]],nod_cnt);
}
rp(i,,)rp(j,,nod_cnt)fat[j][i]=fat[fat[j][i-]][i-];
ri Q=read(),k=read(),s=read();
while(Q--)
{
ri x=(read()+k*lstas-)%n+,y=(read()+k*lstas)%(s+);printf("%lld\n",lstas=as[jump(x,y)]);
}
}
return ;
}

最新文章

  1. 让T4脱离VS生成代码
  2. 【总结】JS里的数组排序
  3. Oracle RMAN 恢复控制文件到指定的路径
  4. js字符串RTrim方法(right trim)
  5. Saltstack grains组件
  6. Kibana安装及部署
  7. 内存回收,Dispose,Close,Finalie(C#中的析构函数)
  8. linux操作文本文件
  9. LeetCode Coins in a Line
  10. LINQ TO XML初步了解
  11. Android 开发笔记___shape
  12. MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)
  13. 真tm郁闷
  14. js 实现动态时间
  15. tensorflow-gpu安装的一些注意
  16. C#获取中国天气网免费天气预报信息
  17. Java并发编程之volatile的应用
  18. Building simple plug-ins system for ASP.NET Core(转)
  19. Centos查看端口占用和关闭端口
  20. 动态规划:部分和问题和数字和为sum的方法数

热门文章

  1. jQuery学习笔记之可见性过滤选择器
  2. LeetCode59 Spiral Matrix II
  3. HDFS 通信接口
  4. 我钟爱的HTML5和CSS3在线工具【转】
  5. @codeforces - 1205D@ Almost All
  6. ViewPager封装工具类: 轻松实现APP导航或APP中的广告栏
  7. Bert系列(二)——源码解读之模型主体
  8. 多版本python共存,安装三方库到指定python版本
  9. POJ2976 题解 0/1分数规划入门题 二分
  10. oracle强制索引失效