码蹄集部分题目(2024OJ赛7.31-8.4;树状数组+并查集)

1🐋🐋奇偶性(星耀;树状数组)

时间限制:1秒

占用内存:128M

🐟题目思路

【MT3059 奇偶性】MT3059 奇偶性_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=1e5+7;
int a[N],tmp[N],c[N],n,m,l,r;
long long ans;
//树状数组模板
int lb(int x) { return x & -x; }
void update(int i,int x)
{
    for(;i<=n;i+=lb(i)) c[i]+=x;
}
int sum(int i)
{
    int ans=0;
    for(;i>0;i-=lb(i)) ans+=c[i];
    return ans;
}
int sum(int l,int r) {return sum(r)-sum(l-1);}
​
int main( )
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    //离散化
    for(int i=1;i<=n;i++) tmp[i]=a[i];
    sort(tmp+1,tmp+1+n);
    int len=unique(tmp+1,tmp+1+n)-(tmp+1);
    for(int i=1;i<=n;i++) a[i]=lower_bound(tmp+1,tmp+len+1,a[i])-tmp;
    //求逆序对个数
    for(int i=1;i<=n;i++)
    {
        update(a[i],1);
        ans+=sum(a[i]+1,n);
    }
    //进入到本题计算
    ans%=2;
    cin>>m;
    while(m--)
    {
        cin>>l>>r;
        if(((r-l+1)/2)%2) ans^=1;
        if(ans) cout<<"1"<<endl;
        else cout<<"0"<<endl;
    }
    return 0;
}

2🐋🐋左移后的逆序对(钻石;树状数组)

时间限制:1秒

占用内存:128M

🐟题目思路

【MT3060 左移后的逆序对】MT3060 左移后的逆序对_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=3e5+7;
int a[N],c[N],n;
long long ans;
​
int lb(int x) { return x & -x; }
void update(int i,int x)
{
    for(;i<=n;i+=lb(i)) c[i]+=x;
}
int sum(int i)
{
    int ans=0;
    for(;i>0;i-=lb(i)) ans+=c[i];
    return ans;
}
int sum(int l,int r) { return sum(r)-sum(l-1); }
int main( )
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        a[i]++;
    } 
    for(int i=1;i<=n;i++)
    {
        update(a[i],1);
        ans+=sum(a[i]+1,n);
    }
    cout<<ans<<endl;
    for(int i=1;i<=n-1;i++)
    {
        ans+=n-a[i]*2+1;
        cout<<ans<<endl;
    }
    return 0;
}

3🐋🐋区间异或和(钻石;树状数组)

时间限制:1秒

占用内存:128M

🐟题目思路

【MT3061 区间异或和】MT3061 区间异或和_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=3e5+7;
int n,m,flag,x,y,a[N],c[N];
​
int lb(int x) { return x & -x; }
void update(int i,int x)
{
    for(;i<=n;i+=lb(i)) c[i]^=x;
}
int sum(int i)
{
    int ans=0;
    for(;i>0;i-=lb(i)) ans^=c[i];
    return ans;
}
int sum(int l,int r) { return sum(r)^sum(l-1); }
​
int main( )
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        update(i,a[i]);
    }
    while(m--)
    {
        cin>>flag>>x>>y;
        if(flag==1)
        {
            a[x]^=y;
            update(x,y);
        }
        else cout<<sum(x,y)<<endl;
    }
    return 0;
}

4🐋🐋农场(王者;并查集)

时间限制:3秒

占用内存:128M

🐟题目思路

