国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

[校內互測]最大(二分+線段樹||bitset)

2019-11-11 04:01:08
字體:
來源:轉載
供稿:網友

題目描述

這里寫圖片描述 這里寫圖片描述

題解

最小值最大很容易想到二分答案 二分mid之后,將所有大于等于mid的點留下,判斷是否能組成一個矩形 判斷的時候可以將滿足條件的置1,其余置0,然后將每兩行做與運算,判斷結果中是否有大于2個1 用bitset比較方便,但是非常慢,不過這題的時限比較寬,大概是可以卡時的 也可以30或60壓位然后利用lowbit查詢,只需查詢2個lowbit就可以了 不過我用了一個比較傻但是比較穩定的方法,就是類似于線段樹的合并,用動態開點搞出來n棵線段樹,然后兩兩合并時判斷,時間大概是logn的 時間復雜度O(log231nmlogn)

代碼

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 1005int n,m,Max,sz,cnt,ans;int squ[N][N];int root[N],sum[N*N*20],ls[N*N*20],rs[N*N*20];void insert(int &now,int l,int r,int x){ int mid=(l+r)>>1; if (!now) now=++sz; ++sum[now]; if (l==r) return; if (x<=mid) insert(ls[now],l,mid,x); else insert(rs[now],mid+1,r,x);}void merge(int x,int y,int l,int r){ int mid=(l+r)>>1; if (!x||!y) return; if (l==r) { if (sum[x]+sum[y]==2) ++cnt; return; } merge(ls[x],ls[y],l,mid); merge(rs[x],rs[y],mid+1,r);}bool check(int mid){ sz=0; memset(root,0,sizeof(root)); memset(sum,0,sizeof(sum)); memset(ls,0,sizeof(ls)); memset(rs,0,sizeof(rs)); for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) if (squ[i][j]>=mid) insert(root[i],1,m,j); for (int i=1;i<=n;++i) for (int j=i+1;j<=n;++j) { cnt=0; merge(root[i],root[j],1,m); if (cnt>=2) return 1; } return 0;}int find(){ int l=0,r=Max,mid,ans=0; while (l<=r) { mid=(l+r)>>1; if (check(mid)) ans=mid,l=mid+1; else r=mid-1; } return ans;}int main(){ freopen("max.in","r",stdin); freopen("max.out","w",stdout); scanf("%d%d",&n,&m); for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) { scanf("%d",&squ[i][j]); Max=max(Max,squ[i][j]); } ans=find();
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镇安县| 双鸭山市| 乌兰县| 从化市| 新龙县| 泰安市| 吴旗县| 绥中县| 怀安县| 霍山县| 咸宁市| 安阳县| 施秉县| 女性| 环江| 庄河市| 额敏县| 马尔康县| 青岛市| 涡阳县| 惠东县| 林芝县| 长葛市| 大渡口区| 桐庐县| 宁德市| 周口市| 滁州市| 太湖县| 汉中市| 金乡县| 南丰县| 广安市| 濮阳市| 定州市| 合阳县| 赤水市| 枣阳市| 石楼县| 铁力市| 广灵县|