ABC348F 题解

一些注意点:

  • 一看到这种题就应该往 bitset 的方向想。

  • 如果用 bitset,就应该跳脱之前的思维,尝试从最朴素的暴力重新想起。


看到这道题,发现直接做非常的不可做的样子,考虑 bitset。

我们可以先枚举左端点 l。这样,当我们枚举 j 时,对于所有的 k 使得 ak,j=al,jk(l,k) 可以多一个相等的下标。

于是考虑使用 bitset,pi,x,j 表示 ai,j 是否等于 x。然后直接异或操作即可。

/*******************************
| Author:  DE_aemmprty
| Problem: F - Oddly Similar
| Contest: AtCoder - Toyota Programming Contest 2024#4(AtCoder Beginner Contest 348)
| URL:     https://atcoder.jp/contests/abc348/tasks/abc348_f
| When:    2024-04-06 20:37:56
| 
| Memory:  1024 MB
| Time:    2000 ms
*******************************/
#include <bits/stdc++.h>
using namespace std;

long long read() {
    char c = getchar();
    long long x = 0, p = 1;
    while ((c < '0' || c > '9') && c != '-') c = getchar();
    if (c == '-') p = -1, c = getchar();
    while (c >= '0' && c <= '9')
        x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
    return x * p;
}

const int N = 2007;

long long n, m, ans;
int a[N][N];
bitset <N> s[N][1007], res;

void solve() {
    n = read(), m = read();
    for (int i = 1; i <= n; i ++) for (int j = 1; j <= m; j ++) {
        a[i][j] = read();
        s[j][a[i][j]][i - 1] = 1;
    }
    for (int i = 1; i <= n; i ++) {
        for (int j = 1; j <= n; j ++)
            res[j - 1] = 0;
        for (int j = 1; j <= m; j ++)
            res ^= s[j][a[i][j]];
        for (int j = i; j < n; j ++)
            if (res[j]) ans ++;
    }
    cout << ans;
}

signed main() {
    int t = 1;
    while (t --) solve();
    return 0;
}

作者:DE_aemmprty

出处:https://www.cnblogs.com/aemmprty/p/18118007

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   DE_aemmprty  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示