【MT3057 农场】MT3057 农场_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=1e5+7;
struct node
{
    double x,y;
    int id;
}a[N],b[N];
struct edge
{
    int u,v;
    double w;
}e[2*N];
​
int n,m,fa[N];
double k;
​
bool cmp1(node x,node y) { return x.x<y.x; }
bool cmp2(node x,node y) { return x.y<y.y; }
bool cmp3(edge x,edge y) { return x.w<y.w; }
​
int find(int x)
{
    if(fa[x]==x) return x;
    return fa[x]=find(fa[x]);
}
void merge(int i,int j)
{
    int x=find(i),y=find(j);
    if(x!=y) fa[x]=y;
}
bool sol(int l,int r)
{
    if(l>=r) return 1;
    int mid=(l+r)/2,cnt=0;
    if(!sol(l,mid)||!sol(mid+1,r)) return false;
    while(a[l].x+k<a[mid].x) l++;
    while(a[r].x-k>a[mid].x) r--;
    for(int i=l;i<=r;i++) b[++cnt]=a[i];
    sort(b+1,b+1+cnt,cmp2);
    for(int i=1;i<=cnt;i++)
    {
        for(int j=i+1;j<=cnt;j++)
        {
            if(b[j].y-b[i].y>k) break;
            if(fabs(b[j].x-b[i].x)<=k&&find(b[i].id)!=find(b[j].id)) return false;
        }
    }
    return true;
}
bool check(int x)
{
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++)
    {
        if(e[i].w>e[x].w) break;
        merge(e[i].u,e[i].v);
    }
    return sol(1,n);
}
​
int main( )
{
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++) 
    {
        cin>>a[i].x>>a[i].y;
        a[i].id=i;
    }
    for(int i=1;i<=m;i++) cin>>e[i].u>>e[i].v>>e[i].w;
    sort(a+1,a+1+n,cmp1);
    sort(e+1,e+1+m,cmp3);
    int l=0,r=m,mid,ans=0;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(check(mid)) 
        {
            r=mid-1;
            ans=mid;
        }
        else l=mid+1;
    }
    printf("%.3lf",e[ans].w);
    return 0;
}

5🐋🐋方块染色(星耀;并查集)

时间限制:1秒

占用内存:250M

🐟题目思路

【MT3053 方块染色】MT3053 方块染色_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=1e5+7;
int n,m,fa[2*N];
set<int> s;
int find(int x)
{
    if(x==fa[x]) return x;
    return fa[x]=find(fa[x]);
}
void merge(int i,int j)
{
    int x=find(i),y=find(j);
    if(x!=y) fa[x]=y;
}
​
int main( )
{
    cin>>n>>m;
    for(int i=1;i<=2*n;i++) fa[i]=i;
    for(int i=1;i<=m;i++)
    {
        char opt;
        int x,y;
        cin>>opt>>x>>y;
        if(opt=='S')
        {
            merge(x,y);
            merge(x+n,y+n);
        }
        else
        {
            merge(x+n,y);
            merge(x,y+n);
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(find(i)==find(i+n))
        {
            cout<<0;
            return 0;
        }
    }
    for(int i=1;i<=2*n;i++) s.insert(find(i));
    cout<<1;
    for(int i=1;i<=(s.size()/2);i++) cout<<0;
    return 0;
}

6🐋🐋删除序列(星耀;并查集)

时间限制:1秒

占用内存:256M

🐟题目思路

【MT3058 删除序列】MT3058 删除序列_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
#define int long long
const int N=1e5+7;
int fa[N],a[N],b[N],flag[N],n,ans,maxn;
int find(int x) { return x==fa[x]?x:fa[x]=find(fa[x]);}
void merge(int i,int j)
{
    int x=find(i),y=find(j);
    if(x!=y) 
    {
        fa[x]=y;
        a[y]+=a[x];
    }
}
signed main( )
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        fa[i]=i;
    }
    for(int i=1;i<=n;i++) cin>>b[i];
    for(int i=n;i>=2;i--)
    {
        flag[b[i]]=1;
        if(flag[b[i]-1]&&!flag[b[i]+1]) merge(b[i]-1,b[i]);
        if(!flag[b[i]-1]&&flag[b[i]+1]) merge(b[i]+1,b[i]);
        if(flag[b[i]-1]&&flag[b[i]+1]) 
        {
            merge(b[i]-1,b[i]);
            merge(b[i]+1,b[i]);
        }
        maxn=max(maxn,a[find(b[i])]);
        ans+=maxn;
    }
    cout<<ans;
    return 0;
}

⭐这周有点不太舒服,就没有写题解,需要的宝子看下链接里的视频讲解~

⭐创作不易,点个赞吧~

⭐点赞收藏不迷路~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值