<更新档案>
<第一次更新>2020.05.17
增加部分应用内容
<前言>
好久没写blog了。主要是这段时间网课太忙了,作业都写不完谁还管这玩意。
总之也是写给自己看的,不必如何要求。
今天闲扯一下,没啥重要内容。
<正文>
Part.1 图论题总结
怎么说呢。其实就是讲了几道题,没什么知识点。
说到专题我想起之前还有一道题没补的矩乘。
总之,贴上几题我会的题解。
# C. AGC016D XOR Replace
我们发现异或和取决于数列本身,且一个数列的组合对应一个异或和。
同时有一个重要性质:
因为(a_n)的位置可以任意变换,所以可以替换出任一元素。
要导出两数列相等,则异或和也得相等。这就相当于把异或和也当做一个元素插入数列。
-
对于无解情况,排序后逐个比较,若存在不同则数列不同,即无解。
-
对于有解情况,我们考虑每一对不匹配带来的代价。
若(a_i!=b_i)则需要花费代价将(b_i)换掉,该代价为1。
对于整个序列,若将(a_i!=b_i)的(a_i、b_i)连接起来,则形成了若干个环(集合),大小为k的集合需要花费k的代价来还原。
举一个简单易懂的例子:
显然存在两个“集合”,({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)条边。
形如:
- 用这些边跑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
<后记>
本文发布于博客园,严禁转载!
狗头保命。