题目
https://www.luogu.org/problemnew/show/P1169
思路
首先是对于图上所有的棋盘一定属于以下两种类型:
- 黑格行列奇偶性相同,白格不同
- 白格行列奇偶性相同,黑格不同
那么在输入的时候属于第一种情况的赋1,属于第二种情况的赋0
统计最大的1或0矩形和正方形就可以啦。
代码
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#define maxn 504561
using namespace std;
int list[maxn*2],n,m,s,cnt;
long long a[maxn*2],ans;
struct E
{
int to,next,val;
}e[maxn*2];
void add(int u,int v,int val)
{
e[++cnt].next=list[u]; e[cnt].to=v; e[cnt].val=val; list[u]=cnt;
}
void dfs(int u,int fa)
{
int cnt=0;
for(int i=list[u];i!=0;i=e[i].next)
{
int v=e[i].to;
if(v!=fa)
{
dfs(v,u);
if(a[v]+e[i].val>a[u])
{
ans+=(a[v]+e[i].val-a[u])*cnt;
cnt++;
a[u]=a[v]+e[i].val;
}
else
{
ans+=a[u]-a[v]-e[i].val;
cnt++;
}
}
}
}
int main()
{
scanf("%d%d",&n,&s);
for(int i=1;i<n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
dfs(s,0);
printf("%lld",ans);
}