PyTorch 环境配置踩坑记录 – 1

首先配好 Anaconda

参照https://blog.csdn.net/weixin_47525457/article/details/115287373

1.5G的包始终装不上

用镜像。如清华提供的镜像:

 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

CUDA 不匹配

典型报错:

The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_61 sm_70 sm_75 compute_37.
If you want to use the GeForce RTX 3060 Laptop GPU GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/

在NVIDIA的控制面板里查看CUDA版本,我是11.6.58,故而在下载Pytorch的时候应当使用这样的指令:

conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch

OSError: [WinError 1455] 页面文件太小,无法完成操作。

往往体现在。

Error loading “\site-packages\torch\lib\caffe2_detectron_ops_gpu.dll“ or one of its dependencies.

首先需要在控制面板-查看高级系统设置中,给Python的安装盘(我是D盘)配置额外的虚拟内存。

参见https://www.cnblogs.com/blue-lin/p/14982097.html

同时调小 BATCH_SIZE 和 num_workers。

之所以调小后者,可参见:

https://github.com/ultralytics/yolov3/issues/1643#issuecomment-985652432

这个comment讲得鞭辟入里。

具体来说就是,它会载入一个dll文件,尽管这个dll文件里的绝大部分都用不到;windows系统会给它预留非常充分的内存;而多线程运行的时候每次 import torch 都会载入一遍,这就无端占据了巨额的内存,以至于怎么分配都不足够。

无论如何,总算跑起来了!

(希望不会有下一个踩坑记录)

易错点整理

文件及输入输出相关

文件输入输出要注意,文件名不要打错,一定要复制。

文件要独立。

打表要用文件输出,防止手抖。

随手 ctrl+s 。

输入不要想当然,n m 不要弄反。

std 相关

变量不要冲突。

DevC++ 可能会放一些莫名其妙的代码过。有的可能交上去 CE 的本地可以编译通过。头文件一定要记得开。

multi_set 删点的时候不能指定名字并删除,要找到以后再删除。

变量与操作

逻辑或是用在bool上的。

三目运算符和逗号的优先级。位运算的优先级。实在拿不准就加括号。

结构体内重载运算符如果类型不对可能会 CE ,记得要写 const 。

ull 的左移有坑!!!

取模

快速幂的底数要先取模,因为 long long 乘 long long 可能会爆掉。

多测

多测要清空,但不要 memset ,同 dsu on tree 。

CSP 2019

退役了。

Day1 大众分应该是 210 。

记住,写东西的时候要写 1ull<<N ,而非 1<<N 。 我 T1 在这里被卡了一个多小时,直接导致 T3 没有时间写暴力。 T2 反正大家都会做就不说了,大概就是树形 DP ,优化一下状态转移。有一个 trick 就是括号可以考虑前缀和什么的。 T3 不会做。不过 35pts 的暴力其实还是挺好想的。实在是时间不够。 估分 200 pts。

Day2 大众分应该是 263 。

T1 整个人都傻了。一道傻逼容斥居然没想出来。其实挺显然的,提示也给得很多,但是大概是题面太长,给了一些干扰吧。写了 m=3 的暴力走人。 T2 人没了。大概花了二十分钟左右的时间猜了一个结论,感觉挺正确的,大概就是如果你能分割最多份并且每一份的大小都尽可能小,那么答案是最优的。写了份代码调了一下。反正就记一个 g 函数表示以当前点结尾的最小值。然后记一下前缀和移项用单调栈优化一下转移就好了。然后写了个暴力拍了一下。还写了个高精。结果最后暴力拍出问题了。人都傻了,只好把暴力交上去走人。结果出来一对答案,发现我正解写得是对的,暴力写挂了。人没了。 T3 没有仔细想,写了 55 分的暴力。其实二叉树的结论挺好想的,但是没认真打,其实打了还是收益更高的。 想来想去还是 T2 犯的错太可惜了,一下子少掉了一大堆分。 估分 119 pts。

总估分 319 pts。

