摘要:
不说什么了,模板题题目数据有点弱,不严格的次短路也能ac。。。。View Code 1 #include <cstring> 2 #include <cstdlib> 3 #include <algorithm> 4 #include <iostream> 5 #include <cstdio> 6 7 #define N 100000 8 #define M 2000000 9 10 using namespace std; 11 12 struct HP 13 { 14 int x,d; 15 }hp[M]; 16 17 int 阅读全文
摘要:
分析:可以证明,任意两点间的符合题目要求的路径必然是在MST上的。有了这个,这题就水了。。。我没有想到,是venique神犇告诉我的然后在MST上做LCA倍增,顺便维护d[i][j]表示i到他的2^j倍祖先的最大权,就好了~我是蒟蒻。。LCA写萎了。。看了venique的代码,才发现错。。。View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <iostream> 6 7 #de 阅读全文
摘要:
分析:做这个题还是需要技巧的。先将所有查询读入,按照右端点排序。从1~n扫,维护pt[i]表示i向左第一个和a[i]相等的数字的位置,扫到i的时候实时更新树状数组:c[pt[pt[i]]+1]~c[pt[i]]区间+1(pt[i]!=0),与此同时,处理右端点与i重合的查询,此询问的答案就是这个询问的左端点在树状数组中的值(树状数组起区间修改单点查询的功能),至于为什么,画个图应该很容易知道。PS:树状数组的区间修改单点查询的实现:将原数组差分,令d[i]=c[i]-c[i-1],特别地,d[1]=c[1]。那么区间[l,r]整体加上k的操作就可以简单地使用d[l]+=k;d[r+1]-=k来 阅读全文