上一页 1 2 3 4 5 6 7 8 9 ··· 20 下一页
  2012年9月2日
摘要: 题意:有n堆石子,每个人只能从某一堆至少拿走一个,不能拿者败。问事先拿走某些堆的石子,使得先手必败。由结论可知,石子数异或等于0时,先手必败。将石子拆成二进制,未知数为1表示保留该堆石子,为0表示事先拿走该堆石子。最后2^(自由元的个数)%MOD就是答案。 1 #include<cstdio> 2 #include<algorithm> 3 #define MAXN 110 4 #define MOD 1000007 5 using namespace std; 6 int a[MAXN], g[MAXN][MAXN]; 7 int Gauss(int n) { 8 i 阅读全文
posted @ 2012-09-02 21:16 DrunBee 阅读(642) 评论(0) 推荐(0) 编辑
  2012年9月1日
摘要: 操作:1,从数列结尾插入一个数。2,查询区间第k小。3,查询一个数在当前序列是第几小。4,查询当前序列第k小。1,离线。因为结尾插入一个数并不会对当前查询的区间造成影响。2和4,划分树。3,其实就是划分树的逆过程。划分树就是二分一个区间,把小于等于区间中心的数放到左边,否则放到右边。同时还需要记录一个位置,在它位置之前(包括它的位置),有多少个被放到了左区间。当完全递归到区间长度是1时,就把一个数列排好序了。 1 #include<cstdio> 2 #include<algorithm> 3 #define MAXM 20 4 #define MAXN 300010 阅读全文
posted @ 2012-09-01 12:22 DrunBee 阅读(338) 评论(0) 推荐(0) 编辑
  2012年8月30日
摘要: 询问区间最大连续和,相同的只能算一次。可以不取,即为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 阅读全文
posted @ 2012-08-30 18:08 DrunBee 阅读(702) 评论(0) 推荐(0) 编辑
摘要: 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], 阅读全文
posted @ 2012-08-30 00:10 DrunBee 阅读(628) 评论(0) 推荐(0) 编辑
  2012年8月29日
摘要: 仍然是询问区间最大连续和,只不过多了插入和删除操作。线段树搞不定了。。伸展树来了。插入删除偷懒那样写了,加了读入优化卡过的。 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].. 阅读全文
posted @ 2012-08-29 15:27 DrunBee 阅读(414) 评论(0) 推荐(0) 编辑
摘要: 操作:给出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 ... 阅读全文
posted @ 2012-08-29 12:28 DrunBee 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 操作: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 阅读全文
posted @ 2012-08-29 09:53 DrunBee 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 操作: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... 阅读全文
posted @ 2012-08-29 00:16 DrunBee 阅读(333) 评论(0) 推荐(0) 编辑
摘要: 操作:查询区间最大连续和。每个节点保存当前区间往左,往右的最大和。往左最大连续和=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 .. 阅读全文
posted @ 2012-08-29 00:08 DrunBee 阅读(378) 评论(0) 推荐(0) 编辑
  2012年8月28日
摘要: 题意:给出一个数列1~n。令ks表示s的出现次数。询问区间[x,y]中,s * ks^2之和。将数列分成sqrt(n)块,不在区间范围内的暴力,但是在区间范围内的无法常数时间统计。以下算法及证明摘自CodeForces...Let's sort the query intervals according to the following rule: first come the intervals with the left ends in Q_1, then the intervals with the left ends in Q_2, and so on. And if the 阅读全文
posted @ 2012-08-28 21:03 DrunBee 阅读(359) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 ··· 20 下一页