其实本来就知道这场已经是退役场了,只是没想到会退役得那么惨。

高一开始搞 OI ,当时意气风发。然后从 NOIP 到省选,再到 CTSC-APIO ,接二连三地,总是没能发挥出全力、总是出现这样那样的问题、总是把能拿的分给丢了。

其实考试的时候的题并不是题题都那么难。但是一方面自己经验不足,在考场上总是会出现这样那样的错误,有的时候是对分数的估计没有那么准确,有的时候是一些小点不知道导致调题调了很久,有的时候是没看出来一些显然的结论。大概是写题的时候总是没有理清思路吧。

所以就退役了吧,也就断了这份念想。

说到底还是菜。但是只是「菜」这个字是无法概括的。「菜」是有很多种形式的、是由很多个部分构成的。如果没有仔细地分析其中的每一个成分,那就没办法解决这个问题。

其实最近的出题趋势有点向国外靠拢的意思,也就是,大码农题逐渐变少,而有趣的结论题、有一定思维难度的题则增多。其代表就是 DP 题的逐渐增加。 从这个角度上说,刷一刷 Atcoder 或者 Codeforces 的意义是很大的。 然而我并没有发现这个趋势,也没有认真地培养自己的思维能力。

当然另一方面就是代码能力的问题。譬如,如果那一次和 XRJ 一起手写 bitset ,那我在 Day1T1 ,就不会在那个错上花那么多时间。

还有就是考试策略。实际上,考试的时候,应当要看好每一个部分分、预估一下难度。这样可能会发挥得更好一些。诸如 D1T1 为了 5pts 花了一个多小时、 D2T2 为了 12pts 花了快一个小时,都是相似的原因。

说到底,就是这样一个风气:我 A 了这道题,所以我牛逼。 但是其实考场上这个心态是毫无意义的。 然而 AC 实在是太爽了。你看到那一片大大的绿色,正反馈简直是无穷的。 所以即便明白这个道理也很难改正。

再有一个问题就是做题时的劲。唯独在考试的时候才能有一种无往不利的锐气,才能想出很多平时呆坐半天都无法解决的结论。说不定是猜结论的时候胆子不够大吧。

说也挺可笑的,我现今怀念以前的时候比展望未来的时候竟要多得多。 即便到了今日,对现今的状况仍然没有什么实感。实感想必是之后的事情了。

又有什么可说的呢? 那就这样了吧。

「过去的事情就过去了吧。」这样的话实在是太好说出口了。然而正是这种话太好说出口,所以不免惹得疑心这事情是否曾经挂在心上。 或许在多年之后,我仍然会梦回今日,遗憾着当时的 Day2 怎么考得那么差。但是 CSP2019 只不过是一个迟来的句号,就好比古典音乐结束之后那悠扬的尾声淡出于空气之中的那个位置。我的 OI 生涯其实早在那之前就结束了。

今から後悔しても無駄です。

这个博客我也许还会挂在这里,留待以后使用;也许会就此关停。 但那又有什么关系呢,这毕竟只是个写给自己看的博客啊。

在最后的时刻看到他们在讨论 D2T2 ,我又想冲上去把我 D2T2 犯的错大说特说,毕竟这是我此刻要紧的感受。
然后在此时我突然意识到:那又有什么用呢?他们尚且有下一年,而我已经不在此间了。
于是疏离感淹没了我。
我的手离开了键盘。

初赛复习:前缀表达式和后缀表达式

前缀表达式和后缀表达式——有时也被成为波兰表达式和逆波兰表达式——是对仅包含二元关系运算符和括号的表达式的变形。

事实上,前缀表达式和后缀表达式没有本质区别,因此只要会了前缀表达式,就会了后缀表达式——记住,前缀表达式是把运算符提到最前面的表达式,而后缀表达式反之。

对于一个这样的式子:
a+b/c
我们按照运算符优先级依次操作:
a+/bc
+a/bc
这样就将所有符号提到了整个式子的最前面。
对于包含括号的表达式,例如:
2+3(4-(5+6))/7 操作流程依然是按照运算符优先级的。 2+3(4-+5 6)/7
2+3(-4+5 6)/7 2+3(-4+5 6)/7
2+/3-4+5 6 7 +2/3-4+5 6 7

