Logo __vector__ 的博客

博客

Codeforces Round 886 (Div. 4) 全部题目题解

...
__vector__
2025-12-01 12:55:54

本文章由 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;
}
  

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。