当前位置: 首页 > news >正文

详细揭秘:如何利用命令行快速生成多组数据

orz flyfree,他真的太强了。

众所周知,我们用命令行去运行 main 函数时,是可以带参数的。

具体的,可以这样去写:

int main(int argc, char* argv[]){/* do something...*/return 0;
}

argc 就是参数个数,argv[] 就是具体的参数(为 string 类型)。

我们可以使用这个参数,来制造多组不同的数据。

具体的,我们需要实现三个文件 workdatamakerstd

work

可以准备一个 work.cpp 的文件,用来控制整个数据生成器。

众所周知,在 C++ 中,可以在主函数内部调用函数 system(const char* command); 调用操作系统的命令处理器来执行参数 command 所指向的字符串命令。

如果对于编号在 \([L,R]\) 的测试点,我们想要造出 \(A\) 性质的数据,那么我们可以把 测试数据编号,数据存储的文件,以及造出来数据的类型 打包在一个 string 中,然后用 system 调用 datamaker(你准备的数据生成器),并让你的 string 的首指针作为参数传进去。

造出输入数据后,还需要用命令行运行 std 去造输出数据。

你可以看做你传入的 string 会按照空格划分成若干个 string 然后从下标 \(1\) 开始依次传入到 argv 的每一项,其中 argv[0] 为你运行文件的文件名。

每次,你也可以用命令行去执行 work,并把 \(L,R\) 和数据类型当成参数传给 work.exe 让他去造对应类型的数据。

int L = revs(argv[1]), R = revs(argv[2]);// revs(x) 为把 x 从字符串转化为整型,其中 argv[1,2] 表示 L,R
string typ = argv[3]; // argv[3] 表示数据的类型
for(int i = L;i <= R; ++i){string Sin = Bas + revv(i) + ".in ";// 输入数据需要存储的文件名,revv(x) 为把 x 从整型转化为字符串string Sout = Bas + revv(i) + ".ans "; // 输出数据需要存储的文件名system(("datamaker " + Sin + typ).data()); // 含义为运行 datamaker 这个文件,两个参数分别是造出来的数据存储到 Sin 这个文件,数据类型为 typ,得到这一大串命令的首指针system(("dump " + Sin + Sout).data()); // 同理
}

datamaker

把参数中的数据类型解压出来,然后生成数据到对应文件即可。

int main(int argc, char* argv[]){srand(time(0));freopen(argv[1], "w", stdout);char type = argv[2][0];if(type == 'A'){/*...*/}else if(type == 'B'){/*...*/}/* make data */return 0;
}

std

同理,输入输出到对应文件即可。

int main(int argc, char* argv[]){freopen("dump.in", "r", stdin);freopen("dump.out", "w", stdout);solve();return 0;
}

事例:

随机选择一道题目 P13487 来造数据。造 \(100\) 组数据,前 \(25\) 组为小数据,后 \(75\) 组为大数据。

  • work.cpp
#include <bits/stdc++.h>
using namespace std;
string revv(int x){string ret = "";while(x){ret = (char)(x % 10 + '0') + ret;x /= 10;}return ret;
}
int revs(string s){int ret = 0;for(int i = 0;i < s.length(); ++i)ret = ret * 10 + s[i] - '0';return ret;
}
int main(int argc, char* argv[]){int L = revs(argv[1]), R = revs(argv[2]);string bas = "pingpang";string typ = argv[3];for(int i = L; i <= R; i++){string Sin = bas + revv(i) + ".in ";string Sout = bas + revv(i) + ".ans ";system(("datamaker " + Sin + typ).data());system(("std " + Sin + Sout).data());}return 0;
}
  • datamaker.cpp
#include <bits/stdc++.h>
using namespace std;
mt19937 rnd(time(0));
int main(int argc, char* argv[]){freopen(argv[1], "w", stdout);int n, m, C = 100, x, y;srand(time(0));printf("%d\n", C);while(C--){int mod = 10;if(argv[2][0] == 'A') mod = 98;if(argv[2][0] == 'B') mod = 999998;n = rnd() % mod + 2;m = rnd() % mod + 2;printf("%d %d\n", n, m);x = rnd() % 40 - 20, y = rnd() % 40 - 20;if(!x) x++;if(!y) y++;printf("%d %d\n", x, y);x = rnd() % 40 - 20, y = rnd() % 40 - 20;if(!x) x++;if(!y) y++;printf("%d %d\n", x, y);}return 0;
}
  • std.cpp

