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

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

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

2019-11-11 04:40:00
字體:
來源:轉載
供稿:網友

題目描述

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

題解

最小值最大很容易想到二分答案 二分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();
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿瓦提县| 永兴县| 海晏县| 文水县| 钟祥市| 休宁县| 防城港市| 沙坪坝区| 怀来县| 贡嘎县| 手游| 东兰县| 饶阳县| 黄石市| 清徐县| 东丽区| 贡嘎县| 樟树市| 武安市| 盐源县| 九江县| 海宁市| 栾城县| 克东县| 屏东县| 安吉县| 遂溪县| 娱乐| 西宁市| 凉城县| 开化县| 杭州市| 抚顺市| 鄂托克前旗| 阿拉尔市| 临夏市| 始兴县| 布尔津县| 绥滨县| 渑池县| 五华县|