编辑
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; }
编辑
2025-09-02
XCPC
00

duipai.cpp

cpp
//freopen("in.txt", "r", stdin); // 读入数据生成器造出来的数据 //freopen("std.txt", "w", stdout); // 输出答案 #include <bits/stdc++.h> using namespace std; int main() { while (1) // 一直循环,直到找到不一样的数据 { system("gen.exe"); system("tle.exe"); system("std.exe"); if (system("fc std.txt tle.txt")) // 当 fc 返回 1 时,说明这时数据不一样 break; // 不一样就跳出循环 } return 0; }

对拍脚本

g++ -o tle tle.cpp g++ -o std std.cpp g++ -o gen gen.cpp g++ -o duipai duipai.cpp duipai