突然发现这题还有没 std()。

让 AI 生成了一个,不保证正确性仅供参考。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : abs(a); }void exgcd(ll a, ll b, ll &x, ll &y) {if (!b) { x = 1; y = 0; return; }exgcd(b, a % b, y, x);y -= a / b * x;
}ll floor_div(ll a, ll b) { if (a >= 0) return a / b;return (a - b + 1) / b;
}ll ceil_div(ll a, ll b) { if (a >= 0) return (a + b - 1) / b;return a / b;
}void solve() {int C;cin >> C;for (int cas = 1; cas <= C; ++cas) {ll W, H, dx1, dy1, dx2, dy2, x0, y0;cin >> W >> H;cin >> dx1 >> dy1;cin >> dx2 >> dy2;cin >> x0 >> y0;if (x0 < 0 || x0 >= W || y0 < 0 || y0 >= H) {cout << "Case #" << cas << ": 0\n";continue;}ll det = dx1 * dy2 - dx2 * dy1;ll ans = 0;if (det != 0) {bool swapped = false;if (H < W) {swap(W, H);swap(x0, y0);swap(dx1, dy1);swap(dx2, dy2);swapped = true;}ll g = gcd(abs(dx1), abs(dx2));ll x_abs, y_abs;exgcd(abs(dx1), abs(dx2), x_abs, y_abs);ll i_g = (dx1 < 0) ? -x_abs : x_abs;ll j_g = (dx2 < 0) ? -y_abs : y_abs;ll A = dx2 / g;ll B = -dx1 / g;ll K = det / g;ll C = dy1 * i_g + dy2 * j_g;  for (ll x = 0; x < W; ++x) {ll X = x - x0;if (X % g != 0) continue;ll mul = X / g;ll i0 = i_g * mul;ll j0 = j_g * mul;ll t_min = LLONG_MIN, t_max = LLONG_MAX;auto add_ge = [&](ll a, ll b) {if (a > 0) t_min = max(t_min, ceil_div(-b, a));else if (a < 0) t_max = min(t_max, floor_div(b, -a));else if (b < 0) t_min = 1, t_max = 0;};add_ge(A, i0);add_ge(B, j0);if (t_min > t_max) continue;ll Y0 = y0 + C * mul;auto add_range = [&](ll a, ll b, ll L, ll R) {if (a > 0) {t_min = max(t_min, ceil_div(L - b, a));t_max = min(t_max, floor_div(R - b, a));} else if (a < 0) {t_min = max(t_min, ceil_div(b - R, -a));t_max = min(t_max, floor_div(b - L, -a));} else if (b < L || b > R) {t_min = 1, t_max = 0;}};add_range(K, Y0, 0, H - 1);if (t_min <= t_max) ans += (t_max - t_min + 1);}} else {ll d1 = gcd(abs(dx1), abs(dy1));ll ux = dx1 / d1, uy = dy1 / d1;ll s1 = d1;                        ll s2 = (ux != 0) ? dx2 / ux : dy2 / uy;auto get_t_range = [&](ll a, ll b, ll L, ll R) -> pair<ll, ll> {ll low = LLONG_MIN, high = LLONG_MAX;if (a > 0) {low = max(low, ceil_div(L - b, a));high = min(high, floor_div(R - b, a));} else if (a < 0) {low = max(low, ceil_div(b - R, -a));high = min(high, floor_div(b - L, -a));} else if (b < L || b > R) {return {1, 0};}return {low, high};};auto [tx1, tx2] = get_t_range(ux, x0, 0, W - 1);auto [ty1, ty2] = get_t_range(uy, y0, 0, H - 1);ll t_min = max(tx1, ty1), t_max = min(tx2, ty2);if (t_min > t_max) ans = 0;else {if (s2 > 0) {      ll g = gcd(s1, s2);ll p = s1 / g, q = s2 / g;ll F = (p * q - p - q) * g;if (F < 0) F = 0;ll max_k = F / g;vector<bool> reach(max_k + 1, false);reach[0] = true;for (ll i = 0; i <= max_k; ++i) {if (reach[i]) {if (i + p <= max_k) reach[i + p] = true;if (i + q <= max_k) reach[i + q] = true;}}t_min = max(t_min, 0LL);if (t_max < 0) ans = 0;else {ll first = ceil_div(t_min, g);ll last = floor_div(t_max, g);if (first <= last) {ans = last - first + 1;ll upper = min(last, max_k);for (ll k = max(first, 0LL); k <= upper; ++k)if (!reach[k]) --ans;}}} else {      ll g = gcd(s1, -s2);ll first = ceil_div(t_min, g);ll last = floor_div(t_max, g);ans = (first <= last) ? (last - first + 1) : 0;}}}cout << "Case #" << cas << ": " << ans << "\n";}
}int main(int argc, char *argv[]){freopen(argv[1], "r", stdin);freopen(argv[2], "w", stdout);ios::sync_with_stdio(false);cin.tie(nullptr);solve();return 0;
}
http://www.jsqmd.com/news/607916/

