对拍方法

news/2025/2/10 18:42:18/文章来源:https://www.cnblogs.com/YuYuanPQ/p/18708561

对拍很简单,原理是:比较 \(2\) 个代码的输出,也就是用暴力代码检查你的代码的正确性。而只需要你记住程序怎么打就行。

对拍的程序有 \(4\) 个:

  • my.cpp:你的程序。通常是不确定是否切题的时候,再决定打对拍(做接下来的事)。
  • bl.cpp:暴力程序。一般情况下,造数据时要考虑到其时间复杂度。而且,如果暴力的时间复杂度过高(如指数级别),有可能整场比赛结束了都跑不完,这个时候就不要打对拍了。
  • data.exe:用来造数据的,具体情况视题目而定。最好是记常用的方法:比如造树、图等。
  • checker.exe:用来自动运行前 \(3\) 个程序,并比较你的程序和暴力程序的输出。

顺便提一嘴,你的程序都要加文操,方便 \(\text{checker}\) 自动运行程序。

以 P3178 [HAOI2015] 树上操作 为例。

my.cpp

// 对拍方法(正解)
#include<bits/stdc++.h>typedef int IT;
typedef long long LL;
typedef __int128 int128;
typedef double DB;
typedef long double LDB;#define pb push_back
#define fst first
#define sec second
#define psh push
#define mkp make_pair
#define PII pair<IT,IT>
#define PLI pair<LL,IT>
#define lowbit(x) ((x)&(-x))
using namespace std;const int N=1e5+10,ES=N<<1;int n,m;
int a[N];int ecnt,head[N],nxt[ES],to[ES];
void add(int x,int y){nxt[++ecnt]=head[x];head[x]=ecnt;to[ecnt]=y;return;
}int dep[N],siz[N],fa[N],son[N];
void dfs1(int x,int fth){dep[x]=dep[fth]+1;siz[x]=1;fa[x]=fth;for(int i=head[x];i;i=nxt[i]){int y=to[i];if(y==fth) continue;dfs1(y,x);siz[x]+=siz[y];if(siz[y]>siz[son[x]])son[x]=y;}
}
int top[N];
int id[N],idx;
int newa[N];
void dfs2(int x,int ntop){top[x]=ntop;id[x]=++idx;newa[idx]=a[x];if(!son[x]) return;dfs2(son[x],ntop);for(int i=head[x];i;i=nxt[i]){int y=to[i];if(y!=fa[x]&&y!=son[x])dfs2(y,y);}
}struct Seg_Tree{LL sum;LL tag;
}t[N<<2];
void pushup(int rt){t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum;return;
}
void downtag(int rt,int l,int r,LL v){t[rt].sum+=(r-l+1)*v;t[rt].tag+=v;return;
}
void pushdown(int rt,int l,int r){if(t[rt].tag){int mid=(l+r)>>1;downtag(rt<<1,l,mid,t[rt].tag);downtag(rt<<1|1,mid+1,r,t[rt].tag);t[rt].tag=0;}
}
void build(int rt,int l,int r){if(l==r){t[rt].sum=newa[l];return;}int mid=(l+r)>>1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);pushup(rt);return;
}
void modify(int rt,int l,int r,int ml,int mr,LL v){if(r<ml||mr<l) return;if(ml<=l&&r<=mr){downtag(rt,l,r,v);return;}pushdown(rt,l,r);int mid=(l+r)>>1;modify(rt<<1,l,mid,ml,mr,v);modify(rt<<1|1,mid+1,r,ml,mr,v);pushup(rt);return;
}
LL query(int rt,int l,int r,int ql,int qr){if(r<ql||qr<l) return 0;if(ql<=l&&r<=qr) return t[rt].sum;pushdown(rt,l,r);int mid=(l+r)>>1;return query(rt<<1,l,mid,ql,qr)+query(rt<<1|1,mid+1,r,ql,qr);
}LL SP_query(int x,int y){LL ans=0;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);ans+=query(1,1,n,id[top[x]],id[x]);x=fa[top[x]];}if(dep[x]>dep[y]) swap(x,y);ans+=query(1,1,n,id[x],id[y]);return ans;
}int main(){freopen("data.in","r",stdin);freopen("my.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);add(u,v),add(v,u);}dfs1(1,0);dfs2(1,1);build(1,1,n);for(int i=1;i<=m;i++){int opt,x,a;scanf("%d",&opt);if(opt==1){scanf("%d%d",&x,&a);modify(1,1,n,id[x],id[x],a);}else if(opt==2){scanf("%d%d",&x,&a);modify(1,1,n,id[x],id[x]+siz[x]-1,a);}else if(opt==3){scanf("%d",&x);printf("%lld\n",SP_query(1,x));}}return 0;
}

bl.cpp

// 对拍方法(暴力)
#include<bits/stdc++.h>typedef int IT;
typedef long long LL;
typedef __int128 int128;
typedef double DB;
typedef long double LDB;#define pb push_back
#define fst first
#define sec second
#define psh push
#define mkp make_pair
#define PII pair<IT,IT>
#define PLI pair<LL,IT>
#define lowbit(x) ((x)&(-x))
using namespace std;const int N=1e5+10,ES=N<<1;int n,m;
int a[N];int ecnt,head[N],nxt[ES],to[ES];
void add(int x,int y){nxt[++ecnt]=head[x];head[x]=ecnt;to[ecnt]=y;return;
}int dep[N],siz[N],fa[N];
int id[N],idx;
void dfs(int x,int fth){dep[x]=dep[fth]+1;siz[x]=1;fa[x]=fth;id[x]=++idx;for(int i=head[x];i;i=nxt[i]){int y=to[i];if(y==fth) continue;dfs(y,x);siz[x]+=siz[y];}
}LL d[N];int main(){freopen("data.in","r",stdin);freopen("bl.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);add(u,v),add(v,u);}dfs(1,0);for(int i=1;i<=n;i++) d[id[i]]=a[i];for(int i=1;i<=m;i++){int opt,x,y;scanf("%d",&opt);if(opt==1){scanf("%d%d",&x,&y);d[id[x]]+=y;}else if(opt==2){scanf("%d%d",&x,&y);for(int i=id[x];i<=id[x]+siz[x]-1;i++)d[i]+=y;}else if(opt==3){scanf("%d",&x);int t=x;LL ans=0;while(t!=1){ans+=d[id[t]];t=fa[t];}ans+=d[1];printf("%lld\n",ans);}}return 0;
}

data.cpp

// 对拍方法(造数据)
#include<bits/stdc++.h>typedef int IT;
typedef long long LL;
typedef __int128 int128;
typedef double DB;
typedef long double LDB;#define pb push_back
#define fst first
#define sec second
#define psh push
#define mkp make_pair
#define PII pair<IT,IT>
#define PLI pair<LL,IT>
#define lowbit(x) ((x)&(-x))
using namespace std;const int N=2e5+10;int n,m;int fa[N];
int findfa(int x){return fa[x]==x?x:fa[x]=findfa(fa[x]);}struct edge{int u,v;
}e[N];
int ord[N];int main(){srand((int)(time(0)));freopen("data.in","w",stdout);n=10;m=10000;printf("%d %d\n",n,m);for(int i=1;i<=n;i++){int x=rand()%IT(1e6)+1;printf("%d ",x);}putchar('\n');// for(int i=2;i<=n;i++){//     e[i].u=i;//     e[i].v=rand()%(i-1)+1;// }// for(int i=1;i<n;i++) ord[i]=i+1;// random_shuffle(ord+1,ord+n);// for(int i=n;i>=2;i--) ord[i]=ord[i-1];// for(int i=2;i<=n;i++){//     printf("%d %d\n",e[ord[i]].u,e[ord[i]].v);// }for(int i=1;i<=n;i++) fa[i]=i;int i=1;while(i<=n-1){int x=rand()%n+1,y=rand()%n+1;while(x==y) y=rand()%n+1;int p=findfa(x),q=findfa(y);if(p!=q){fa[p]=q;i++;printf("%d %d\n",x,y);}}int R=1e6+1e6+1;for(int i=1;i<=m;i++){int opt,x,a;opt=rand()%3+1;printf("%d ",opt);x=rand()%n+1;a=rand()%R;a-=1e6;if(opt==1|opt==2){printf("%d %d\n",x,a);}else if(opt==3) printf("%d\n",x);}return 0;
}

checker.cpp

// 对拍方法(checker)
#include<bits/stdc++.h>typedef int IT;
typedef long long LL;
typedef __int128 int128;
typedef double DB;
typedef long double LDB;#define pb push_back
#define fst first
#define sec second
#define psh push
#define mkp make_pair
#define PII pair<IT,IT>
#define PLI pair<LL,IT>
#define lowbit(x) ((x)&(-x))
using namespace std;const int N=2e5+10;DB st,ed,mt;int main(){for(int t=1;t<=500;t++){printf("Task %d:\n",t);printf("Generating the data.\n");system("data.exe");printf("Running bl.cpp program...\n");st=clock();system("bl.exe");ed=clock();mt=(ed-st)/1e3;printf("It used %.3lf s.\n",mt);printf("Running my.cpp program...\n");st=clock();system("my.exe");ed=clock();mt=(ed-st)/1e3;printf("You used %.3lf s.\n",mt);if(mt>1){printf("TLE!\n");return 0;}if(!system("fc my.out bl.out")) printf("AC!\n\n");else{printf("WA!\n");return 0;}}printf("Congratulations!\n");return 0;
}

(提醒一下同机房的同学:你可以对着打,但不要直接复制)

对拍是个好东西,如果记住了,有时能在考场上发挥大作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881794.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

男人八题-点分治-Acwing252.树

Acwing252.树题目分析 树中的路径分为三种路径两端在同一个子树 路径两端在不同子树 路径有一端是重心因此可以分情况处理, 对于第一种情况可以进行递归处理, 第二种情况需要使用容斥原理求得(下面重点介绍), 第三种情况枚举重心到其他节点的路径就可以求得 代码分析 求子树大小…

【验证码逆向专栏】最新某验四代动态参数逆向详解

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术…

DeepSeek:AI界的“东方海啸”

嘿,大家有没有听说过DeepSeek?这个AI界的新星正在掀起一场“东方海啸”!让我们一起来看看它是如何改变游戏规则的。 一、技术革新:从参数到生态 想象一下,一个AI模型的参数从2360亿飙升到6710亿,训练成本却只有557.6万美元!这就是DeepSeek的魔力。你觉得这有多疯狂? 他…

007 数组扩展_新增方法

1、Array.from()Array.from方法用于将数组转为真正的数组温馨提示:常见的类数组有三类:①arguments②元素集合③类似数组的对象①argumentsfunction add(){let collect =Array.from(arguments);collect.push(40);console.log(collect);}add(10,20,30)②元素集合let divs=docu…

360度绩效考核法实例分析

某公司打算在2025年的上半年引进360度绩效考核体系,于是公司管理者就命令人力资源部制定出相应的考核体系实施方案。人力资源部根据360度绩效考核体系实施要点,并结合本公司内部实际情况,制定出了一套适用于本公司的360度绩效考核体系,具体内容如下: (一)确定考核队伍 考…

idea 远程断点

jar启动命令添加以下命令 0.0.0.0:端口号 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005idea中新增远程jvm调试

Star 4w+,Apache Dubbo 3.3 全新发布,Triple X 领衔,开启微服务通信新时代

在 Apache Dubbo 突破 4w Star 之际,Apache Dubbo 团队正式宣布,Dubbo 3.3 正式发布!作为全球领先的开源微服务框架,Dubbo 一直致力于为开发者提供高性能、可扩展且灵活的分布式服务解决方案。此次发布的 Dubbo 3.3,通过 Triple X 的全新升级,突破了以往局限,实现了对南…

1次搞懂大模型备案被驳回原因!

大模型备案被驳回的原因一、语料安全不合规 1、语料来源未合法授权 语料需确保来源合法,包括开源协议、商业授权或自采数据的合规性。若语料中包含未授权的版权内容(如使用他人知识产权作品作为训练数据),或涉及未获授权的个人信息,将直接导致备案被驳回。 示例:某企业因…

内外网安全文件交换系统:突破网络屏障,筑牢数据安全防线

内外网安全文件交换系统:突破网络屏障,筑牢数据安全防线在数字化浪潮蓬勃发展的当下,企业对于数据安全保障以及高效文件传输机制的需求日益凸显。特别是在内外网实施物理隔离的网络架构下,如何达成安全、便捷的文件交换操作,已然成为众多企业亟待攻克的关键难题。本内外网…

利用排列序列提升游戏动画的真实感

在游戏开发中,我们经常需要处理重复的动画序列,以增加游戏的真实感。例如,在海战游戏中,我们可能会有一组军舰停泊在港湾,它们的桅杆或甲板时不时地需要摇晃,以模拟海风的影响。实现这种效果有多种方法,例如完全随机选择某艘军舰播放动画,或者按照固定的顺序依次播放。…

最小表示(字符串和树)学习笔记

字符串的最小表示法 由来 字符串有时需要进行“旋转”,即一个一个把尾部元素放到前面。那么,我们怎么知道一个字符串是不是另一个字符串旋转过来的呢? 我们发现,这种旋转其实相当于把字符串首尾相接成环,然后取不同的起点重新组成字符串。在这些能够组成的字符串中,字典序…

破解风电远程监控难题:EtherNet/IP转Modbus TCP配置大揭秘

EtherNet/IP转Modbus TCP在新能源风力发电场远程监控与数据分析的配置案例一、案例背景 在风力发电场的中控室安装捷米特JM-EIPM-TCP网关,连接到风电场的局域网。确保风力发电机组的控制系统、变流器等采用 MODBUS TCP 协议的设备以及基于 EtherNet/IP 协议的远程监控系统和数…