hiho 1236 Scores 五维偏序 分块+bitset优化

来源:互联网 发布:人工智能观后感5中英文 编辑:程序博客网 时间:2024/06/06 16:32

题目链接点这里

这题,,卿学姐讲的很清楚了,,传送门


#include<algorithm>#include<iostream>#include<bitset>#include<stdio.h>#include<cstring>#include<cmath>using namespace std;#define mem(x,y) memset(x,y,sizeof(x))#define FIN freopen("input.txt","r",stdin)#define fuck(x) cout<<x<<endlconst double  eps=1e-7;const int MX=50005;#define INF 0x3f3f3f3f#define INFLL 0x3f3f3f3f3f3f3f3ftypedef long long LL;typedef pair<LL,LL> PLL;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int n,m;struct Nod{    int grade,id;    bool operator <(const Nod a)const    {        return grade<a.grade;    }} arr[5][MX+5];int belong[MX+5],l[250],r[250];bitset<MX> bit[5][250];int main(){    FIN;    int T;    cin>>T;    while(T--)    {        scanf("%d%d",&n,&m);        for(int i=0; i<n; i++)        {            for(int j=0; j<5; j++)            {                scanf("%d",&arr[j][i].grade);                arr[j][i].id=i;            }        }        for(int i=0; i<5; i++)sort(arr[i],arr[i]+n);        int num,block=(int)sqrt(n+0.5);        num=(n+block-1)/block;        for(int i=0; i<5; i++)            for(int j=0; j<num; j++) bit[i][j].reset();        for(int i=0; i<n; i++)belong[i]=i/block;        for(int i=0; i<num; i++) l[i]=i*block,r[i]=i*block+block-1;        for(int i=0; i<5; i++)            for(int j=0; j<num; j++)            {                if(j)bit[i][j]|=bit[i][j-1];                for(int k=l[j]; k<=r[j]; k++)bit[i][j][arr[i][k].id]=1;            }        int pre=0,now[5],q;        scanf("%d",&q);        for(int i=1; i<=q; i++)        {            for(int j=0; j<5; j++)scanf("%d",&now[j]);            for(int j=0; j<5; j++)now[j]^=pre;            bitset<MX> b[5];            for(int j=0; j<5; j++)            {                int ll=0,rr=n-1,m;                while(ll<rr)                {                    m=((ll+rr)>>1)+1;                    if(arr[j][m].grade>now[j]) rr=m-1;                    else ll=m;                }                if(arr[j][ll].grade>now[j]) continue;                if(belong[ll]) b[j]=bit[j][belong[ll]-1];                for(int k=l[belong[ll]]; k<=ll; k++) b[j][arr[j][k].id]=1;            }            bitset<MX> ans;            ans.set();            for(int j=0; j<5; j++) ans&=b[j];            cout<<ans.count()<<endl;            pre=ans.count();        }    }    return 0;}


0 0
原创粉丝点击