相关文章:

  • 2026年深圳空运专业公司选购指南:3招教你省钱又省心 - 精选优质企业推荐榜
  • 重构抖音内容获取:无水印视频下载工具的技术突破与场景革命
  • 美股历史行情API接入与回测数据处理工程实践
  • 护发精油哪个牌子好?来自护发精油排行榜的答案 - 博客万
  • 长沙全居邦防水工程有限公司:岳麓区外墙防水防水补漏公司 - LYL仔仔
  • 2026.4.7 题解
  • 2026年宜昌人气餐厅盘点,说说我家小院肥鱼餐厅食材新鲜吗,选哪家? - myqiye
  • 别再花钱买底图了!用这个Python开源工具,5分钟搞定天地图/谷歌卫星影像下载与裁剪
  • 护发精油排行榜(平价篇):6款百元内好物 - 博客万
  • Vimium使用教程
  • 2026年火锅底料出口产品创新研发快的公司排名,成都前十有哪些 - 工业推荐榜
  • 糖果派对攻略
  • 2026年高端家具全案落地十大品牌权威盘点:广州深圳东莞优秀之选 - Amonic
  • 2026 年小程序五大品牌排名及解析 - 十大品牌榜
  • 2026年江门国际空运选购指南:3招教你省钱挑对高性价比货代 - 精选优质企业推荐榜
  • 2026年深圳航空运输公司选购指南:三步教你省钱又省心 - 精选优质企业推荐榜
  • 山东一卡通回收超简单!注意事项和使用技巧全揭秘 - 团团收购物卡回收
  • 2026年新疆户外移动厕所厂家推荐:景区移动厕所/工地移动厕所/雕花板移动厕所专业供应商 - 品牌推荐官
  • 2026 年会员系统五大品牌排名及解析 - 十大品牌榜
  • 宝能发电机:为工矿基建应急提供专业动力保障 - 深度智识库
  • 2026年周口加厚纸箱包装价格贵吗,靠谱品牌推荐 - myqiye
  • Ubuntu 环境下 GDB 远程调试 QNX AARCH64 程序的实战指南
  • 工业离线智能监测标杆!思正SZ-EC-10 AI边缘计算终端,破解生产异响与设备听诊全场景难题 - 品牌种草官
  • 2026 专业的柴油发电机出租服务哪家权威,应急备用电源、高功率发电机组、移动发电车厂家选择指南 - 海棠依旧大
  • 44.Acwing基础课第848题-简单-有向图的拓扑序列
  • 智能问数:表级索引 vs 表+字段二级索引方案对比总结
  • DS18B20寄生供电模式全解析:3.3V系统下的STM32省电测温方案
  • 兰州发电机组哪家强?6大本土品牌优势对比与选型指南 - 深度智识库
  • 一、先明确你的场景 你是本地已经有 GIS.Api 项目代码,要推送到这个新建的空仓库,对应页面里的「从命令行推送已经创建的仓库」模块。
  • 2026年4月实测,宁波本地top5装修设计公司排名(精装改造与高还原篇) - 疯一样的风