Scoi2013多项式的运算

平衡树维护序列的老题。之前用SMT写过,不过在bzoj上就tle了。splay大法好。 #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> using namespace std; int _d_; #define readInt(_x_) { \ int& _s_ = _x_; \ while (!isdigit(_d_ = getchar())); \ _s_ = 0; \ while ((_s_ = _s_ * 10 + _d_ - 48), isdigit(_d_ = getchar())); \ } #define readStr(_s_) { \ char* _i_ = _s_; \ while (!islower(_d_ = getchar())); \ while ((*(_i_ ++) = _d_), islower(_d_ = getchar())); \ *(_i_) = 0; \ } #define _l (long long int) const int maxn = 300009; const int mod = 20130426;...

November 26, 2014 · 5 min · laekov

BZOJ3289 Mato的文件管理

离散,然后树状数组+莫队。 最初用的是直接粘过来的1488的sbt,然后极限随机数据要跑14s。好郁闷。 然后改用数状数组就变1s了。是我再次把sbt写丑了还是它常数够厉害TT #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct query { int i, l, r, pl, pr; }; typedef unsigned int uint; const int maxn = 50009; #define update(_p_) (sz[_p_]=sz[ls[_p_]]+sz[rs[_p_]]+1) inline bool cmpQry(const query& a, const query& b) { return a. pl < b. pl || (a. pl == b. pl && a. pr > b. pr); } inline bool cmpP(int* a, int* b) { return *a < *b; } int n, m, bsz, a[maxn], *r[maxn], maxa, t[maxn];...

November 24, 2014 · 2 min · laekov

BZOJ1488 || POJ1741 Tree

据说是男人八题。 状态太差调了一节宝贵的晚自习,严重不开心。 异常裸的点分治。然后里面还是套的sbt。 卡空间比较丧病,不能开nlogn,要想办法开到n。其实就是找重心分治完再bfs一遍。最初没有写,所以mle爽,在poj上还显示的是re。 然后各种逗的错误调啊调。把代码调得怪丑。我还是naive啊。 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct edge { int t, v; edge *next; }; const int maxn = 40009; int n, k, ans; int d[maxn], tvis, vis[maxn], vd[maxn], sz[maxn], qu[maxn]; edge *ep, *head[maxn], elst[maxn * 2]; #define update(_p_) (sz[_p_]=sz[ls[_p_]]+sz[rs[_p_]]+1) namespace sbt { const int maxnd = maxn * 2; const int balc = 5; int nst[maxnd], tn; int ls[maxnd], rs[maxnd], vl[maxnd], sz[maxnd]; inline void lRot(int& p) {...

November 24, 2014 · 3 min · laekov

BZOJ2626 JZPFAR

jason_yu表示是kd-tree的裸题。 拿个堆维护一下答案,然后剪剪枝啥的,写起来轻松愉快还比lct短。 #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> using namespace std; typedef long long qw; typedef pair <qw, int> hele; #define _l (qw) int _d_; bool _nag_; #define readInt(_x_) { \ int &_s_ = _x_; \ _s_ = 0; \ _nag_ = 0; \ while (!isdigit(_d_ = getchar())) \ if (_d_ == '-') \ _nag_ = 1; \ while ((_s_ = _s_ * 10 + _d_ - 48), isdigit(_d_ = getchar())); \ if (_nag_) \ _s_ = - _s_;\ } const int maxn = 100009;...

November 24, 2014 · 3 min · laekov

BZOJ1227 [SDOI2009]虔诚的墓主人

写完Kdtree感觉整个人都要离散了。 这题比较神,之前连题都没看懂。每个位置的方案数就是上下左右的数量的组合数的乘积。把x离散之后维护区间中左×右的和,上下y相同的扫一遍搞定。(感觉说了像没说) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct point { int x, y; }; const int maxn = 100009; const int maxk = 13; inline bool cmpP(int* a, int* b) { return *a < *b; } inline bool cmpy(const point& a, const point& b) { return (a. y < b. y) || (a. y == b. y && a. x < b. x); } point a[maxn]; int n, m, c[maxn][maxk], cx[maxn], tx[maxn], t[maxn], maxx, ans;...

November 24, 2014 · 2 min · laekov

BZOJ2648 SJY摆棋子