而如果要求后缀表达式,那操作就反之——从优先级最低的操作符开始,把操作符提到最右边。
还是一样的例子:
2 3(4-(5+6))/7+ 2 3(4-(5+6))7/+
2 3(4-(5+6))7/+ 2 3(4(5+6)-)7/+
2 3 4 5 6+-*7/+

初赛复习:OSI七层网络协议

ISO网络协议标准包括七层。

最底层的被称为物理层。这一层主要包括:
光纤、同轴电缆、双绞线、网卡、中继器、集线器
等硬件。它传输的是比特(bit)

物理层之上被称为数据链路层。数据链路层的主要硬件是网桥和交换机,这一层把数据封装成一种被称为帧(frame)的结构。

网络层是第三层。IP地址是这一层的内容。路由器也在这一层。

传输层是网络层之上的第四层。这一层主要管的是数据包的运输。TCP协议UDP协议都是传输层协议。

会话层是第五层,没看到什么考点。

表示层主要负责数据转换,没看到什么考点。

应用层是最顶层,应用层协议包括Telnet(Windows的远程桌面)、FTPSNMP(这两个都是远程文件管理系统)、HTTPDNS(IP地址解析服务)等协议。它是直接展现给用户的一层。

临时维护

本站为了积极响应有关部门号召,营造健康绿色的上网环境并提高服务质量,将进行技术升级与内容维护。因此,即时起至六月五日,本站将关闭评论功能。

LaTeX括号排版测试

