[五维偏序 分块 bitset] HihoCoder #1236 2015北京网络赛 J Scores

题目链接:http://hihocoder.com/problemset/problem/1236?sid=873407


求五维偏序,强制在线

b[i][j]表示第i维前j块的状态


#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<bitset>
#include<cmath>
#define dprintf(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
typedef pair<int,int> abcd;

inline char nc(){
  static char buf[100000],*p1=buf,*p2=buf;
  if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
  return *p1++;
}

inline void read(int &x){
  char c=nc(),b=1;
  for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
  for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}

const int N=50005;

bitset<N> b[7][250],ans[7];

int n,B,m;
int cnt,pos[N],l[250],r[250];
abcd a[7][N];

void P(bitset<N> &b){
  for (int i=1;i<=n;i++)
    dprintf("%d",b.test(i));
  dprintf("\n");
}

int main(){
  int T,Q,tem,iter,lastans;
  freopen("t.in","r",stdin);
  freopen("t.out","w",stdout);
  read(T);
  while (T--){
    read(n); read(m);
    for (int i=1;i<=n;i++)
      for (int j=1;j<=5;j++){
	read(tem);
	a[j][i].first=tem;
	a[j][i].second=i;
      }
    for (int j=1;j<=5;j++) sort(a[j]+1,a[j]+n+1);
    int B=sqrt(n);
    for (int i=1;i<=n;i++)
      pos[i]=(i-1)/B+1;
    cnt=pos[n];
    for (int i=1;i<=cnt;i++)
      l[i]=(i-1)*B+1,r[i]=i*B;
    r[cnt]=n;
    for (int j=1;j<=5;j++)
      for (int i=1;i<=cnt;i++){
	b[j][i]=b[j][i-1];
	for (int k=l[i];k<=r[i];k++)
	  b[j][i][a[j][k].second]=1;
      }
    read(Q);
    lastans=0;
    while (Q--){
      for (int j=1;j<=5;j++){
	read(tem); tem^=lastans;
	iter=upper_bound(a[j]+1,a[j]+n+1,abcd(tem,1<<30))-a[j]-1;
	ans[j]=b[j][pos[iter]-1];
	for (int i=l[pos[iter]];i<=iter;i++)
	  ans[j][a[j][i].second]=1;
      }
      printf("%d\n",lastans=(ans[1]&ans[2]&ans[3]&ans[4]&ans[5]).count());
    }
  }
  return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值