编辑
2025-11-03
运维
00

服务器操作系统:ubuntu22.04(建议和我使用一样的)

先执行sudo apt update 更新

docker 下载(如果没有)

sh
sudo apt install -y docker-compose sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://98t8vkfg.mirror.aliyuncs.com", "https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com", "https://docker.m.daocloud.io", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://your_preferred_mirror", "https://dockerhub.icu", "https://docker.registry.cyou", "https://docker-cf.registry.cyou", "https://dockercf.jsdelivr.fyi", "https://docker.jsdelivr.fyi", "https://dockertest.jsdelivr.fyi", "https://mirror.aliyuncs.com", "https://dockerproxy.com", "https://mirror.baidubce.com", "https://docker.m.daocloud.io", "https://docker.nju.edu.cn", "https://docker.mirrors.sjtug.sjtu.edu.cn", "https://docker.mirrors.ustc.edu.cn", "https://mirror.iscas.ac.cn", "https://docker.rainbond.cc", "https://docker.registry.cyou", "https://docker-cf.registry.cyou", "https://dockercf.jsdelivr.fyi", "https://docker.jsdelivr.fyi", "https://dockertest.jsdelivr.fyi", "https://mirror.aliyuncs.com", "https://dockerproxy.com", "https://mirror.baidubce.com", "https://docker.m.daocloud.io", "https://docker.nju.edu.cn", "https://docker.mirrors.sjtug.sjtu.edu.cn", "https://docker.mirrors.ustc.edu.cn", "https://mirror.iscas.ac.cn", "https://docker.rainbond.cc" ] } EOF sudo systemctl daemon-reload sudo systemctl restart docker

在项目启动之前,还需要修改一个配置文件。

sh
sudo vim /etc/default/grub

找到 GRUB_CMDLINE_LINUX_DEFAULT 换成:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.unified_cgroup_hierarchy=0 cgroup_enable=memory swapaccount=1"

然后保存,重启

sh
sudo update-grub sudo reboot

当前在 dom 目录下

database.secret

输入自己的密码

MYSQL_ROOT_PASSWORD=@xxx114514 MYSQL_PASSWORD=xxx114514

judgehost.secret

JUDGEDAEMON_PASSWORD=xxx114514

docker-compose.yml

yml
version: "3.9" services: dj-mariadb: container_name: dj-mariadb image: mariadb:10.5 restart: unless-stopped ports: - "13306:3306" volumes: - ./database:/var/lib/mysql env_file: database.secret environment: - MYSQL_USER=domjudge - MYSQL_DATABASE=domjudge - CONTAINER_TIMEZONE=Asia/Shanghai command: --max-connections=1024 --max-allowed-packet=1G --innodb-log-file-size=512M healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "--password=$$MYSQL_ROOT_PASSWORD"] start_period: 30s interval: 10s timeout: 5s retries: 10 domserver: container_name: domserver image: domjudge/domserver:8.3.1 restart: unless-stopped ports: - "80:80" depends_on: dj-mariadb: condition: service_healthy env_file: database.secret environment: - MYSQL_HOST=dj-mariadb - MYSQL_USER=domjudge - MYSQL_DATABASE=domjudge - CONTAINER_TIMEZONE=Asia/Shanghai volumes: - ./backups:/opt/domjudge/domserver/backups healthcheck: test: ["CMD", "curl", "-f", "http://localhost/"] interval: 30s timeout: 10s retries: 3 judgehost: image: domjudge/judgehost:8.3.1 restart: unless-stopped depends_on: domserver: condition: service_healthy privileged: true volumes: - /sys/fs/cgroup:/sys/fs/cgroup:rw env_file: judgehost.secret environment: - DAEMON_ID=1 - CONTAINER_TIMEZONE=Asia/Shanghai deploy: replicas: 5 #评测机数量

启动数据库

bash
docker-compose up -d dj-mariadb

等待数据库完全就绪

bash
# 检查数据库健康状态 until docker-compose exec dj-mariadb mysqladmin ping -u root -p$(grep MYSQL_ROOT_PASSWORD database.secret | cut -d= -f2) --silent; do echo "等待数据库启动..." sleep 10 done echo "数据库已就绪!"

启动 DOMServer

bash
docker-compose up -d domserver

数据持久化设置

