zoukankan      html  css  js  c++  java
  • NOIP 2018 真・退役记

    NOIp 2018 真・退役记

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

    (NOIp 2018 is comming soonldots)

    7.01

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

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

    7.05

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

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

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

    emmm,就先这样吧。

    (summary)

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

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

    想想自己还有那些不足之处,还是要去面对的。如果能拿到省选( imes 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('
    ');
            else if(op == 4) print(kth(root, x)), print('
    ');
            else if(op == 5) print(kth(root, Rank(root, x))), print('
    ');
            else if(op == 6) print(kth(root, Rank(root, x + 1) + 1)), print('
    ');
        }
        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
    ", 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
    ", qRange(x, y));
    		else if(k == 3) read(y), update(root, id[x], id[x] + siz[x] - 1, y);
    		else printf("%d
    ", 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 ightarrow w) 的集合与 (v ightarrow 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 ? '
    ' : ' ');
      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

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

  • 相关阅读:
    线程(java课堂笔记)
    java中的各种流(老师的有道云笔记)
    面向对象(java菜鸟的课堂笔记)
    泛型(java菜鸟的课堂笔记)
    我做的第一个程序(菜鸟的java课堂笔记)
    java中的一些规则(菜鸟的课堂笔记)
    一位菜鸟的java 最基础笔记
    spatial index (空间索引)
    hadoop 的疑问
    numpy 矩阵的运算
  • 原文地址:https://www.cnblogs.com/TheRoadToAu/p/9251266.html
Copyright © 2011-2022 走看看