2019中国大学生程序设计竞赛(CCPC)- 网络选拔赛(部分题解)

本文详细解析了2019中国大学生程序设计竞赛(CCPC)网络选拔赛的部分题目,包括1001题的位运算解法,1002题的数组操作与查询策略,1003题的后缀自动机与可持久化线段树,1004题的最短路径变种问题,1006题的洗牌算法,以及1007和1008题的模拟策略。内容涵盖数组处理、路径规划、数据结构与算法应用。
摘要由CSDN通过智能技术生成
1001:^ & ^

对第i位,如果A和B的第i位都是1,那么C的这一位需要为1,否则取0.C必须为正数,所以C可以取0的时候,要看A和B最小的一个为1一个为0的位出现的位置last,让C为1<<last(这样才能保证(A ^ C)&( B ^ C)最小)。如果没有这样的位置,就让C为1.

#include<bits/stdc++.h>
#define ll long long
#define lowbit(x) ((x)&(-(x)))
using namespace std;
int main()
{
   
    int T;cin>>T;
    ll a,b,c;
    while(T--){
   
        scanf("%lld%lld", &a, &b);
        c = 0;
        ll k = 1;
        int last = 0;
        for(int i = 32; i >= 0; --i){
   
            ll ba = (a&(k<<i)), bb = (b&(k<<i));
            if(ba && bb){
   
                c |= (k<<i);
            }
            else if(ba^bb) last = i;
        }
        if(c == 0) c = 1<<last;
        cout<<c<<endl;
    }
}

1002: array

做法1:
在[1,r]找没出现的,相当于在[r+1,end]找出现过的,在最后一个位置加一个n+1。用主席树找[r+1,end]出现的最小的大于等于k的数字。每个操作一可以看成在end位置添加一个a[pos]。

#include<bits/stdc++.h>
#define ll long long
#define lowbit(x) ((x)&(-(x)))
#define mid ((l+r)>>1)
using namespace std;
const int maxn = 2e5 + 50;
int sz[maxn*20], lc[maxn*20], rc[maxn*20];
int T[maxn];
int a[maxn];
int n, m;
int tot;
void build(int pre, int &cur, int l, int r, int pos){
   
    cur = ++tot;
    sz[cur] = sz[pre]+1;
    lc[cur] = lc[pre]; rc[cur] = rc[pre];
    if(l == r) return;
    if(pos <= mid)
        build(lc[pre], lc[cur], l, mid, pos);
    else
        build(rc[pre], rc[cur], mid+1, r, pos);
}
int qry(int pre, int cur, int l, int r, int k)
{
   
    if(sz[cur] - sz[pre] == 0) return -1;
    if(l == r){
   
        return l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值