首页 > 其他分享 >训练记录

训练记录

时间:2022-08-22 23:44:06浏览次数:61  
标签:const 训练 记录 int ai 异或 bit define

------------恢复内容开始------------

D2. Burenka and Traditions (hard version)

很漂亮的一道题吧 我们可以知道我们1 2花费是一样的 你花费1的时候也可以用2来搞一搞 但是搞的代价就是你下一个只有异或上一个的值
那么对于我们每一个值 要是想要和前面的数异或全变成0 这样才能让结果-1 那么就肯定是一个后缀异或和 但是我们每次check后缀异或复杂度是n2的
这里就有个很漂亮的写法 我们维护前面所有的异或和 因为当且仅当我们当前ai+1也是一个后缀时才能变成0 那么我们用一个set把每一个异或装进来
记得一定要把0也装进来 因为ai+1可能是前面所有异或和

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
const int M = 998244353;
const int mod = 135799;
#define int long long
#define endl '\n'
#define Endl '\n'
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);

void solve() {
    int n;
    cin >> n;
    int res = 0;
    set<int> s;
    int tag = 0;
    s.insert(0);
    for(int i = 1; i <= n; i++){
        int x;
        cin >> x;
        if (x == 0 || s.count(x ^ tag)) s.clear(), s.insert(0), tag = 0;
        else s.insert(tag), tag ^= x, res++;
    }
    cout << res << '\n';
}
signed main(){
    fast
    int T;cin>>T;
    while(T--) {
        solve();
    }
    return ~~(0^_^0);
}

D2. Xor-Subsequence (hard version)

个人认为这道题还挺难的
首先我们观察式子 我们希望他不是一个小于符号 要是一个等号就可以通过再ij变成: ai ^ i = aj ^ j
那我们考虑一颗01字典树 这样岂不是就有一部分重合的相等了吗 状态表示就很清楚了 f[u][0/1]表示我们在u节点且他爹是0/1的max 为什么要记录他爹是啥 马上我就会说明
那我们设前k位是一样的(这样我们就可以插入aj*j 然后查找每个的分叉即可) k+1位不一样的话并且合法的话只有ai ^ j < aj ^ i
那我们只有可能ai^j=0 aj^i=1
我们不妨把这个表写出来就会发现 aj^j=ai ^ i ^ 1 , j=ai ^ 1
有了这个我们就可以有了这个我们就可以沿着ai^i去查找 哪一位有分叉 并且还满足 aj^j=ai ^ i ^ 1(对儿子的限制) j=ai^1(对爹的限制) 更新即可 要是ai^i走不下去了 break即可

#include <bits/stdc++.h>
using namespace std;
const int N =3e5+10;
const int M = 998244353;
const int mod = 135799;
//#define int long long
#define endl '\n'
#define Endl '\n'
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int f[N*32][2],tr[N*32][2],dp[N],a[N],n,cnt;
void insert(int n,int id){
    int u = 0;
    for (int i = 30; i >= 0; i--) {
        int bit = (n >> i) & 1;
        if (!tr[u][bit])tr[u][bit] = ++cnt;
        u = tr[u][bit];
        f[u][(id >> i) & 1] = max(f[u][(id >> i) & 1], dp[id]);
    }
}
int query(int n,int k){
    int res=1,u=0;
    for(int i=30;i>=0;i--){
        int bit=n>>i&1;
        int rev=tr[u][bit^1];
        res=max(res,f[rev][k>>i&1^1]+1);
        if(!tr[u][bit])break;
        u=tr[u][bit];
    }
    return res;
}
void solve() {
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i],dp[i]=1;
    for(int i=0;i<=cnt;i++)tr[i][0]=tr[i][1]=f[i][1]=f[i][0]=0;
    cnt=0;
    for(int i=0;i<n;i++){
        dp[i]=query(a[i]^i,a[i]);
        insert(a[i]^i,i);
    }
    cout<<*max_element(dp,dp+n)<<endl;
}
signed main(){
    fast
    int T;cin>>T;
    while(T--) {
        solve();
    }
    return ~~(0^_^0);
}

------------恢复内容结束------------

标签:const,训练,记录,int,ai,异或,bit,define
From: https://www.cnblogs.com/ycllz/p/16614683.html

相关文章

  • 记录一个bug
    bugdebugdebug分析,思考角度确保sql没有问题的情况下,那就考虑修改实体类,因为往实体类中装数据,通过反射创建对象,通过反射设置的值参考链接https://......
  • "蔚来杯"2022牛客暑期多校训练营(加赛)
    比赛链接:https://ac.nowcoder.com/acm/contest/38727E.Everyoneisbot题意:有\(n\)个人在群里复读,第\(i\)个人在第\(j\)个复读会获得\(a_{i,j}\)瓶冰红茶。......
  • 记录vue
    #查看版本node-v#安装Node.js淘宝镜像加速器(cnpm)注意源地址已经改变npminstall-gcnpm--registry=https://registry.npmmirror.comcnpminstallcnpm-g#全局......
  • CF刷题记录 8.22-8.26
    CF1329C不难发现,在最终的树中,叶子肯定是在原树的子树中最小的那个。而其他节点是原树的子树中大于两个叶子的最小的点,类似归并排序的做即可,偷懒写了个启发式合并。code......
  • vue记录
    #查看版本node-v#安装Node.js淘宝镜像加速器(cnpm)cnpminstallcnpm-g#全局安装vue-clicnpminstallvue-cli-g#查看是否安装成功webpack-v或vuelist#......
  • 蔚来杯2022牛客暑期多校训练营加赛 题解
    E.Everyoneisbot对于后\(p\)个人,这\(p\)个人相互制约,一旦有一个人进行复读,剩下的\(p-1\)个人一定会进行复读,那么这个人就会被禁言,对于他来说不是最优策略。此时......
  • # 【博学谷学习记录】超强总结,用心分享 | RabbitMQ消息的可靠性
    消息队列在使用过程中,如何确保RabbitMQ消息的可靠性,如何确保发送的消息至少被消费一次?1.生产者消息确认RabbitMQ提供了publisherconfirm机制来避免消息发送到MQ过程中......
  • 并发学习记录07:ReentrantLock
    特点相比于synchronized,ReentrantLock具有可中断,可以设置超时时间,可以设置为公平锁,支持多个条件变量的特点,它和synchronized一样,都支持可重入基本语法//获取锁reentra......
  • 自己de搭建博客记录
    自己de搭建博客记录因为奇奇怪怪的原因所以开始学着自己搭建一个博客了但是估计搭好了也不会常更新,连博客园都咕了一个月了先水水免得自己忘记了,要学的还有挺多突然发......
  • U8 V13.0小白入门开发记录四-------------------初识自定义按钮开发
    今天是第一次刚接触U8自定按钮开发,本人也是一名小白。网上的资料太少,就连一些开发文档都找不到。通过零零碎碎的测试和调研。发下一些基础并记录在此,如有补充请在下方评论,......