NOIP 2018 真・退役记

NOIp 2018 真・退役记

很久不来写博客了。又快NOIp了。

\(NOIp\ 2018\ is\ comming\ soon\ldots\)

7.01

今天收到了停课通知。然而并没有非常高兴。

未来的计划大概就是每天刷题什么的了。剩下的时间也不是很多了,也不会去学一些什么奇怪的算法了。

7.05

然而这几天一直写不来题。没办法只能写写模板。

网络流还是HLPP比较快。但是代码巨长。一般写不来。

比赛还是多打几场比较好。

emmm,就先这样吧。

\(summary\)

想想你这一个学期,假期基本没好好放,有一个大周就算是最长的一个假期了。如果你还考不出\(NOIp\)一等奖,你拿什么面对大学?
高考成绩?就你这烂成绩,还想考一个什么好大学?一本都够呛吧。如果竞赛成绩很烂,文化课又上不去,那你拿什么面对未来的生活?

你已经是高二选手了。没有时间可以浪费了。想想去年的事情,去年\(Day\ 1\)晚上太浪,失去了最好的一次机会。
当时信心满满,以为一等奖唾手可得。结果接近半年都任自己沉沦。这期间,所有的同学都有了很大的提高。你却在原地踏步。
踏下心来背水一战吧。把经典的题,基础的题写好。多写几道模拟、暴力。不能怕麻烦。

想想自己还有那些不足之处,还是要去面对的。如果能拿到省选\(\times 2\)的分数,发挥还能那么好,一等奖应该没什么问题了。
想想自己省选的时候是什么心态,尽量保持吧。不能被一两场考试的失利击倒,更不能因为一两场考试考得不错而沾沾自喜。

\[\Huge 你离他们,甚至你的目标,还都很远很远! \]

写了一个比较长的代码。很麻烦啊。网络流卡了一年。