这是一个普通的矩阵。
$$ \left[\begin{matrix}0&0&0\\0&0&0\\0&0&0\end{matrix}\right]$$
这是一组普通的线性同余方程。
$$ \left\{ \begin{matrix}x\equiv a_{1} \pmod{p_1} \\x\equiv a_{2}\pmod{p_2}\\\cdots\\x\equiv a_{n}\pmod{p_i}\end{matrix} \right.$$
这是一个普通的很大的小括号。
$$ \left(\begin{matrix}\\&&&&\\&&&&\\&&&&\end{matrix}\right)$$
代码下附:

$$ \left[\begin{matrix}0&0&0\\0&0&0\\0&0&0\end{matrix}\right]$$
$$ \left\{ \begin{matrix}x\equiv a_{1} \pmod{p_1} \\x\equiv a_{2}\pmod{p_2}\\\cdots\\x\equiv a_{n}\pmod{p_i}\end{matrix} \right.$$
$$ \left(\begin{matrix}\\&&&&\\&&&&\\&&&&\end{matrix}\right)$$ 

博客已经恢复访问

在昨日晚上被短暂的墙以后,我申请了搬瓦工的更换IP服务,现在已经可以正常访问。
用亲身经历警告各位,千万不要在服务器上搭建任何梯子。

大江南北一片赤红。
博客恢复正常访问。

博客搬迁

博客成功搬迁到了bwh8.net下的主机。服务器在美国,不过有针对中国的网络优化。
这样就可以用上域名辣!
SmokeyDays.top
搬迁的过程中遇到了两件尴尬的事情:
一是MySQL的密码一直不知道怎么重设。
事实上我已经忘了上次怎么重设的了,花了我一个多小时的时间折腾。现在把方案保存好待用。

MySQL密码重置方法:
首先进入/etc/目录,修改my.cnf,在[mysqld]下添加skip-grant-tables字样。
然后使用

mysql -u root -p 

登录MySQL。
接着输入命令


update mysql.user set password=PASSWORD(‘12345678‘) where user=‘root‘;
flush privileges;
quit;

即可。
二是首页无限重定向。这个发现之后另外写了一篇:
/nginx下wordpress循环重定向问题解决方案/

NOIP2018 Day -1

NOIP2018 Day -1
午时已到(雾)
(话说扰乱初赛秩序竞赛一年,那“扰乱复赛秩序”是不是要禁赛三年啊?)

lp2831 NOIP2016 愤怒的小鸟

看到\(n<=18\),很容易可以想到状压\(DP\)。
最大力的做法就是,枚举原集合和转移的目的集合,然后考虑一条抛物线能否穿过其中的所有点。
但是这样的复杂度显然是不可接受的,考虑优化。
易知,三点确定一条抛物线,故而在给定\(c=0\)的时候,确定两点即可确定第三点。具体的方程组是:
$$a=\frac{x_{j}*y_{i}-x_{i}*y{j}}{x_{i}*x_{j}*(x_{i}-x_{j})}$$
$$b=\frac{y_{i}}{x_{i}}-a*x_{i}$$
从而我们可以预处理出,通过某两个点的抛物线通过的点的集合,然后对于每一个状态,选择哪两个点拓展即可。
但这个时候的时间复杂度是\(O(T*n^2*2^n)\),对于较大的数据还是很难通过的。
这时候我们可以发现,第一个选择的点是可以固定的,也就是第一个可选择的点。因为如果选择其他点开始拓展的话,到最后依然要拓展那个点。
那么就成功地将复杂度压缩到了\(O(T*n*2^n)\),这时候就可以通过了。
PS:凡是Double的题都应该注意精度。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define eps 1E-6
int n,m;
int f[1<<18],A[20][20];
double x[20],y[20];
inline int lwbt(const int &_X){
    return _X&-_X;
}
inline int Min(const int &_X,const int &_Y){
    return _X<_Y?_X:_Y;
}
inline int cnt(int _X){
    int rt=0;
    while(_X&1){
        ++rt;
        _X>>=1;
    }
    return rt;
}
void init(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;++i){
        scanf("%lf%lf",&x[i],&y[i]);
    }
    double a,b;
    for(int i=0;i<n;++i){
        for(int j=i;j<n;++j){
            if(x[i]-x[j]<=eps&&x[i]-x[j]>=-eps){
                if(!(y[i]-y[j]<=eps&&y[i]-y[j]>=-eps)){
                    A[i][j]=0;
                    continue;
                }else{
                    A[i][j]=(1<<i)|(1<<j);
                    continue;
                }
            }
            a=(x[j]*y[i]-x[i]*y[j])/(x[i]*x[j]*(x[i]-x[j]));
            b=y[i]/x[i]-a*x[i];
            A[i][j]=0;
            if(a>=-eps){
                continue;
            }
            for(int k=0;k<n;++k){
                if(a*x[k]*x[k]+b*x[k]-y[k]<=eps&&a*x[k]*x[k]+b*x[k]-y[k]>=-eps){
                    A[i][j]|=(1<<k);
                }
            }
        }
    }
    /*
    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            printf("%d ",A[i][j]);
        }
        puts("");
    }
    */
    const int MAX=1<<n;
    int loc;
    memset(f,0x3f,sizeof(f));
    f[0]=0;
    
    for(int i=0;i<MAX;++i){
        loc=cnt(i);
        for(int j=loc;j<n;++j){
            f[i|A[loc][j]]=Min(f[i|A[loc][j]],f[i]+1);
        }
    }
    printf("%d\n",f[MAX-1]);
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        init();
    }
    return 0;
}

 

NOIP2018 Day -4

停课第六天。距离NOIP2018还有5天。

做模拟赛做得有点混乱。

打了一下洛谷的比赛,再做了一下NOIP2016,还算小有收获——换教室也太麻了。

lp3960 NOIP2018 列队

我没有脸把这篇文章称作是「我」的题解。
难度非常的大。
说实话根本不知道怎么写,也无法理解。
再一次感受到人和巨神的区别。

「人跟人之间是有差距的。」

实在是无法理解,所以只能抄小粉兔的题解了。
可能等到我的能力有提升了之后才能理解这道题的正解吧。
话说有个sm打成了rt卡了我半天。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define lwbt(_A) ((_A)&(-(_A)))


