結果
| 問題 |
No.421 しろくろチョコレート
|
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2024-12-22 16:52:06 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,182 bytes |
| コンパイル時間 | 2,258 ms |
| コンパイル使用メモリ | 177,288 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-22 16:53:02 |
| 合計ジャッジ時間 | 3,799 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 43 WA * 22 |
ソースコード
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int to,next;
}a[200010];
int head[200010],in[10010],cnt,ans,x,y;
bool f[10010];
char c[1010][1010];
queue<int> q;
priority_queue<pair<int,int> > que;
void add(int u,int v)
{
a[++cnt].to=v;
a[cnt].next=head[u];
head[u]=cnt;
}
void add_edge(int u,int v)
{
in[u]++;
in[v]++;
//cout<<u<<" "<<v<<endl;
add(u,v);
add(v,u);
}
void clear(int x)
{
for(int i=head[x];i;i=a[i].next)
{
int v=a[i].to;
if(in[v]!=0)
in[v]--;
if(in[v]==1)
q.push(v);
}
}
void pop(int x)
{
for(int i=head[x];i;i=a[i].next)
{
int v=a[i].to;
if(in[v]!=0)
in[v]--;
if(in[v]!=0)
que.push({-in[v],v});
}
}
signed main()
{
int n,m,k;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>c[i][j];
if(c[i][j]=='w')
x++;
else if(c[i][j]=='b')
y++;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(i+1<=n&&c[i+1][j]!='.'&&c[i][j]!='.'&&c[i+1][j]!=c[i][j])
add_edge((i-1)*m+j,i*m+j);//,cout<<i<<" "<<j<<" "<<i+1<<" "<<j<<" "<<(i-1)*n+j<<" "<<i*n+j<<endl;
if(j+1<=m&&c[i][j+1]!='.'&&c[i][j]!='.'&&c[i][j]!=c[i][j+1])
add_edge((i-1)*m+j,(i-1)*m+j+1);//,cout<<i<<" "<<j<<" "<<i<<" "<<j+1<<" "<<(i-1)*n+j<<" "<<(i-1)*n+j+1<<endl;
}
}
for(int i=1;i<=n*m;i++)
{
if(in[i]==1)
q.push(i);
}
while(!q.empty())
{
int u=q.front();
q.pop();
if(!in[u])
continue;
for(int i=head[u];i;i=a[i].next)
{
int v=a[i].to;
if(!in[v])
continue;
in[u]=in[v]=0;
clear(u);
clear(v);
ans+=100;
x--;
y--;
break;
}
//cout<<ans<<" "<<x<<" "<<y<<endl;
}
for(int i=1;i<=n*m;i++)
{
if(in[i]>1)
{
que.push({0,i});
while(!que.empty())
{
int u=que.top().second;
que.pop();
if(!in[u])
continue;
for(int i=head[u];i;i=a[i].next)
{
int v=a[i].to;
//cout<<i<<" "<<u<<" "<<v<<endl;
if(!in[v])
continue;
in[v]=in[u]=0;
pop(u);
pop(v);
ans+=100;
x--;
y--;
break;
}
//cout<<ans<<" "<<x<<" "<<y<<endl;
}
}
}
//cout<<min(x,y)<<" "<<max(x,y)<<endl;
ans+=min(x,y)*10+max(x,y)-min(x,y);
cout<<ans<<endl;
return 0;
}
vjudge1