sh
# 在 dom 目录下执行 # 创建必要的目录 mkdir -p database backups domserver_data/{public/images,public/flags,var} # 从运行的容器中复制默认数据到宿主机 echo "正在复制 DOMServer 默认数据到宿主机..." # 复制图片和标志文件 docker cp domserver:/opt/domjudge/domserver/webapp/public/images/. domserver_data/public/images/ docker cp domserver:/opt/domjudge/domserver/webapp/public/flags/. domserver_data/public/flags/ # 复制变量数据 docker cp domserver:/opt/domjudge/domserver/webapp/var/. domserver_data/var/ # 验证数据复制成功 echo "验证复制的数据:" ls -la domserver_data/public/images/ ls -la domserver_data/public/flags/ echo "数据复制完成!"

修改 docker-compose.yml 添加数据持久化

yml
version: "3.9" services: dj-mariadb: container_name: dj-mariadb image: mariadb:10.5 restart: unless-stopped ports: - "13306:3306" volumes: - ./database:/var/lib/mysql env_file: database.secret environment: - MYSQL_USER=domjudge - MYSQL_DATABASE=domjudge - CONTAINER_TIMEZONE=Asia/Shanghai command: --max-connections=1024 --max-allowed-packet=1G --innodb-log-file-size=512M healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "--password=$$MYSQL_ROOT_PASSWORD"] start_period: 30s interval: 10s timeout: 5s retries: 10 domserver: container_name: domserver image: domjudge/domserver:8.3.1 restart: unless-stopped ports: - "80:80" depends_on: dj-mariadb: condition: service_healthy env_file: database.secret environment: - MYSQL_HOST=dj-mariadb - MYSQL_USER=domjudge - MYSQL_DATABASE=domjudge - CONTAINER_TIMEZONE=Asia/Shanghai volumes: - ./backups:/opt/domjudge/domserver/backups - ./domserver_data/public/images:/opt/domjudge/domserver/webapp/public/images - ./domserver_data/public/flags:/opt/domjudge/domserver/webapp/public/flags - ./domserver_data/var:/opt/domjudge/domserver/webapp/var healthcheck: test: ["CMD", "curl", "-f", "http://localhost/"] interval: 30s timeout: 10s retries: 3 judgehost: image: domjudge/judgehost:8.3.1 restart: unless-stopped depends_on: domserver: condition: service_healthy privileged: true volumes: - /sys/fs/cgroup:/sys/fs/cgroup:rw env_file: judgehost.secret environment: - DAEMON_ID=1 - CONTAINER_TIMEZONE=Asia/Shanghai deploy: replicas: 5

更新 judgehost 密码

bash
# 获取自动生成的 judgehost 密码 echo "JUDGEDAEMON_PASSWORD=$(docker-compose exec domserver cat /opt/domjudge/domserver/etc/restapi.secret | awk 'END{print $4}')" > judgehost.secret

获取管理员admin密码,用于登录web页面

bash
# 获取管理员 admin 密码,用于登录 web 页面 docker exec -it domserver cat /opt/domjudge/domserver/etc/initial_admin_password.secret # 可选:将管理员密码保存到文件 echo "$(docker exec -it domserver cat /opt/domjudge/domserver/etc/initial_admin_password.secret)" > adm-psd.txt

重启(因为数据挂载更新还没生效)

bash
docker-compose down docker-compose up -d

然后打开网页登录,账号是 admin

image.png

进入 domserver 容器重置管理员密码 (可选)

bash
echo "password=$(docker exec -it domserver cat /opt/domjudge/domserver/etc/initial_admin_password.secret)" > adm-psd.txt
编辑
2025-11-03
java炒饭
00
sh
sudo apt update sudo apt install openssh-server sudo systemctl status ssh sudo ufw allow ssh sudo passwd root vi /etc/ssh/sshd_config #修改如下内容 设置PermitRootLogin 其他的配置默认是不开启root访问的 PermitRootLogin yes sudo service sshd restart # or sudo systemctl restart sshd
编辑
2025-10-20
XCPC
00

vp了2023济南icpc,卡在一个典题上面(还是太菜了)。

题目链接:https://codeforces.com/gym/104901