int q,loc[300005];
long long n,m,X[300005],Y[300005],ans[300005],arr[900005];
int len[300005],len2[300005],h[300005],tr[900005];
inline void add(int *_H,int _L,int _X,int _A){
    while(_X<=_L){
        _H[_X]+=_A;
        _X+=lwbt(_X);
    }
}
inline bool cmp(const int &_A,const int &_B){
    return (X[_A]==X[_B])?(_A<_B):(X[_A]<X[_B]);
}
inline int srch(int *_H,int _L,int _X){
    int l=1,r,mid,sm,rt;
    while((l<=_L)&&(_H[l]<_X)){
        l<<=1,rt=l;
    }
    r=l;
    sm=_H[l>>=1];
    while(l+1<r){
        mid=(l+r)>>1;
        if(mid>_L||_H[mid]+sm>=_X){
            r=mid,rt=mid;
        }else{
            l=mid,sm+=_H[l];
        }
    }
    rt=r;
    return rt;
}
int st[300005],tp=0;
void init(){
    scanf("%lld%lld%lld",&n,&m,&q);
    for(int i=1;i<=q;++i){
        scanf("%lld%lld",&X[i],&Y[i]);
        loc[i]=i;
    }
    sort(loc+1,loc+1+q,cmp);
    for(int i=1;i<m;++i){
        add(tr,m-1,i,1);
    }
    for(int i=1;i<=n;++i){
        len[i]=m-1;
    }
    for(int i=1;i<=q;++i){
        if(X[loc[i-1]]!=X[loc[i]]){
            while(tp){
                add(tr,m-1,st[tp--],1);
            }
        }
        if(Y[loc[i]]>len[X[loc[i]]]){
            continue;
        }
        int pos=srch(tr,m-1,Y[loc[i]]);
        ans[loc[i]]=(X[loc[i]]-1)*m+pos;
        add(tr,m-1,pos,-1);
        st[++tp]=pos;
        --len[X[loc[i]]];
    }
    int it=0;
    for(int i=1;i<=n;++i){
        while(it<=q&&X[loc[it]]<i){
            ++it;
        }
        h[i]=it-1;
    }
    h[n+1]=q;
    memset(tr,0,sizeof(tr));
    for(int i=1;i<=n;++i){
        len[i]=0,len2[i]=m-1;
    }
    len[n+1]=n;
    for(int i=1;i<=n;++i){
        add(tr+h[n+1],n+q,i,1);
        arr[q+i]=i*m;
    }
    for(int i=1;i<=q;++i){
        if(ans[i]){
            int pos=srch(tr+h[n+1],n+q,X[i]);
            add(tr+h[n+1],n+q,pos,-1);
            add(tr+h[n+1],n+q,++len[n+1],1);
            arr[h[n+1]+len[n+1]]=ans[i];
            add(tr+h[X[i]],h[X[i]+1]-h[X[i]],++len[X[i]],1);
            arr[h[X[i]]+len[X[i]]]=arr[h[n+1]+pos];
            --len2[X[i]];
        }else{
            int pos=srch(tr+h[n+1],n+q,X[i]);
            add(tr+h[n+1],n+q,pos,-1);
            add(tr+h[n+1],n+q,++len[n+1],1);
            if(Y[i]!=m){
                int pos2=srch(tr+h[X[i]],h[X[i]+1]-h[X[i]],Y[i]-len2[X[i]]);
                add(tr+h[X[i]],h[X[i]+1]-h[X[i]],pos2,-1);
                ans[i]=arr[h[X[i]]+pos2];
                add(tr+h[X[i]],h[X[i]+1]-h[X[i]],++len[X[i]],1);
                arr[h[X[i]]+len[X[i]]]=arr[h[n+1]+pos];
            }else{
                ans[i]=arr[h[n+1]+pos];
            }
            arr[h[n+1]+len[n+1]]=ans[i];
        }
    }
    for(int i=1;i<=q;++i){
        printf("%lld\n",ans[i]);
    }
} 
int main(){
    init();
    return 0;
}