2022/5/12
Posted 钟钟终
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022/5/12相关的知识,希望对你有一定的参考价值。
农田划分
2的n次方比2的1到n-1
的累加和都要大2,因此只需要把2的n次方给大儿子就行;其他的都给小儿子,凡是祖先是n-1
的土地都分给A
代码还是有个小问题,如果并查集的祖先没合并到n-1,合并到其他点去了,就错了。
#include<bitsdc++.h>
#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;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
int u,v;cin>>u>>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<=n;i++)
if(r_find(i)==n-1)
printf("B");
else printf("A");
printf("\\n");
return 0;
C. Tokitsukaze and Strange Inequality
这道C题做了好久,应该是我做到的最难的C题了。
看了队友的代码,思路:
1.开辟数组s1[i][j]
,表示在j以后比a[i]
小的数,利用的是前缀和的思想。
2.开辟数组s2[i][j]
,表示1~i这段区间中分别比a[j]
大的累加和,节省一重循环。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e3+5;
int n,a[N],s1[N][N],s2[N][N];
ll ans;
int main()
int t;cin>>t;
while(t--)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
s1[i][j]=s2[i][j]=0;
ans=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>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<=n;i++)
for(int j=i+1;j<=n;j++)
s2[i][j]=s2[i-1][j]+s1[i][j];
for(int i=1;i<=n;i++)
for(int j=i+2;j<=n;j++)
if(a[i]<a[j])
ans+=s2[j-1][j+1]-s2[i][j+1];
cout<<ans<<endl;
return 0;
Ehab and Path-etic MEXs
保证任意两点间没出现得整数最小,此时会出现两种情况:第一种点的最大度数为2,此时是一条链,没出现过的最小整数为n-1;另一种情况最大度数为3,将第一条度数为3的顶点所连的三条连标记为0,1,2.此时任意两个点都不超过2.
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5;
int n,ans[N],cnt;
vector<int>g[N];
int main()
cin>>n;
for(int i=1;i<n;i++)
int u,v;cin>>u>>v;
g[u].push_back(i);
g[v].push_back(i);
ans[i]=-1;
for(int i=1;i<=n;i++)
if(g[i].size()>2)
for(int x:g[i])
if(ans[x]==-1) ans[x]=cnt++;
break;
for(int i=1;i<n;i++)
if(ans[i]==-1)
ans[i]=cnt++;
for(int i=1;i<n;i++)
cout<<ans[i]<<endl;
return 0;
以上是关于2022/5/12的主要内容,如果未能解决你的问题,请参考以下文章