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的主要内容,如果未能解决你的问题,请参考以下文章

LCA

倍增——LCA

LCA最近公共祖先在线离线

创建二叉树非递归完成对二叉树的先序和后序遍历并遍历输出每一层的结点数查找结点P 和结点Q的最近共同祖先

LCA模板

历代祖先是不是包括女性祖先?