随笔分类 - 【SPOJ Can you answer these queries】
【SPOJ】1557 Can you answer these queries II
摘要:询问区间最大连续和,相同的只能算一次。可以不取,即为0线段树在线做不到,只好离线搞。一般最大连续和,都是以一个点为起点,往左或往右。其实,还可以以一个点为起点,往上最大是多少。用pos标记一个数之前更新到的位置。比如:-3 2 -3 1用线段树成段覆盖:(越下方越早更新到)1 1 1 1 -3 -32 2-3nowsum表示当前深度积累的总和。nowup表示当前深度从底往上的最大值。totsum,totup同理,表示的是以某个叶子为起点对应的值。加上读入优化,快了2s…… 1 #include<cstdio> 2 #include<cstring> 3 #include
阅读全文
【SPOJ】6779 Can you answer these queries VII
摘要:SPOJ……无力吐槽了,反正RP好的时候过了,其他时候都是TLE。只能怪自己动态树太龊了吧。。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<iostream> 5 #define MAX(a,b) ((a)>(b)?(a):(b)) 6 #define oo 0x7FFFFFFF 7 #define MAXN 200010 8 using namespace std; 9 bool vis[MAXN]; 10 int e, first[MAXN],
阅读全文
【SPOJ】4487 Can you answer these queries VI
摘要:仍然是询问区间最大连续和,只不过多了插入和删除操作。线段树搞不定了。。伸展树来了。插入删除偷懒那样写了,加了读入优化卡过的。 1 #include<cstdio> 2 #include<iostream> 3 #define MAX(a,b) ((a)>(b)?(a):(b)) 4 #define oo 1000000000 5 #define MAXN 200010 6 using namespace std; 7 int n, a[MAXN]; 8 struct SplayTree { 9 int root, size; 10 int next[MAXN]..
阅读全文
【SPOJ】2916 Can you answer these queries V
摘要:操作:给出x属于[x1,y1],y属于[x2,y2],求[x,y]的最大连续和。将区间分3段考虑,答案可能由某一段的最大连续和,或者某一段往左的最大连续和,某一段往右的最大连续和组合而来。需要特判的是,区间可能存在包含关系。 1 #include<cstdio> 2 #define MAX(a,b) ((a)>(b)?(a):(b)) 3 #define MAXN 10010 4 #define oo 987654321 5 struct node { 6 int left, right, sum, val; 7 void Init() { 8 ...
阅读全文
【SPOJ】2713 Can you answer these queries IV
摘要:操作:1,把[x,y]每个数k变成sqrt(k),向下取整。2,查询区间的和。就算10^18,sqrt后减少的很快。当一个数为0或1时,它不会再变化了,把不会变化的区间标记,不再访问。所以暴力更新总的可以视为O(nlogn)的。 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 #define EPS 1e-8 5 #define MAXN 100010 6 typedef long long LL; 7 using namespace std; 8 struct node { 9 LL
阅读全文
【SPOJ】1043 Can you answer these queries III
摘要:操作:1,更新某个位置的值。2,查询区间最大连续和。更新位置然后PushUp。查询同【SPOJ】1043 Can you answer these queries I。 1 #include<cstdio> 2 #define MAX(a,b) ((a)>(b)?(a):(b)) 3 #define MAXN 50010 4 #define oo 1000000000 5 struct node { 6 int left, right, sum, val; 7 void Init() { 8 sum = 0; 9 left = right = v...
阅读全文
【SPOJ】1043 Can you answer these queries I
摘要:操作:查询区间最大连续和。每个节点保存当前区间往左,往右的最大和。往左最大连续和=max(左区间往左最大连续和,左区间的和+右区间往左最大连续和)。区间最大值=max(左,右区间最大值,左区间右连续+右区间左连续)。返回答案时,区间需要不断的合并。 1 #include<cstdio> 2 #define MAX(a,b) ((a)>(b)?(a):(b)) 3 #define MAXN 50010 4 #define oo 1000000000 5 struct node { 6 int left, right, sum, val; 7 void Init() { 8 ..
阅读全文