POJ 1974和ZOJ 2499题解
2013-09-15 14:25
453 查看
本题在poj上用了,开始一直TLE,最后用了边表才过了。
一下是AC代码:
在ZOJ上AC的代码:
这就是一个简单的排序,注意一下细节就好了。
一下是AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MAX=141072; struct EDGE{ int v; int next; }edge[MAX]; int E=0; int head[MAX]; int p[MAX][2]; int b[MAX]; void add(int s,int t){ edge[E].v=t; edge[E].next=head[s]; head[s]=E++; } int calc(int n,int L,int tag,int k){ int ans=0; E=0; memset(head,-1,sizeof(head)); for(int i=0;i<k;i++){ add(p[i][tag],p[i][1-tag]); } for(int i=1;i<=n;i++){ int len=0; for(int j=head[i];j!=-1;j=edge[j].next){ b[len++]=edge[j].v; } b[len++]=0; b[len++]=L+1; sort(b,b+len); for(int j=1;j<len;j++){ if(b[j]-b[j-1]>2) ans++; } } return ans; } int main(){ int T,m,n,k; while(~scanf("%d",&T)){ while(T--){ scanf("%d %d %d",&m,&n,&k); for(int i=0;i<k;i++){ scanf("%d %d",&p[i][0],&p[i][1]); } int ans=0; ans+=calc(m,n,0,k); ans+=calc(n,m,1,k); printf("%d\n",ans); } } return 0; }
在ZOJ上AC的代码:
这就是一个简单的排序,注意一下细节就好了。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int T,n,m,k,x[1000005],y[1000005],b[1000005]; int dealrow(){ int cnt=0,Trow=0; int mark[1000005]; int ans=0; memset(mark,0,sizeof(mark)); for(int i=0;i<k;i++){ if(mark[x[i]]==1) continue; mark[x[i]]=1; Trow++; cnt=0; b[cnt++]=y[i]; for(int j=i+1;j<k;j++){ if(x[j]==x[i]){ b[cnt++]=y[j]; } } sort(b,b+cnt); for(int j=0;j<cnt-1;j++){ if(b[j+1]-b[j]>2) {ans++;} } if(b[0]>2) {ans++;} if(b[cnt-1]<=n-2&&n>=3){ans++;} } if(n>=2) ans+=(m-Trow); return ans; } int dealcolumn(){ int cnt=0,Tcolumn=0; int mark[1000005]; int ans=0; memset(mark,0,sizeof(mark)); for(int i=0;i<k;i++){ if(mark[y[i]]==1) continue; Tcolumn++; cnt=0; b[cnt++]=x[i]; mark[y[i]]=1; for(int j=i+1;j<k;j++){ if(y[j]==y[i]){ b[cnt++]=x[j]; } } sort(b,b+cnt); for(int j=0;j<cnt-1;j++){ if(b[j+1]-b[j]>2) ans++; } if(b[0]>2) {ans++;} if(b[cnt-1]<=m-2&&m>=3) {ans++;} } if(m>=2) ans+=(n-Tcolumn); return ans; } int main(){ while(~scanf("%d",&T)){ while(T--){ scanf("%d %d %d",&m,&n,&k); for(int i=0;i<k;i++){ scanf("%d %d",&x[i],&y[i]); } int Tans=0; Tans+=dealrow(); Tans+=dealcolumn(); printf("%d\n",Tans); } } return 0; }
相关文章推荐
- zoj 1974 || poj 1940 Polygon Programming with Ease
- POJ 1287 Networking (ZOJ 1372) MST
- ZOJ-1025(POJ-1065、HDU-1051) Wooden Sticks
- POJ 1775 Sum of Factorials (ZOJ 2358)
- poj 1979 zoj 2165 Red and Black 深搜做法
- [dp问题] Poj 1014 & Zoj 1149 (Dividing) 解题报告(转)
- zoj 2488 || poj 2291 Rotten Ropes
- ZOJ 1914 Arctic Network (POJ 2349 UVA 10369) MST
- zoj 1937 || poj 2248 Addition Chains
- POJ_1562_ZOJ_1709_OilDeposits
- ZOJ 1542 poj 1861 Network(并查集+最小树)
- zoj 1718 poj 2031 Building a Space Station
- POJ 1511 Invitation Cards (ZOJ 2008) 使用优先队列的dijkstra
- zoj 1137 Girls and Boys(poj 1466)(最大独立点集)
- zoj 1942 && poj 2253 Frogger
- zoj 1519 || poj 1292 Will Indiana Jones Get There?
- zoj 1082 && poj 1125 && 南阳oj 426 Stockbroker Grapevine
- zoj 1814 || poj 1666 Candy Sharing Game
- POJ2562 UVA10035 ZOJ1874 Primary Arithmetic【进制+进位】
- ZOJ1149 POJ1014 HDU1059 Dividing,多重背包问题