直接说结论,给定一个无向图(无重边自环),每条边只能选择两个端点的其中一个,且必须选出一个,很显然对于其中一个连通块的选择方案只有 22 种(第一个点选或者不选一旦确定,后面点的状态是固定的),所以总共的选择方案为 2cnt2^{cnt}cntcnt 为连通块的数量,当然前提是每个连通块都是二分图。

回到这个题,(设矩阵为 m×nm\times n )当第 ii 列和第 ni+1n-i+111 的个数超过 33 时无解,为 11 时不需要连边,为 22 时,若在同一行也不需要连,其他情况说明两个 11 在不同的行,设为 x,yx,y ,有两种情况:

1.两个 11 在同一列,说明两者必须一个反转,一个不反转

2.两个 11 在不同列,说明两个必须同时不变,或者同时反转

ii 表示反转第 ii 行, i+mi+m 对应不翻转第 ii 行。

第一种情况,连 xxyy 的边。

第二种情况,连 xxy+my+m 的边。

然后做二分图判定即可。

代码:

cpp
#include <bits/stdc++.h> using namespace std; #define int long long #define ll long long #define endl '\n' const int M = 2e6 + 5; const int inf = 2e9, mod = 1e9 + 7; int a[M], b[M]; int vis[M]; string s[M]; vector<int> f[M]; void add(int x, int y) { f[x].push_back(y); f[y].push_back(x); // cout<<x<<" "<<y<<endl; } int dfs(int x){ for(auto to : f[x]){ if(vis[to]){ if(vis[x] == vis[to])return 0; continue; } vis[to] = 3-vis[x]; if(!dfs(to))return 0; } return 1; } void solve() { int m, n; cin >> m >> n; for (int i = 1; i <= m; i++) { cin >> s[i]; s[i] = " " + s[i]; } vector<int> cnt(n + 2); vector<vector<int>> g(n + 2); for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) if (s[i][j] == '1') { cnt[j]++; g[j].push_back(i); } } for (int i = 1; i <= n; i++) { if (cnt[i] + cnt[n - i + 1] > 2) { cout << 0 << endl; return; } } for (int i = 1; i <= n / 2; i++) { if (cnt[i] + cnt[n - i + 1] == 2) { vector<int> v; for (auto x : g[i]) v.push_back(x); for (auto x : g[n - i + 1]) v.push_back(x); int x = v[0], y = v[1]; if (x == y) continue; if (cnt[i] == 1) { add(x, y + m); } else add(x, y); } } for (int i = 1; i <= m; i++) add(i, i + m); int ans = 1; for (int i = 1; i <= 2 * m; i++) { if (!vis[i]) { vis[i] = 1; if (!dfs(i)) ans = 0; else ans = ans * 2 % mod; } } for (int i = 1; i <= 2 * m; ++i) vis[i] = 0, f[i].clear(); cout << ans << endl; } signed main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int T = 1; cin >> T; while (T--) { solve(); } }
编辑
2025-09-29
XCPC
00

初始化init.sh

sh
for i in {a..m} do rm -rf $i mkdir $i touch $i/$i.cpp $i/$i.in $i/$i.out done

运行run.sh

sh
file=$1/$1.cpp g++ -o ./temp/main $file ./temp/main < $1/$1.in > $1/$1.out cat $1/$1.out

对拍pai.sh

sh
g++ -o ./temp/gen gen.cpp g++ -o ./temp/std std.cpp g++ -o ./temp/tle tle.cpp while true; do ./temp/gen > in.txt ./temp/tle < in.txt > tleout.txt ./temp/std < in.txt > out.txt diff tleout.txt out.txt done
编辑
2025-09-15
XCPC
00

https://www.luogu.com.cn/problem/UVA11572

cpp
#include<bits/stdc++.h> using namespace std; // #define int long long const int M=2e5+5; int a[M]; pair<int,int>f[M]; int dp[M][21]; int lo[M]; void solve(){ int n; cin>>n; for(int i=1;i<=n;++i)cin>>a[i]; map<int,int>cnt; int l=1,r=0; int ans=0; while(l<=n&&r<=n){ while (r<n) { if(cnt[a[r+1]]==1)break; r++; cnt[a[r]]++; } ans=max(ans,r-l+1); // cout<<l<<' '<<r<<endl; cnt[a[l]]--; l++; } cout<<ans<<endl; } signed main(){ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int t=1; cin>>t; while(t--)solve(); return 0; }