本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2023-07-22 01:48:23
H 题赛时就差一行代码就过了,我该用什么描述我的心情。
A
a+b problem
B
排序板子题
C
字符串入门题。
D
显然剩下的子序列在原序列一定是连续的。
E
二分模板题。
F
对于每个数,枚举它的倍数就行了。
注意判断重复数字。
另外,对于只判断是否为 $1$ 的,能被这个 hack 卡成 TLE,我叉了 4 个人:
#include <bits\/stdc++.h>
using namespace std;
int n=2e5;
int main()
{
printf("%d\n",1);
printf("%d\n",n);
for(int i=1;i<n;i++)printf("%d ",2);
printf("2\n");
return 0;
}
G
同一行,同一列,同左下右上对角线,同左上右下对角线。
map 统计一下就行了吧。
另外如果用了 map.count,可以被 hack 到 TLE。
H
根据给定的边跑 dfs。
赛时我挂掉的原因是正反边都应该加上,而我只加了一条。
Pretests passed 代码:
#include <bits\/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define REP(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back()
#define mkpr make_pair
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
int t;
const int maxn=2e5+5;
int n,m;
int head[maxn];
struct EDGE
{
int to,nxt;
ll val;
}edge[maxn*2];
int cnt;
void add(int u,int to,ll val)
{
edge[++cnt].to=to;
edge[cnt].val=val;
edge[cnt].nxt=head[u];
head[u]=cnt;
}
int tag[maxn];
ll dis[maxn];
ll du[maxn];
bool no=0;
void dfs(int u,ll val,int _tag)
{
\/\/ printf("u = %d\n",u);
if(tag[u]!=0&&tag[u]!=_tag)return;
tag[u]=_tag;
if(no)return;
if(dis[u]!=1e18)
{
if(dis[u]!=val)no=1;
return;
}
dis[u]=val;
\/\/ printf("dis[%d] = %lld\n",u,dis[u]);
for(int i=head[u];i;i=edge[i].nxt)
{
int to=edge[i].to;
\/\/ printf("%d\n",to);
dfs(to,dis[u]+edge[i].val,_tag);
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
FOR(i,1,m)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,-c);
}
FOR(i,1,n)dis[i]=1e18;
FOR(i,1,n)
{
if(dis[i]==1e18)
{
dfs(i,0,i);
}
}
if(no)puts("NO");
else puts("YES");
FOR(i,1,n)
{
head[i]=0;
du[i]=0;
tag[i]=0;
}
no=0;
cnt=0;
}
return 0;
}

鲁ICP备2025150228号