您的位置:首页 > 其它

Codeforces Round #345 (Div. 2)

2016-03-08 11:55 281 查看
居然有场中国下午场次的CF,猴开心啊,于是就报名了...

结果被虐傻了...果然不能太激动啊...

A题题目翻译挂了,少了一个无解的情况,导致机房前20Min没有一个人能过A题...直到后面有高人相助才过,好惨

C题前面都开了long long,只有输出没开I64d,结果就丢了1206分...这什么鬼啊...

D题敲了20min的程序结果挂了,于是删掉重打,打到要结束了才发现题目两个东西弄反了,然后仓促改了一改...呼,然后少改一个地方,然后一堆细节的东西也有问题...表示无奈

A题:两个电池,每秒钟充电的话电量+1,不充电-2,一个<=0,就结束。问最多撑多久?

  感觉贪心就好,就是每次给电量小的+1,结果WA了!好吧,我觉得是我贪心可能有问题,于是我就打了一个大暴力,f[i][j]表示两个电池的状态,WA了!然后我放弃了,我吃饭去了...回来就有人说还有一句话你没看见。

  如果一个电池的电量=1,你必须给它充电。结果1 1输出是0...好坑啊...

O(100^3)大暴力:

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int maxn=1000010;

inline int in(){
int x=0;char ch=getchar();
while(ch>'9' || ch<'0') ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}

struct Node{
int x,y,v;
Node(){}
Node(int a,int b,int c){x=a,y=b,v=c;}
}s[maxn];

int n,m,tot;
int a[maxn],b[maxn];
int row_mx[maxn],cur_mx[maxn];
int p[maxn];

bool cmp(const Node &A,const Node &B){
return A.v<B.v;
}

inline int Find(int x){
int r=x,pre;
while(r!=p[r]) r=p[r];
while(x!=r){
pre=p[x],p[x]=r,x=pre;
}
return r;
}

int main(){
#ifndef ONLINE_JUDGE
freopen("E.in","r",stdin);
#endif

n=in();m=in();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[++tot]=in(),s[tot]=Node(i,j,a[tot]);

sort(s+1,s+tot+1,cmp);

for(int i=1;i<=tot;i++) p[i]=i;
for(int i=1;i<=tot;i++){
int x=s[i].x,y=s[i].y,v=s[i].v;
int id=(x-1)*m+y,t1=0,t2=0;

int fx=Find(row_mx[x]),fy=Find(cur_mx[y]);

if(v>a[fx]) t1++;
if(v>a[fy]) t2++;

b[id]=max(b[fx]+t1,b[fy]+t2);

if(v==a[fx]){
int f=Find(id);
if(b[f]>b[fx]) p[fx]=f;
else p[f]=fx;
}

if(v==a[fy]){
int f=Find(id);
if(b[f]>b[fy]) p[fy]=f;
else p[f]=fy;
}

row_mx[x]=cur_mx[y]=Find(id);

}

int ip=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
printf("%d ",b[Find(++ip)]);
putchar('\n');
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: