首页 > 其他 > 详细

[cf878D]Magic Breeding

时间:2019-11-06 14:33:28      阅读:94      评论:0      收藏:0      [点我收藏+]

对于每一行,用一个2^12个01来表示,其中这一行就是其中所有为1的点所代表的行(i二进制中包含的行)的max的min,然后就可以支持取max和min了,查询只需要枚举答案即可

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 100005
 4 bitset<5005>f[N];
 5 int n,m,q,p,x,y,a[21][N],id[N][21];
 6 bool cmp(int x,int y){
 7     return a[x][p]>a[y][p];
 8 }
 9 int main(){
10     scanf("%d%d%d",&m,&n,&q);
11     for(int i=1;i<=n;i++)
12         for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);
13     for(int i=1;i<=m;i++){
14         for(int j=1;j<=n;j++)id[i][j]=j;
15         p=i;
16         sort(id[i]+1,id[i]+n+1,cmp);
17     }
18     for(int i=1;i<=n;i++)
19         for(int j=0;j<(1<<n);j++)
20             if (j&(1<<i-1))f[i][j]=1;
21     for(int i=1;i<=q;i++){
22         scanf("%d%d%d",&p,&x,&y);
23         if (p==1)f[++n]=(f[x]|f[y]);
24         if (p==2)f[++n]=(f[x]&f[y]);
25         if (p==3){
26             int t=0;
27             for(int j=1;j<=n;j++){
28                 t|=(1<<id[y][j]-1);
29                 if (f[x][t]){
30                     printf("%d\n",a[id[y][j]][y]);
31                     break;
32                 }
33             }
34         }
35     }
36 }
View Code

 

[cf878D]Magic Breeding

原文:https://www.cnblogs.com/PYWBKTDA/p/11804551.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!