Log^2的cdq分治怎么也跑不过。优化常数优化到底了也不行。所以kd大法好。 怎么都觉得kd树就一暴力+剪枝=log。 思想就是先按x二分,然后再按y二分,然后再按x二分。然后这玩意比较像平衡树,中间那个点是要代表一个真实的结点的而不是一个值。然后insert的时候感觉复杂度完全没有保证啊。如果要保证可能要替罪羊一类的东西吧。虽然这题好像不用保证。 询问的时候就更迷了,就是估计一个离哪边近,然后先搜。然后另一边如果估计值还小于答案就再搜一遍。好诡异,时间复杂度是怎么来的。 然后代码略丑,加了zhx式读入优化后长度xxxxx。 #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> using namespace std; #define READ_OPTIMIZE #ifdef READ_OPTIMIZE /*int _d_; #define readInt(_s_) {\ _s_ = 0;\ while (!isdigit(_d_ = getchar()));\ while ((_s_ = _s_ * 10 + _d_ - 48), isdigit(_d_ = getchar()));\ }*/ const int BUF_SIZE = 30; char buf[BUF_SIZE], *buf_s = buf, *buf_t = buf + 1;    #define PTR_NEXT() \ { \ buf_s ++; \ if (buf_s == buf_t) \ { \ buf_s = buf; \ buf_t = buf + fread(buf, 1, BUF_SIZE, stdin); \...

November 24, 2014 · 4 min · laekov

BZOJ2716 [Violet 3]天使玩偶

看时间比较宽么,写一个log^2的cdq+树状数组么。 然后被2648卡了。学kd-tree吧。 naive。 #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> using namespace std; int _d_; #define readInt(_s_) {\ _s_ = 0;\ while (!isdigit(_d_ = getchar()));\ while ((_s_ = _s_ * 10 + _d_ - 48), isdigit(_d_ = getchar()));\ } struct point { int x, y, t, i; }; const int maxn = 500009; const int maxz = 1000009; const int inf = 0x3f3f3f3f; inline bool cmpPoint(const point& a, const point& b) { return a....

November 24, 2014 · 3 min · laekov

BZOJ2506 calc

看到取模瞬间想到了昨天的bc。 应该这是取模然后求啥玩意的时候的比较通用的解法吧。p<=sqrt(maxv)的预处理,剩下的直接暴力。结果预处理又写丑了一回。 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 100009; const int maxv = 10000; const int bsz = 100; const int maxb = 103; int n, m; int a[maxn], vb[maxb][maxb], ve[maxb][maxb]; int xb[maxn], xe[maxn]; int i_buf[maxn * maxb * 2], tib; void pre() { memset(ve, 0, sizeof(ve)); memset(xe, 0, sizeof(xe)); for (int i = 1; i <= n; ++ i) ++ xe[a[i]]; for (int i = 0; i <= maxv; ++ i) {...

November 23, 2014 · 2 min · laekov

BZOJ3489 A simple rmq problem

乍一看不会。 想了想,求出每一个数的前一个相同的数的位置和后一个相同的数的位置,然后询问就是L<=i<=R && next[i]>=R && last[i] <= L的最大的a[i]。这三层树套树啊!? 好像不带修改,那可以把一个Log的树优化成1的前缀和。 然后最值不满足减法,所以就把L<=i<=R拿动态建的线段树套里面好了。 卡空间400+MB过了,我对拍的大数据把网上的某人的程序干掉了哈哈。 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct seg { int v, ls, rs; }; const int maxn = 100009; const int maxnd = maxn * 409; int n, m, a[maxn], v[maxn], ls[maxn], nx[maxn], o[maxn]; int t[maxn], sp; seg sl[maxnd]; inline bool cmpO(const int& a, const int& b) { return ls[a] < ls[b]; } int getLa(int l0) { int l = 1, r = n;...

November 23, 2014 · 3 min · laekov

BZOJ3282 Tree

LCT的简单题。好久不写都手生了,还把rotate写错了一点点,导致找了半天错。 #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> using namespace std; int _d_; #define readInt(_s_) {\ _s_ = 0;\ while (!isdigit(_d_ = getchar()));\ while ((_s_ = _s_ * 10 + _d_ - 48), isdigit(_d_ = getchar()));\ } const int maxn = 300009; int n, m; int ls[maxn], rs[maxn], pt[maxn], rv[maxn], vl[maxn], vs[maxn]; inline void update(const int& p) { vs[p] = vs[ls[p]] ^ vl[p] ^ vs[rs[p]]; } inline void fix(int p) { if (rv[p]) { swap(ls[p], rs[p]); if (ls[p])...

November 23, 2014 · 2 min · laekov