• 杂谈


    <更新档案>

    <第一次更新>2020.05.17

    增加部分应用内容

    <前言>

    好久没写blog了。主要是这段时间网课太忙了,作业都写不完谁还管这玩意。

    总之也是写给自己看的,不必如何要求。

    今天闲扯一下,没啥重要内容。

    <正文>

    Part.1 图论题总结

    怎么说呢。其实就是讲了几道题,没什么知识点。

    说到专题我想起之前还有一道题没补的矩乘。

    总之,贴上几题我会的题解。

    # C. AGC016D XOR Replace

    我们发现异或和取决于数列本身,且一个数列的组合对应一个异或和。

    同时有一个重要性质:

    [若a_1 xor a_2 xor...a_n=x \ 则x xor a_1 xor...a_{n-1}=a_1 ]

    因为(a_n)的位置可以任意变换,所以可以替换出任一元素。

    要导出两数列相等,则异或和也得相等。这就相当于把异或和也当做一个元素插入数列。

    • 对于无解情况,排序后逐个比较,若存在不同则数列不同,即无解。

    • 对于有解情况,我们考虑每一对不匹配带来的代价。

      (a_i!=b_i)则需要花费代价将(b_i)换掉,该代价为1。

      对于整个序列,若将(a_i!=b_i)(a_i、b_i)连接起来,则形成了若干个环(集合),大小为k的集合需要花费k的代价来还原。
      举一个简单易懂的例子:

    [egin{aligned} &a:3 1 4 5 2 \ &b:1 3 2 4 5 \ end{aligned} ]

    显然存在两个“集合”,({1,3})({2,4,5})都只需要替换((集合个数+1))次即可,最后一次还原异或和位置。

    (mathrm{Specially,})若异或和(x)本身也处于一个环中的话最终答案减一,因为不需要再还原异或和位置.

    (mathrm{Code:})

    #include<bits/stdc++.h>
    #define N 150010
    using namespace std;
    int n;
    int a[N] = {}, b[N] = {};
    struct US_set
    {
        int f[N], n;
        US_set(int m)
        {
            n = m;
            for(int i = 1; i <= n; ++i)f[i] = i;
        }
        int get(int x)
        {
            return x == f[x] ? x : f[x] = get(f[x]);
        }
        void merge(int x, int y)
        {
            int u = get(x), v = get(y);
            if(u != v)f[u] = v;
        }
    };                                 //并查集维护集合个数。
    map<int, int>ma;
    int read()
    {
        int s = 0, w = 1;
        char c = getchar();
        while((c < '0' || c > '9') && c != '-')
            c = getchar();
        if(c == '-')w = -1, c = getchar();
        while(c <= '9' && c >= '0')
            s = (s << 3) + (s << 1) + c - '0', c = getchar();
        return s * w;
    }
    int main()
    {
        freopen("xor.in", "r", stdin);
        freopen("xor.out", "w", stdout);
        n = read();
        int xor1 = 0, xor2 = 0;
        for(int i = 1; i <= n; ++i)
            a[i] = read();
        for(int i = 1; i <= n; ++i)
            b[i] = read();
        for(int i = 1; i <= n; ++i)
        {
            xor1 ^= a[i];
            xor2 ^= b[i];
        }
        a[++n] = xor1;
        b[n] = xor2;
                                            //添加异或和为一个元素
        int t1[N], t2[N];
        for(int i = 1; i <= n; ++i)
            t1[i] = a[i], t2[i] = b[i];
        sort(t1 + 1, t1 + n + 1);
        sort(t2 + 1, t2 + n + 1);
        for(int i = 1; i <= n; ++i)
            if(t2[i] != t1[i])
            {
                puts("-1");
                return 0;
            }
                                           //排序判无解
        int sum = 0, ans = 0;
        for(int i = 1; i <= n; ++i)
            if(a[i] != b[i])
            {
                if(i != n)++sum;
                if(!ma[a[i]])ma[a[i]] = ++ans;
                if(!ma[b[i]])ma[b[i]] = ++ans;
            }
        if(!sum)
        {
            puts("0");
            return 0;
        }
        US_set F(ans);
        for(int i = 1; i <= n; ++i)
            F.merge(ma[a[i]], ma[b[i]]);
        for(int i = 1; i <= ans; ++i)
            if(F.f[i] == i)++sum;
        printf("%d
    ", sum - 1);             //瞎搞输出
        return 0;
    }
    

    # D. ARC076D Built?

    一看就是MST的套路,但是你不知道怎么建边,毕竟完全图是不可能的。

    • 你观察这个权值(mathrm{min}(|a-c|,|b-d|))

      这个形式可能有点眼熟。但是题解上和切比雪夫距离无关。

      但是横坐标之差与纵坐标之差取优,你可以直接安排上。

    • 其实也就相当于从当前点连到其他点的一条边。比如对于点(u,(x,y))(v,(a,b))存在两条边,权值分别为(|x-a|,|y-b|)

    • 然后我们发现可以排除不必要的边,留下最优的(最小的)。那么当然是排序后相邻的边代价最小了。所以我们将横坐标纵坐标分别排序后相邻连边。这样可以建出(2n-2)条边。
      形如:

    [a_1<->a_2<->a_3...a_n \ b_1<->b_2<->b_3...b_n \ ]

    • 用这些边跑MST就可以了。

    (mathrm{Code:})

    #include<bits/stdc++.h>
    #define N 100010
    using namespace std;
    struct rode
    {
        int x, i, op;
    } a[N] = {}, b[N] = {}, c[N<<1] = {};
    int n, m;
    int read()
    {
        int s = 0, w = 1;
        char c = getchar();
        while((c < '0' || c > '9') && c != '-')
            c = getchar();
        if(c == '-')w = -1, c = getchar();
        while(c <= '9' && c >= '0')
            s = (s << 3) + (s << 1) + c - '0', c = getchar();
        return s * w;
    }
    inline bool cmp(rode x, rode y)
    {
        return x.x < y.x;
    }
    int f[N] = {};
    int get(int x)
    {
        return x == f[x] ? x : f[x] = get(f[x]);
    }
    int main()
    {
        freopen("built.in", "r", stdin);
        freopen("built.out", "w", stdout);
        n = read();
        int len = 0;
        for(int i = 1; i <= n; ++i)
        {
            a[i].x = read();
            b[i].x = read();
            a[i].i = b[i].i = i;
        }
        sort(a + 1, a + n + 1, cmp);
        sort(b + 1, b + n + 1, cmp);
        for(int i = 2; i <= n; ++i)
        {
            c[++len].x = a[i].x - a[i - 1].x;
            c[len].i = i - 1;
            c[len].op = 1;
            c[++len].x = b[i].x - b[i - 1].x;
            c[len].i = i - 1;
            c[len].op = 2;
        }
        sort(c + 1, c + len + 1, cmp);
        for(int i = 1; i <= n; ++i)
            f[i] = i;
        int sum = 0, cnt = 0;
        for(int i = 1; i <= len; ++i)
        {
            if(c[i].op == 1)
            {
                int u = get(a[c[i].i].i), v = get(a[c[i].i + 1].i);
                if(u != v)
                {
                    f[u] = v;
                    sum += c[i].x;
                    ++cnt;
                    if(cnt == n - 1)
                        break;
                }
            }
            if(c[i].op == 2)
            {
                int u = get(b[c[i].i].i), v = get(b[c[i].i + 1].i);
                if(u != v)
                {
                    f[u] = v;
                    sum += c[i].x;
                    ++cnt;
                    if(cnt == n - 1)
                        break;
                }
            }
        }
        printf("%d
    ", sum);
        return 0;
    }
    

    还有两题下次说吧,累死了。


    Part.2 闲扯资源分享

    最近搞了一些奇怪玩意。
    比如VPN啊各种奇怪软件之类的。现在分享一下我用的一些软件。
    很多我都会打包放在下面网盘里。

    Markdown:

    首推(mathrm{Stackedit}),我用的是网页版,可以云端同步,这功能我现在可能没什么用,但是以后就肯定会有用的。再说(mathrm{Typora})下载页,自由导出且有优秀的编辑体验。支持部分HTML语法。

    绘图:

    有着老牌的(几何画板)和新晋的(mathrm{GeoGebra}),我还是比较喜欢GeoGebra,用着顺手,而几何画板功能多且十分经典,我们数学老师很推崇。

    高级工具(mathrm{Graphviz}),简单使用很简单,但是稍微复杂一点的绘图要求掌握

    录屏:

    说实话这方面我就只有两款软件,准确的说一款,就是(mathrm{Captura}),是胡神推荐给我的。听说(mathrm{ZOOM})也不错,但是没用过。而还有就是win10自带的(mathrm{Xbox Game bar}),但是因为我至今没有成功使用过,所以不算了。

    代码编辑:

    首推(mathrm{Sublime Text 3}),可以免费使用但是会不停跳出提示,不过有很多人在网上分享自己的秘钥,所以其实是可以快乐编辑的,这是推荐解密。功能强大,页面简洁,插件繁多,安装方便,操作便利。我吹爆,而且秒开无延时,继续上次编辑不会关闭。再有就是(mathrm{Atom}),功能强大,最主要的是背靠着强大的GitHub,支持各种方便的项目建立及分支创建。插件也很多,主要问题是很多时候我都会遇到未知错误比如美化插件无法使用,中文社区上也较少有解答。还有就是这是胡队在用的。

    音乐:

    首推(网易云)这个不用说,但是分享一下一些黑科技。付费下载歌曲接口下载.最近找到的黑科技(mathrm{Listen1})介绍页,下载页,主要解决了版权问题,集合个各个播放器。下载可能奇慢(科学♂有奇效),无法下载的可以网盘。考虑到网盘可能失效,邮箱2421594879@qq.com戳我说明要什么,要win32位版的还是win64位版的,毕竟我可能会忘掉这个blog是干啥的。

    VPN:

    以下正片。


    <2020.05.17>亲测

    先上(Google上网助手),可以登录包括谷歌应用市场、谷歌搜索之内的网站。

    然后就可以找到各种VPN,免费而良心的不少,就不列了。

    但是主要问题是这类东西基本速度不快。不稳定毕竟用的人也多。


    · 我PC版用的是(NordVPN)官网 很快但就是有点贵,只买一个月的话价格11.5美金,也就是80多RMB,购买长期有优惠,但是还是很贵。特别注意的是NordVPN的软件无法在境内使用的话需要手动配置OpenVPN,教程。其实还是很好用的,毕竟稳定,老牌了。

    最近找到了(mathrm{TROJAN})节点购买配置详解试了一下速度奇快,基础版每月20,我决定下个月开始尝试购买,再做决定是否长期使用。

    另外胡神用(mathrm{Lantern}(蓝灯)),每个月免费500M流量,真免费(虽然也是听说的)。也会打包的。

    当然也有(mathrm{psiphon3}(赛风)),免费的。但这个崩溃是家常便饭了。快或慢全看机遇。

    · 手机我是安卓,NordVPN支持手机但是软件内一样连不了,所以我现在用(雷霆加速器)。支持安卓与ios,但是这个是要付费或宣传能拿到时间。最新版1.1.2我没办法,所以找了一个1.1.0的破解版,经过验正可用。更多:Goolge Play商店有很多,但前提是你进得去[手动滑稽]。

    一些小Tools:

    窗体透明度调整的(mathrm{Vitrite}),快速隐藏(mathrm{QuickHider}),比较有意思的截图(mathrm{Snipaste}),以及(网盘密码查询工具)

    网盘地址(部分软件需自行下载)

    链接:/s/1K25PgAxNtvZ9uUKdbto_qQ
    提取码:m3be

    <后记>

    本文发布于博客园,严禁转载!

    狗头保命。

  • 相关阅读:
    关于浏览器cookie的详解
    浏览器渲染帧
    Vue3中关于diff的优化
    JS报错 Cannot set property 'display' of undefined问题
    vue选项卡 ,循环数据点击改变class,并初始循环中的第一个为选中状态class
    Nuxt中引入elementUI
    jq 获取节点 改变元素class的显示、隐藏
    vue监听滚动条
    Nuxt中引入iconfont图标
    vue导航点击切换 2.0
  • 原文地址:https://www.cnblogs.com/yywxdgy/p/12632440.html
Copyright © 2020-2023  润新知