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

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

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

2019-11-11 05:27:34
字體:
來源:轉載
供稿:網友

題目描述

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

題解

最小值最大很容易想到二分答案 二分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();
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永平县| 信阳市| 广南县| 景谷| 景德镇市| 盐津县| 桐柏县| 平定县| 泽州县| 和林格尔县| 巩义市| 凤冈县| 砚山县| 临泉县| 定边县| 澳门| 清水河县| 定西市| 灵石县| 冷水江市| 蚌埠市| 宽甸| 铜川市| 余江县| 西贡区| 淮安市| 白河县| 犍为县| 长春市| 汝南县| 漳浦县| 博乐市| 丰宁| 祁阳县| 清远市| 拜泉县| 阿克苏市| 内江市| 永德县| 正安县| 黄陵县|