首先$O(n^2\log n)$暴力很好想,直接每个点出发跑一遍最短路,排$dis$统计一下即可。
考虑怎么优化。
发现$rank$很小,考虑从$rank$入手。
换一种统计方法,看每个点$x$如果作为别的点的兴趣点,可能产生多少贡献。
那么别的点$i$到他的最短距离设为$dis_i$,$i$到所有$rank_x+1$的点里面最短的距离是$f_{i,rank_x+1}$,那么肯定只有$dis_i<f_{i,rank_x+1}$的时候才产生一次贡献。所以我们可以先从大的$rank$的点开始枚举跑单源最短路,计算他对所有点的贡献。
那么这里设$f_{x,r}$表示点$x$和所有$rank$为$r$(或者$\ge r$,因为这个是单调的)的点里距离最近的是多远。统计总答案。
但是复杂度并没有变啊。。。`````
事实上,这个复杂度确实没有办法优化了,但是,观察题目字眼,会发现题目善意的告诉了我们总贡献$\le 30n$。也就是说,真正在跑最短路的时候有效的$dis_i<f_{i,rank_x+1}$点就那么多个,必须尽可能排除没有贡献的点,只把有贡献的统计到。
发现,在以$s$跑dij的时候,若在$x$点去松弛了$y$,但是此时$dis_y\ge f_{y,rank_s+1}$,也就是$y$不可能对他感兴趣,那么即使$y$入堆后又去松弛了$z$,也不可能产生贡献并更新$f_{z,rank_s}$。因为:
$$
dis_z\ge dis_y+w_{y,z}\ge f_{y,rank_s+1}+w_{y,z}\ge f_{z,rank_z+1}
$$
通过这个连续不等关系,当松弛$y$的时候不满足产生贡献的判断式,就不要入堆了。这样,我们只有会产生贡献的点入堆,无贡献的点就不进了。虽然理论复杂度不变,但根据题目对于答案的保证,所以这题可通过。
反正我是没想到这个优化。。太神仙了。。
可能会注意到代码里面memset最多用了$30000$次,这个不会T吗。。不会,实际测试发现memset常数小的一批,n方过十万,可能是因为memset的字节填写比手动赋值快很多。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define dbg(x) cerr << #x << " = " << x <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=+,M=+;
struct thxorz{int to,nxt,w;}G[M<<];
int Head[N],tot;
vector<int>rk[];
int n,m,ans;
inline void Addedge(int x,int y,int z){
G[++tot].to=y,G[tot].nxt=Head[x],Head[x]=tot,G[tot].w=z;
G[++tot].to=x,G[tot].nxt=Head[y],Head[y]=tot,G[tot].w=z;
}
#define y G[j].to
int f[N][],dis[N];
priority_queue<pii,vector<pii>,greater<pii> >q;
inline void dij(int s,int r){
memset(dis,0x3f,sizeof dis);q.push(make_pair(dis[s]=,s));
while(!q.empty()){
int x=q.top().second,d=q.top().first;q.pop();
if(dis[x]^d)continue;
++ans,MIN(f[x][r],d);
for(register int j=Head[x];j;j=G[j].nxt)
if(MIN(dis[y],d+G[j].w)&&dis[y]<f[y][r+])q.push(make_pair(dis[y],y));
}
}
#undef y
int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
read(n),read(m);
for(register int i=,x;i<=n;++i)read(x),rk[x].push_back(i);
for(register int i=,x,y,z;i<=m;++i)read(x),read(y),read(z),Addedge(x,y,z);
memset(f,0x3f,sizeof f);
for(register int i=;i;--i){
for(register int j=;j<rk[i].size();++j)dij(rk[i][j],i);
for(register int j=;j<rk[i].size();++j)f[rk[i][j]][i]=;
for(register int j=;j<=n;++j)f[j][i-]=f[j][i];
}
return printf("%d\n",ans),;
}

反思:如果题目对于答案有相关的保证,优化可以从排除不可能,尽量统计到答案的角度来进行。例如本题要排除多余策略,必须发现第一次出现的不可能策略,以后都不可能推出可能的出来这个性质,而这个要靠猜想是不是由于只能统计答案那么次所以一旦有不产生贡献的冗枝立刻剪掉。最短路上点过多,尝试去掉不可能的。

luogu1261 服务器储存信息问题[最短路]的更多相关文章

  1. Luogu1261: 服务器储存信息问题

    题面 传送门 Sol 我们可以考虑每种\(rank\)的点\(u\)会被哪些点\(v\)感兴趣 如果\(dis[u][v]<\)所有满足\(rank\)大于\(rank[u]\)的点到\(v\) ...

  2. 查看Zookeeper服务器状态信息的一些命令

    1.Zookeeper服务器当前节点配置信息: echo conf|nc localhost 2181 2.cons:echo cons|nc localhost 2181 输出当前服务器所有客户端连 ...

  3. cat .git/config查看远端服务器信息(git的配置信息:远端服务器连接信息)

    本地git库中,查找其连接的远端服务器信息: 每个git库都会有一个配置信息文件.git/config. cat .git/config,可以看到信息如下: [core]         reposi ...

  4. MySQL优化:使用show status查看MySQL服务器状态信息

    在网站开发过程中,有些时候我们需要了解MySQL的服务器状态信息,譬如当前MySQL启动后的运行时间,当前MySQL的客户端会话连接数,当前MySQL服务器执行的慢查询数,当前MySQL执行了多少SE ...

  5. 使用 SHOW STATUS 查看mysql 服务器状态信息

    在LAMP架构的网站开发过程中,有些时候我们需要了解MySQL的服务器状态信息,譬如当前MySQL启动后的运行时间,当前MySQL的客户端会话连接数,当前MySQL服务器执行的慢查询数,当前MySQL ...

  6. 查看linux服务器内存信息

    查看服务器内存信息 dmidecode|grep -P -A5 "Memory\s+Device"|grep Size [root@localhost home]# dmideco ...

  7. MAR 27 解决华为手机访问Google Play:从服务器检索信息时出错。[DF-DFERH-01]

    虽然路由器已经设置了梯子,但是用华为手机访问Google Play时,还是提示:从服务器检索信息时出错.[DF-DFERH-01].   虽然在手机上把梯子设置成全局模式,连接Google Play后 ...

  8. 跨服务器查询信息的sql

    --跨服务器查询信息的sql: select * from openrowset( 'SQLOLEDB', '192.168.1.104'; 'sa'; '123.com',[AutoMonitorD ...

  9. 【MySQL优化】使用show status查看MySQL服务器状态信息

    在网站开发过程中,有些时候我们需要了解MySQL的服务器状态信息,譬如当前MySQL启动后的运行时间,当前MySQL的客户端会话连接数,当前MySQL服务器执行的慢查询数,当前MySQL执行了多少SE ...

随机推荐

  1. 阿里EMR部署

    选自定义购买: 选择master配置: 选择core配置: 下一步,选高级里在jdbc后填RDS的url, 用户名,密码: jdbc:mysql://rm-d7o7x76l11u0434zn.mysq ...

  2. [转帖]intel发布会之前,漫谈CPU核心架构:CCX、Ring Bus、Mesh

    intel发布会之前,漫谈CPU核心架构:CCX.Ring Bus.Mesh https://baijiahao.baidu.com/s?id=1607585351741429318&wfr= ...

  3. 重载(overload)和重写(override)的区别

    方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性. 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同.参数个数不同或者二者都不同)则 ...

  4. ByteArrayInputStream类

    一.说明 哈哈,这是学习Java之路的第一篇博文.虽然说接触学习Java有一段时间了,但是对流的概念一直并不是很清楚.也看了很多资料,但是感觉还是非常的抽象很难去理解.但是流又是Java中很重要的一部 ...

  5. Ubuntu 下几种软件安装的方法小结

    1.tar.gz软件包的安装 1)解压tar.gz包 .tar.gz -C /home/Desktop # 将软件包名.tar.gz解压到指定的目录下 2)进入解压后的文件目录下      执行“./ ...

  6. 2017Nowcoder Girl初赛重现赛 D(二进制枚举

    链接:https://ac.nowcoder.com/acm/contest/315/D来源:牛客网 题目描述 妞妞参加完Google Girl Hackathon之后,打车回到了牛家庄. 妞妞需要支 ...

  7. PC端判断屏幕宽度到达手机宽度的时候,直接跳转手机页面

    <script> // //判断屏幕宽度到达手机宽度的时候,直接跳转手机页面 // window.addEventListener("resize", function ...

  8. asp.net练习①——Application聊天室

    已经好几年没写过代码,重新练习起代码,在这做做笔记备忘. aspx页面js代码: <script type="text/javascript"> function sh ...

  9. 协议相关(HTTP,TCP,webservice,socket)

    什么是协议? 我们常常点开的链接(URL)就有HTTP.HTTPS协议 枯燥点的知识(协议模型) HTTP,webservice都是在<TCP/IP协议>的应用层. TCP,socket在 ...

  10. 20-Perl 正则表达式

    1.Perl 正则表达式正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等.Pe ...