前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HihoCoder#1509 : 异或排序(二进制)

HihoCoder#1509 : 异或排序(二进制)

作者头像
attack
发布2018-10-11 16:05:09
3630
发布2018-10-11 16:05:09
举报

题意

题目链接

Sol

挺简单的吧。考虑两个元素什么时候不满足条件

设\(a_i\)与\(a_i + 1\)最高的不同位分别为0 1,显然\(S\)的这一位必须为\(0\),否则这一位必须为\(1\)

剩下的就没有限制条件了

时间复杂度:\(nlogn\)??????!!!!!!

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 30001;
inline int read() {
    int x = 0, f = 1; char c = getchar();
    while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
    while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int N, a[5][MAXN], rak[5][MAXN], base = 1;
bitset<MAXN> B[5][175];
main() {
    N = read(); base = sqrt(N);
    for (int i = 1; i <= N; i++) for (int j = 0; j < 5; j++) a[j][i] = read(), rak[j][a[j][i]] = i;
    for (int j = 0; j < 5; j++) 
        for (int i = 1; i * base <= N; i++) 
            for(int k = 1; k <= i * base; k++) B[j][i].set(rak[j][k]);  
    for (int i = 1; i <= N; i++) {
        bitset<MAXN> tmp, cal; tmp.set();
        for(int j = 0; j < 5; j++) {
            cal.reset();
            int now = a[j][i] / base;
            cal |= B[j][now];
            for(int k = now * base + 1; k <= a[j][i]; k++) cal.set(rak[j][k]); 
            tmp &= cal;
        }
        printf("%d\n", tmp.count() - 1);
    }
}  
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
  • Sol
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档