Digit Search Tree 写出来了(其实就是加个自环作为空指针

// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include <cstdio>
#include <cctype>
using namespace std;
const int maxn=120000*23;
const int fix=1e7, full=23;
struct node {
    node *ch[2];
    int size;
}*nil, *root, mem[maxn];
int cnt;
inline void newnode(node *&p) {
    mem[cnt].ch[0] = mem[cnt].ch[1] = nil; p = mem + cnt++;
}
inline void Insert(node *rt, int x, int add) {
    x += fix;
    for(register int i = full; ~i; --i) {
        bool op = x >> i & 1;
        if(rt->ch[op] == nil) newnode(rt->ch[op]);
        rt = rt->ch[op];
        rt->size += add;
    }
}
inline int Rank(node *rt, int x) {
    x += fix;
    int res = 0;
    for(register int i = full; ~i; --i) {
        bool op = x >> i & 1;
        if(op) res += rt->ch[0]->size;
        rt = rt->ch[op];
    }
    return res;
}
inline int kth(node *rt, int k) {
    int res = 0;
    for(register int i = full; ~i; --i) {
        if(k > rt->ch[0]->size)
            k -= rt->ch[0]->size, res |= 1 << i, rt = rt->ch[1];
        else rt = rt->ch[0];
    }
    return res - fix;
}
namespace IO{
    const int InputBufferSize = 67108864;
    const int OutputBufferSize = 67108864;
    namespace input{
        char buffer[InputBufferSize],*s,*eof;
        inline void init(){
            s=buffer;
            eof=s+fread(buffer,1,InputBufferSize,stdin);
        }
        inline bool read(int &x){
            x=0;
            int flag=1;
            while(!isdigit(*s)&&*s!='-')s++;
            if(eof<=s)return false;
            if(*s=='-')flag=-1,s++;
            while(isdigit(*s))x=x*10+*s++-'0';
            x*=flag;
            return true;
        }
    }
    using namespace input;
    namespace output{
        char buffer[OutputBufferSize];
        char *s=buffer;
        inline void flush(){
            fwrite(buffer,1,s-buffer,stdout);
            s=buffer;
        }
        inline void print(const char ch){
            if(s-buffer>OutputBufferSize-2)flush();
            *s++=ch;
        }
        inline void print(int x){
            char buf[25]= {0},*p=buf;
            if(x<0)print('-'),x=-x;
            if(x==0)print('0');
            while(x)*(++p)=x%10,x/=10;
            while(p!=buf)print(char(*(p--)+'0'));
        }
    }
    using namespace output;
}
using namespace IO;
int main() {
    newnode(nil), nil->ch[0] = nil->ch[1] = nil; newnode(root);
    int n, op, x; init(); read(n);
    while(n--) {
        read(op), read(x);
        if(op == 1) Insert(root, x, 1);
        else if(op == 2) Insert(root, x, -1);
        else if(op == 3) print(Rank(root, x) + 1), print('\n');
        else if(op == 4) print(kth(root, x)), print('\n');
        else if(op == 5) print(kth(root, Rank(root, x))), print('\n');
        else if(op == 6) print(kth(root, Rank(root, x + 1) + 1)), print('\n');
    }
    flush();
    return 0;
}

效率与红黑树类似(这货常数非常小),空间消耗略大(不超过2倍),改天转换成类似set或者map的东西。

7.12

恢复状态的一天,emmm前一段时间一直沉迷出题无法自拔(退役的前奏啊)

7.18

IARUFAN KURABU... Hi Hi China... WO AI NI...

疯掉了。吃了几天外卖,hhh,在HN蛤玩意也听不懂。

但是还是不能NOIp后退役。绝不。

安静一点的歌可能会比较好吧。今天晚上ZXL来找我们,说了没啥用的一堆东西。至少我父母没把我卖掉。

歌单听完30%了,还有一半。

丢图跑了。

7.26 - 7.27

妈呀,冻死我了,一晚上没睡,做图2333.

发现Blender真好用,有了模型以后可以做你想做的任何事情。

Miku真好看啊2333.

然而渲染不出来残念。

8.2

海星。做了2道CF题恢复一下状态。

然而没用。

8.3

树剖调了一年,然而模板都写不出来。f**k...

下午弃掉树剖,感觉暂时调不出来。去码线段树,然后还是有一些奇怪的锅qwq...

不要吐槽什么为什么线段树用指针写了2333,没用的。

#include <cstdio>
#include <cctype>
using namespace std;
template<typename T> inline void read(T &x) {
	x = 0; T w = 1; char ch = getchar();
	while(!isdigit(ch) && ch != '-') ch = getchar();
	while(isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
	x *= w;
}
int n, m, p, opt, x, y, k;
namespace segmentTree {
	struct node {
		int l, r, mid;
		long long sum, addv, mulv;
		node *lson, *rson;
	} *root;
	node MemPool[2000005]; int MemCnt;
	inline void alloc(node* &o) {o = MemPool + MemCnt++;}
	inline void pushup(node* o) {o->sum = (o->lson->sum + o->rson->sum) % p;}
	void build(node* &o, int l, int r) {
		if(!o) alloc(o);
		o->addv = 0, o->mulv = 1, o->l = l, o->r = r, o->mid = (l + r) >> 1;
		if(l == r) {read(o->sum); return;}
		build(o->lson, o->l, o->mid); build(o->rson, o->mid + 1, o->r);
		pushup(o);
	}
	inline void pushdown(node *o) {
		o->lson->mulv = (o->lson->mulv * o->mulv) % p;
		o->rson->mulv = (o->rson->mulv * o->mulv) % p;
		o->lson->addv = (o->lson->addv * o->mulv) % p;
		o->rson->addv = (o->rson->addv * o->mulv) % p;
		o->lson->sum = (o->lson->sum * o->mulv) % p;
		o->rson->sum = (o->rson->sum * o->mulv) % p;
		o->mulv = 1;
		o->lson->addv = (o->lson->addv + o->addv) % p;
		o->rson->addv = (o->rson->addv + o->addv) % p;
		o->lson->sum = (o->lson->sum + (o->mid - o->l + 1) * o->addv) % p;
		o->rson->sum = (o->rson->sum + (o->r - o->mid) * o->addv) % p;
		o->addv = 0;
	}
	void add(node *o, int l, int r, int x) {
		if(o->l >= l && o->r <= r) {
			o->addv = (o->addv + x) % p;
			o->sum = (o->sum + (o->r - o->l + 1) * x) % p;
			return;
		}
		if(o->mulv != 1 || o->addv) pushdown(o);
		if(l <= o->mid) add(o->lson, l, r, x);
		if(r > o->mid) add(o->rson, l, r, x);
		pushup(o);
	}
	void mul(node *o, int l, int r, int x) {
		if(o->l >= l && o->r <= r) {
			o->mulv = (o->mulv * x) % p;
			o->addv = (o->addv * x) % p;
			o->sum = (o->sum * x) % p;
			return;
		}
		if(o->mulv != 1 || o->addv) pushdown(o);
		if(l <= o->mid) mul(o->lson, l, r, x);
		if(r > o->mid) mul(o->rson, l, r, x);
		pushup(o);
	}
	long long query(node *o, int l, int r) {
		if(o->l >= l && o->r <= r) return o->sum % p;
		long long ans = 0;
		if(o->mulv != 1 || o->addv) pushdown(o);
		if(l <= o->mid) ans += query(o->lson, l, r);
		if(r > o->mid) ans += query(o->rson, l, r);
		return ans % p;
	}
}
int main() {
	using namespace segmentTree;
	read(n), read(m), read(p);
	build(root, 1, n);
	while(m--) {
		read(opt), read(x), read(y);
		if(opt == 1) read(k), mul(root, x, y, k);
		else if(opt == 2) read(k), add(root, x, y, k);
		else printf("%lld\n", query(root, x, y));
	}
	return 0;
}

感觉还行,每行都没超过80字符 + 比较短2333,本地I64d没改过来WA2发残念。

第一次用模板类发现不能用getchar()的define了,mmp

8.3

昨天放假,然后无所事事,把模型扔到农场里,18天只需要6小时,太强了2333.

SPFA被卡了残念。调Dijkstra调了一年(其实就把状态扔到优先队列里就行了,一点都不麻烦)。

网络流还是学不会,模板都不会(可能是我用HLPP,模板长达4k)。

没法考NOIp了2333.

据说以后几天要考试了。还行。(感到压力.jpg)

\(Miku\ 我真是太喜欢你了\)

8.7

我太菜了。树剖模板题调到现在。\(CNM\).

#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
using namespace std;
template<typename T> inline void read(T &x) {
	x = 0; T w = 1; char ch = getchar();
	while(!isdigit(ch)) {if(ch == '-') w = -1; ch = getchar();}
	while(isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
	x *= w; 
}
const int maxn = 100005;
vector<int> G[maxn];
typedef vector<int>::iterator Iter;
int w[maxn], wt[maxn], son[maxn], id[maxn], fa[maxn], dep[maxn], siz[maxn],
		top[maxn], cnt, n, m, r, mod, a, b, k, x, y, z;
inline void add(int u, int v) {G[u].push_back(v);}
struct node {
	int l, r, mid, len, sum, laz; node *ls, *rs;
} *root, MemPool[2 * maxn]; int MemCnt;
inline void alloc(node* &x) {x = MemPool + MemCnt++;}
inline void pushup(node *rt) {rt->sum = (rt->ls->sum + rt->rs->sum) % mod;}
inline void pushdown(node *rt) {
	rt->ls->laz += rt->laz, rt->rs->laz += rt->laz;
	rt->ls->sum += rt->ls->len * rt->laz, rt->rs->sum += rt->rs->len * rt->laz;
	rt->ls->sum %= mod, rt->rs->sum %= mod, rt->laz = 0; 
}
inline void build(node* &rt, int l, int r) {
	if(!rt) alloc(rt);
	rt->l = l, rt->r = r, rt->mid = (l + r) >> 1, rt->len = r - l + 1;
	if(l == r) {rt->sum = wt[l]; if(rt->sum > mod) rt->sum %= mod; return;}
	build(rt->ls, rt->l, rt->mid), build(rt->rs, rt->mid + 1, rt->r);
	pushup(rt);
}
inline int query(node *rt, int l, int r) {
	if(rt->l >= l && rt->r <= r) {return rt->sum % mod;}
	if(rt->laz) pushdown(rt);
	int ans = 0;
	if(l <= rt->mid) ans += query(rt->ls, l, r);
	if(r > rt->mid) ans += query(rt->rs, l, r);
	return ans % mod;
}
inline void update(node *rt, int l, int r, int k) {
	if(rt->l >= l && rt->r <= r) {rt->laz += k; rt->sum += rt->len * k; return;}
	if(rt->laz) pushdown(rt);
	if(l <= rt->mid) update(rt->ls, l, r, k);
	if(r > rt->mid) update(rt->rs, l, r, k);
	pushup(rt);
}
inline int qRange(int x, int y) {
	int ans = 0;
	while(top[x] != top[y]) {
		if(dep[top[x]] < dep[top[y]]) swap(x, y);
		ans = (ans + query(root, id[top[x]], id[x])) % mod; x = fa[top[x]];
	}
	if(dep[x] > dep[y]) swap(x, y);
	return (ans + query(root, id[x], id[y])) % mod;
}
inline void updRange(int x, int y, int k) {
	while(top[x] != top[y]) {
		if(dep[top[x]] < dep[top[y]]) swap(x, y);
		update(root, id[top[x]], id[x], k); x = fa[top[x]];
	}
	if(dep[x] > dep[y]) swap(x, y);
	update(root, id[x], id[y], k);
}
inline void dfs1(int x, int f, int deep) {
	dep[x] = deep, fa[x] = f, siz[x] = 1;
	for(Iter it = G[x].begin(); it != G[x].end(); ++it) {
		if(*it == f) continue;
		dfs1(*it, x, deep + 1);
		siz[x] += siz[*it];
		if(siz[*it] > siz[son[x]]) son[x] = *it;
	}
}
inline void dfs2(int x, int topf) {
	id[x] = ++cnt, wt[id[x]] = w[x], top[x] = topf;
	if(!son[x]) return;
	dfs2(son[x], topf);
	for(Iter it = G[x].begin(); it != G[x].end(); ++it) {
		if(*it == fa[x] || *it == son[x]) continue;
		dfs2(*it, *it);
	}
}
int main() {
	read(n), read(m), read(r), read(mod);
	for(int i = 1; i <= n; ++i) read(w[i]);
	for(int i = 1; i < n; ++i) read(a), read(b), add(a, b), add(b, a);
	dfs1(r, 0, 1), dfs2(r, r), build(root, 1, n);
	while(m--) {
		read(k), read(x);
		if(k == 1) read(y), read(z), updRange(x, y, z);
		else if(k == 2) read(y), printf("%d\n", qRange(x, y));
		else if(k == 3) read(y), update(root, id[x], id[x] + siz[x] - 1, y);
		else printf("%d\n", query(root, id[x], id[x] + siz[x] - 1));
	}
	return 0;
}

没超过\(100\)行真是太开心了。

8.9

今天给聂晶调题,然后数组越界不RE,不RE,调了整个下午。

立个 flag,退役前要学会编曲。

8.20

最近拿到了 LOJ 的题库管理员权限。发现 LOJ 真的是一个非常有爱的社区。

未来几天把后缀自动机的坑填了。

8.24

写完了后缀自动机的 Wiki...

8.27

五校联考被吊打。凉了。

8.28

Hash gg 了,在线测 3 遍,离线测 20 遍吧。

企鹅 QQ 这么简单的题啊。

8.29

五校联考 Round 2 Day 1,又一次考崩。

Task 1 这么简单的模拟题,竟然卡了一个小时不过样例。还好最后写出来了。

其实手动用文本编辑器正则表达式匹配一下大样例(注意向前查找)就能过掉了。

Task 2 应该是线段树维护区间和之类的东西,然后 xjb 容斥一下统计方案。没写,打了前缀和的 30 分暴力。

Task 3 凉了。思路是枚举两个点 \(u\)\(v\),然后可以 \(O(1)\) 判断 \(u\)\(v\) 之间的联通性,考虑剩下的如何处理。

其实也很简单,我们将邻接矩阵的第 \(u\) 行和第 \(v\) 行看作两个集合(可以用 bitset 之类的东西优化),然后我们只需要判断 \(u\rightarrow w\) 的集合与 \(v\rightarrow w\) 的关系即可。
那么我们可以直接使用集合运算,对两个集合取并集(即位运算 or),然后与任意一个集合判是否相等即可。

然后就没有然后了。时间复杂度的话,大概是 \(O(Tn^2n/32)\)

9.1

凉了,不用考 NOIP 了。

9.7

过几天又有 XX 校联考了。妈呀,我 DP 都不会,完蛋了。

9.14

准备退役了。

懂的人自然懂下面这一段的功能:

-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=ZxSw
-----END PGP PUBLIC KEY BLOCK-----

9.27

博客长草了。

码几道题练练手。

10.5

我是谁,我在哪,我在这里干什么?

10.11

嘤。又是一年板子时。写板子。

long long pow(long long x, long long y, long long mod) {
  long long ret = 1;
  while(y) {
    if(y & 1) ret = ret * x % mod;
    x = x * x % mod, y >>= 1;
  }
  return ret % mod;
}
inline long long inv(long long x) {return pow(x, mod - 2, mod);}
inline void getd() {
  d[0] = 1; d[1] = 0;
  for(int i = 3; i < 1000005; ++i)
    d[i] = (i - 1) * (d[i - 2] + d[i - 1]) % mod;
}
inline long long c(long long n, long long m) {
  return (fac[n] * inv(fac[m]) % mod * inv(fac[n - m])) % mod;
}
inline void getf() {
  fac[0] = 1 = fac[1] = 1;
  for(int i = 2; i < 1000005; ++i) fac[i] = fac[i - 1] * i % mod;
}

一些数学板子丢到这里了。

10.14

这篇博文阅读破 500 了!震惊!

码了一下 Splay 平衡树。水过文艺平衡树。

果然平衡树什么的数据结构才能提升代码能力啊

一贯的短码 + 指针风格。

#include <cstdio>
#include <algorithm>
using namespace std;
struct node {
  node *ch[2]; int v, s, t;
  node (int v = 0) : v(v), s(1), t(0) {ch[0] = ch[1] = NULL;}
} *root;
inline int size(node *o) {return o ? o->s : 0;}
inline void maintain(node *o) {o->s = 1 + size(o->ch[0]) + size(o->ch[1]);}
inline void pushdown(node *o) {
  if(o->t) {
    swap(o->ch[0], o->ch[1]);
    if(o->ch[0]) o->ch[0]->t ^= 1;
    if(o->ch[1]) o->ch[1]->t ^= 1;
    o->t = 0;
  }
}
inline void rotate(node *&o, int t) {
  node *u = o->ch[t]; pushdown(u);
  o->ch[t] = u->ch[t ^ 1], u->ch[t ^ 1] = o; maintain(o), maintain(u), o = u;
}
inline void insert(node *&o, int v) {
  if(!o) o = new node(v);
  else insert(o->ch[v < o->v ? 0 : 1], v), maintain(o);
}
inline void splay(node *&o, int k) {
  pushdown(o);
  int l = size(o->ch[0]);
  if(l + 1 == k) return;
  int d = k <= l ? 0 : 1, k2 = d ? k - l - 1 : k;
  node *&c = o->ch[d]; pushdown(c);
  int l2 = size(c->ch[0]);
  if(l2 + 1 != k2) {
    int d2 = k2 <= l2 ? 0 : 1;
    splay(c->ch[d2], d2 ? k2 - l2 - 1 : k2);
    if(d == d2) rotate(o, d);
    else rotate(c, d2);
  }
  rotate(o, d);
}
int kth(node* &o, int k) {splay(o, k); return o->v;}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for(int i = 1; i <= n; ++i) insert(root, i), splay(root, i);
  for(int i = 1; i <= m; ++i) {
    int l, r;
    scanf("%d%d", &l, &r);
    if(l == 1 && r == n) root->t ^= 1;
    else if(l == 1) splay(root, r + 1), root->ch[0]->t ^= 1;
    else if(r == n) splay(root, l - 1), root->ch[1]->t ^= 1;
    else splay(root, l - 1), splay(root->ch[1], r - size(root->ch[0])),
         root->ch[1]->ch[0]->t ^= 1;
  }
  for(int i = 1; i <= n; ++i) printf("%d%c", kth(root, i), i == n ? '\n' : ' ');
  return 0;
}

10.20

自经丧乱少睡眠。这几天状态不好。困得不行。

10.21

达成成就:DP 调不出来 1/1

下午的 Codeforces B 题是个傻逼题,写了个 DP 调了一个小时调不出来。

代码能力还是不够。

好像是把 \(k\) 写成 \(j\) 了。静态查错能力太差了。考场上也紧张都忘了设的状态是什么了。

记录我第 \(n\) 个推对了状态转移方程调不出来的 DP 题。

貌似很多人打表以后写了个大分类讨论?唔,这个 SB 题可以直接递推过去啊。

我怎么这么 SB 不递推过去非得用 DP 完成分类讨论啊。

不过能这样 A 一道 DP 题我已经很开心了。毕竟自己太弱了,DP 还很菜。

10.24

请假成功。晚上可以回去打比赛了。

11.2

十一月了。还是日常挂模拟赛。以后再不对拍就白丢一百多分。再见。

posted @ 2018-07-01 21:03  baka  阅读(2187)  评论(7编辑  收藏  举报