记录编号 388155 评测结果 AAAAAAAAAA
题目名称 [HZOI 2015] 偏序++ 最终得分 100
用户昵称 Gravatar哒哒哒哒哒! 是否通过 通过
代码语言 C++ 运行时间 4.192 s
提交时间 2017-03-28 18:34:38 内存使用 9.32 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <bitset>
#include <algorithm>
using namespace std;
#define ll long long 
int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
	return x*f;
}
#define bit bitset<40001>
const int maxn=40005;
int n,k,size,block[maxn];

struct Bitset{
	int a[maxn],lis[maxn];
	bit B[201];
	bit get(int p){
		p=a[p];
		int bp=block[p];
		bit ans=B[bp-1];
		for(int i=(bp-1)*size+1;i<p;i++)
			ans.set(lis[i]);
		return ans;
	}
}d[7];
void build(int op){
	for(int i=1;i<=n;i++)
		d[op].lis[d[op].a[i]]=i;
	bit t;t.reset();
	for(int i=1;i<=n;i++){
		t.set(d[op].lis[i]);
		if(i%size==0) d[op].B[i/size]=t;
	}
}
int main(){
	freopen("partial_order_plus.in","r",stdin);
	freopen("partial_order_plus.out","w",stdout);
	n=read(),k=read(),size=sqrt(n);
	
	for(int i=1;i<=n;i++) block[i]=(i-1)/size+1;

	for(int i=1;i<=n;i++) d[0].a[i]=i;
	for(int i=1;i<=k;i++)
		for(int j=1;j<=n;j++) d[i].a[j]=read();
	for(int i=0;i<=k;i++) build(i);

	int ans=0;
	for(int i=1;i<=n;i++){
		bit t=d[0].get(i);
		for(int j=1;j<=k;j++)t&=d[j].get(i);
		ans+=t.count();
	}
	printf("%d\n",ans);
	fclose(stdin);fclose(stdout);
	return 0;
}