NOIP 2018 真・退役记
NOIp 2018 真・退役记
很久不来写博客了。又快NOIp了。
\(NOIp\ 2018\ is\ comming\ soon\ldots\)
7.01
今天收到了停课通知。然而并没有非常高兴。
未来的计划大概就是每天刷题什么的了。剩下的时间也不是很多了,也不会去学一些什么奇怪的算法了。
7.05
然而这几天一直写不来题。没办法只能写写模板。
网络流还是HLPP比较快。但是代码巨长。一般写不来。
比赛还是多打几场比较好。
emmm,就先这样吧。
\(summary\)
想想你这一个学期,假期基本没好好放,有一个大周就算是最长的一个假期了。如果你还考不出\(NOIp\)一等奖,你拿什么面对大学?
高考成绩?就你这烂成绩,还想考一个什么好大学?一本都够呛吧。如果竞赛成绩很烂,文化课又上不去,那你拿什么面对未来的生活?
你已经是高二选手了。没有时间可以浪费了。想想去年的事情,去年\(Day\ 1\)晚上太浪,失去了最好的一次机会。
当时信心满满,以为一等奖唾手可得。结果接近半年都任自己沉沦。这期间,所有的同学都有了很大的提高。你却在原地踏步。
踏下心来背水一战吧。把经典的题,基础的题写好。多写几道模拟、暴力。不能怕麻烦。
想想自己还有那些不足之处,还是要去面对的。如果能拿到省选\(\times 2\)的分数,发挥还能那么好,一等奖应该没什么问题了。
想想自己省选的时候是什么心态,尽量保持吧。不能被一两场考试的失利击倒,更不能因为一两场考试考得不错而沾沾自喜。
写了一个比较长的代码。很麻烦啊。网络流卡了一年。
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
十一月了。还是日常挂模拟赛。以后再不对拍就白丢一百多分。再见。