您的位置:首页 > 其它

POJ 1974和ZOJ 2499题解

2013-09-15 14:25 453 查看
本题在poj上用了,开始一直TLE,最后用了边表才过了。

一下是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: