栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3354 DoIt is Being Flooded

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3354 DoIt is Being Flooded

#include <cstdio>#include <queue>#include <algorithm>#include <map>using namespace std;inline int in() {char c=getchar();while (c<'0'||c>'9') c=getchar();int ans=0;while (c>='0'&&c<='9') {ans=ans*10+c-'0';c=getchar();}return ans;}const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};int n,m,p,q;int a[500][500];inline bool inBoard(int i,int j) {return i>=0&&j>=0&&i<n&&j<m;}struct QueNode {int i,j,v;QueNode() {}QueNode(int ii,int jj,int vv) {i=ii;j=jj;v=vv;}friend bool operator < (const QueNode &a,const QueNode &b) {return a.v>b.v;}};int b[500][500];QueNode d[250000];void calDis() {static priority_queue <QueNode> c;int i,j,v;for (i=0;i<n;i++)for (j=0;j<m;j++)b[i][j]=-1;while (!c.empty()) c.pop();for (i=0;i<n;i++) {b[i][0]=a[i][0];if (m!=1) b[i][m-1]=a[i][m-1];c.push(QueNode(i,0,a[i][0]));if (m!=1) c.push(QueNode(i,m-1,a[i][m-1]));}for (j=1;j<m-1;j++) {b[0][j]=a[0][j];if (n!=1) b[n-1][j]=a[n-1][j];c.push(QueNode(0,j,a[0][j]));if (n!=1) c.push(QueNode(n-1,j,a[n-1][j]));}p=0;while (!c.empty()) {QueNode x=c.top();i=x.i; j=x.j; v=x.v;c.pop();if (v==b[i][j]) {d[p++]=x;for (int k=0;k<4;k++) {int ii=i+dir[k][0],jj=j+dir[k][1];if (inBoard(ii,jj)) {int vv=max(a[ii][jj],v);if (b[ii][jj]==-1||b[ii][jj]>vv) {b[ii][jj]=vv;c.push(QueNode(ii,jj,vv));}}}}}}struct DisjoinSet {int a[250000];int n[250000];void clear(int nn) {for (int i=0;i<nn;i++) {a[i]=i;n[i]=1;}}int getSize(int i) {i=get(i);return n[i];}int get(int i) {if (a[i]==i) return i;return a[i]=get(a[i]);}void tosame(int x,int y) {x=get(x);y=get(y);if (x!=y) n[y]+=n[x];a[x]=y;}};DisjoinSet e;map<int,int> f;struct Query{int d,a,i;friend bool operator < (const Query &a,const Query &b) {return a.d>b.d;}};Query g[10000];long long ans[10000];bool upped[250000];inline void disappear(int x) {if (f[x]==1) f.erase(x);else f[x]--;}void upland(int i,int j) {int tmp=i*m+j,tmp2;upped[tmp]=true;f[1]++;for (int k=0;k<4;k++) {int ii=i+dir[k][0],jj=j+dir[k][1];if (inBoard(ii,jj)) {int tmp2=ii*m+jj;if (upped[tmp2]&&e.get(tmp)!=e.get(tmp2)) {disappear(e.getSize(tmp));disappear(e.getSize(tmp2));e.tosame(tmp,tmp2);f[e.getSize(tmp)]++;}}}}int bitn[250001];inline int calBitn(int x) {int ans=0;while (x) {ans+=x&1;x>>=1;}return ans;}long long cal(int a) {long long ans=0;for (map<int,int>::iterator it=f.begin();it!=f.end();it++)ans+=it->second*(1ll<<bitn[it->first&a]);return ans;}int main() {int i,j;for (i=0;i<=250000;i++) bitn[i]=calBitn(i);while (scanf("%d%d",&n,&m)!=EOF) {for (i=0;i<n;i++)for (j=0;j<m;j++)a[i][j]=in();calDis();for (i=0;i<p;i++) upped[i]=false;e.clear(p);f.clear();scanf("%d",&q);for (i=0;i<q;i++) {scanf("%d%d",&g[i].d,&g[i].a);g[i].i=i;}sort(g,g+q);p--;for (i=0;i<q;i++) {while (p>=0&&d[p].v>g[i].d) {upland(d[p].i,d[p].j);p--;}ans[g[i].i]=cal(g[i].a);}for (i=0;i<q;i++) {printf("%lldn",ans[i]);}}return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/372462.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号