GDOI 2017总结(附蜜汁二维线段树+IO优化)

GDOI2017总结


     <script id="MathJax-Element-20073" type="math/tex">~~~~</script>今年的省选在东莞市东华高级中学举行,共计三百余人参加。
     <script id="MathJax-Element-20074" type="math/tex">~~~~</script>宾馆还可以,学校环境很不错,尤其是 比GF好到不知道哪里去的伙食。
     <script id="MathJax-Element-20075" type="math/tex">~~~~</script>机房布局和学校一样,系统是win7,体验比XP好多了。

Day 1. <script id="MathJax-Element-20076" type="math/tex">Day~1.</script>
     <script id="MathJax-Element-20077" type="math/tex">~~~~</script>T1,一道字符串匹配模板题;
     <script id="MathJax-Element-20078" type="math/tex">~~~~</script>T2,求一棵有根树上任一点子树外的点权 mex <script id="MathJax-Element-20079" type="math/tex">mex</script>;
     <script id="MathJax-Element-20080" type="math/tex">~~~~</script>T3,动态查询若干 trie <script id="MathJax-Element-20081" type="math/tex">trie</script>的最长公共字串;
     <script id="MathJax-Element-20082" type="math/tex">~~~~</script>T4,求 kn <script id="MathJax-Element-20083" type="math/tex">k\!\sim\!n</script>边形的所有三角剖分中 k <script id="MathJax-Element-20084" type="math/tex">k</script>边形出现的次数的异或和。
     <script id="MathJax-Element-20085" type="math/tex">~~~~</script>我一读完题,凭着直觉就去想T4,很快就发现三角剖分方案数是 Catalan <script id="MathJax-Element-20086" type="math/tex">Catalan</script>数。这时我以为我离正解已经不远,就一心想A掉这题。想了好久没思路,就去打了一下T1暴力。十二点整的时候,我终于想通了,赶紧打程序,结果发现连样例都没过…。最后只拿了一题70的暴力分。

Day 2. <script id="MathJax-Element-20087" type="math/tex">Day~2.</script>
     <script id="MathJax-Element-20088" type="math/tex">~~~~</script>T1,一道广搜水题;
     <script id="MathJax-Element-20089" type="math/tex">~~~~</script>T2,对于每一个64位整数求出之前所有数中与其的汉明距离为3的数的个数;
     <script id="MathJax-Element-20090" type="math/tex">~~~~</script>T3,求出起始串至少要经过多少次”将一个字符从后往前拖“的操作才能变为目标串并输出方案数;
     <script id="MathJax-Element-20091" type="math/tex">~~~~</script>T4,给出一颗距离树和每个其节点上的守卫者之间的关系树,每个守卫者都有一个波动守卫半径 [l,r] <script id="MathJax-Element-20092" type="math/tex">\left [ l,r \right ]</script>,支持动态插入新节点,动态查询关系树上 uv <script id="MathJax-Element-20093" type="math/tex">u \! \to \! v</script>的守卫者守卫住节点 z <script id="MathJax-Element-20094" type="math/tex">z</script>的期望人数。
     <script id="MathJax-Element-20095" type="math/tex">~~~~</script>今天吸取了昨天的教训,先好好切了T1,T2交了棵 trie <script id="MathJax-Element-20096" type="math/tex">trie</script>,T3yy了一个 nlog2n <script id="MathJax-Element-20097" type="math/tex">n\,log_2\,n</script>的贪心,最后拿了145的“标准分”(误)。

Day 3. <script id="MathJax-Element-20098" type="math/tex">Day~3.</script>然而并没有进

总而言之.
     <script id="MathJax-Element-20099" type="math/tex">~~~~</script>问题还是出在第一天,不仅心态没调整好,做题也没有策略,该拿的分没有拿。明明T1交一发 KMP <script id="MathJax-Element-20100" type="math/tex">KMP</script>就过了,我却图快用 find() <script id="MathJax-Element-20101" type="math/tex">find\left(\right)</script>;明明T2正解不过是 LCA <script id="MathJax-Element-20102" type="math/tex">LCA</script>,无论是代码复杂度还是思维复杂度都远小于用母函数+NTT的T4,我却因为题意不清淅就选择了放弃。说了这么多,不过是在证明,明明努力一把就能 Day 3 <script id="MathJax-Element-20103" type="math/tex">Day~3</script>,我却发挥得如此失常,连个一等的头衔都捞不到。
     <script id="MathJax-Element-20104" type="math/tex">~~~~</script>无论如何,这次省选之后,我必须得回归到文化课之中,准备 我并没有必要准备的 中考。只希望这次的错误我能铭记在心,在来年发挥出属于自己的水平。

P.S. <script id="MathJax-Element-20105" type="math/tex">P.S.</script>
     <script id="MathJax-Element-20106" type="math/tex">~~~~</script>在比赛的闲暇时间,我对一些代码的优化进行了钻研,稍微利用了一下struct的优点,搞出了下面的东西

#include<cstdio>
#define r_ return
#define in_ inline
#define add_ add<int>
#define d_add_ add<add_>
#define op_ operator

const int mx=4000;
int x, n, t, a, b, c, d;
char s[2];
template<class data>
struct add
{
    int u, l, r, x, y; data a;
    in_ int cov() {r_ l>=x&&y>=r;}
    in_ int mis() {r_ l>y||x>r;}
    in_ add ls()
        {r_ (add)
            {u<<1, l, l+r>>1, x, y, a};}
    in_ add rs()
        {r_ (add)
            {u<<1|1, l+r+2>>1, r, x, y, a};}
};
in_ d_add_
    mat(int a, int b, int c, int d, int x)
        {r_ d_add_{1, 1, n, a, b,
            add_{1, 1, n, c, d, x}};}
in_ d_add_ poi(int a, int b, int x)
    {r_ mat(a, a, b, b, x);}
template<class data, class del>
struct node
{
    data a[mx];
    in_ int op_=(int x)
    {
        static int i;
        for(i=1; i<mx; ++i) a[i]=0;
    }
    int op_+=(del b)
    {
        if(b.mis()) r_ 0;
        this->a[b.u]+=b.a;
        if(b.cov()) r_ 0;
        *this+=b.ls(), *this+=b.rs();
    }
    int op_|(del b)
    {
        if(b.mis()) r_ 0;
        if(b.cov()) r_ this->a[b.u]|b.a;
        r_ (*this|b.ls())+(*this|b.rs());
    }
};
node<node<int, add_ >, d_add_ > st;

struct bios
{
    inline int operator ++(int)
//我其实建议重载位运算或逻辑运算
    {
        static int r, c;
        for(r=0; (c=getchar())<48||57<c;);
        for(;c>47&&58>c; r=10*r+c-48, c=getchar());
        return r;
    }
    template<class fig>
    inline bios& operator +(fig &a)
    {
        return a=(*this)++, *this;
    }
    template<class fig>
    inline bios& operator -(fig a)
    {
        static int s[20], n;
        for(;;) if(s[n++]=a%10, !(a/=10)) break;
        for(;n;) putchar(s[--n]+48);
        return *this;
    }
    inline bios& operator -(const char *s)
    {
        static unsigned int i;
        for(i=0; s[i]; ++i) putchar(s[i]);
        return *this;
    }
} f;
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页