zoukankan      html  css  js  c++  java
  • Codeforces1100F. Ivan and Burgers(离线+线性基)

    题目链接:传送门

    思路:

      按查询的右端点离线。

      然后从左到右维护线性基。

      每个基底更新为最右边的方案,可以让尽量多的查询享受到这个基底。

      用ci维护后更新右端点为i的答案。

    代码(析构1000ms,别学我):

    #include <bits/stdc++.h>
    #define P pair<int, int>
    #define F first
    #define S second
    
    using namespace std;
    const int MAX_N = 5e5 + 5;
    const int MAX_B = 20 + 5;
    
    int n, q;
    int c[MAX_N];
    int bas[MAX_B], pos[MAX_B];
    int ans[MAX_N];
    vector <P> eve[MAX_N];
    
    inline bool base(int x, int pos) {
        return (x >> pos) & 1;
    }
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        cout.tie(nullptr);
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> c[i];
        cin >> q;
        for (int i = 1, l, r; i <= q; i++) {
            cin >> l >> r;
            eve[r].push_back(P(l, i));
        }
    
        for (int i = 1; i <= n; i++) {
            int x = c[i], p = i;
            for (int b = 20; b >= 0; b--) {
                if (base(x, b)) {
                    if (!bas[b]) {
                        bas[b] = x;
                        pos[b] = p;
                        break;
                    }
                    if (pos[b] < p) swap(bas[b], x), swap(pos[b], p);
                    x ^= bas[b];
                }
            }
            for (auto &p : eve[i])
                for (int b = 20; b >= 0; b--)
                    if (p.F <= pos[b])
                        ans[p.S] = max(ans[p.S], ans[p.S]^bas[b]);
        }
        for (int i = 1; i <= q; i++)
            cout << ans[i] << '
    ';
        return 0;
    }
    View Code
  • 相关阅读:
    snaker数据库表说明
    Oracle 导入、导出DMP(备份)文件
    eclipse debug无法启动
    java----事务
    java----单例模式
    java----spring框架
    mybatis----批量增加与批量删除
    web应用程序状态管理
    JavaWeb----servlet
    HTML / CSS----元素分类
  • 原文地址:https://www.cnblogs.com/Lubixiaosi-Zhaocao/p/10274793.html
Copyright © 2011-2022 走看看