农田划分 2的n次方比2的1到n-1
的累加和都要大2,因此只需要把2的n次方给大儿子就行;其他的都给小儿子,凡是祖先是n-1
的土地都分给A
代码还是有个小问题,如果并查集的祖先没合并到n-1,合并到其他点去了,就错了。
#include
#define ll long long
using namespace std;
const int N=1e6+5;
int n,m,f[N];
bool vis[N];
int r_find(int r)
{
if(f[r]==r)
return f[r];
f[r]=r_find(f[r]);
return f[r];
}
int main()
{
cin>>n>>m;
for(int i=1;iu>>v;
if(u!=n&&v!=n)
{
int fx=r_find(u),fy=r_find(v);
if(fx==fy)
continue;
f[fx]=fy;
}
}
for(int i=1;i>t;
while(t--)
{
for(int i=1;in;
for(int i=1;i>a[i];
//此处体现和dp的区别,每一个i都没用到上一次i的记录
//因此只是前缀和
for(int i=n;i>=1;i--)
for(int j=n;j>i;j--)
{
if(a[i]>a[j])
s1[i][j]=s1[i][j+1]+1;
else s1[i][j]=s1[i][j+1];
}
for(int i=1;i
关注
打赏