• CF-Div2-832 D. Yet Another Problem(bitmask&结论)


    CF-Div2-832 D. Yet Another Problem(bitmask&结论)

    为了方便设每次询问 [ l , r ] [l,r] [l,r] 的长度为 n n n

    注意到:

    每次操作不会影响 X o r ( l , r ) Xor(l,r) Xor(l,r)的结果。

    所以必要条件1: X o r ( l , r ) = 0 Xor(l,r)=0 Xor(l,r)=0
    然后我们可以发现,我们可以将从 l l l开始的前缀异或和分为两个部分,长度为奇数的前缀和长度为偶数的。

    每次操作后,比如我们对 [ x , y ] , l ≤ x ≤ y ≤ r [x,y],l\le x\le y\le r [x,y],lxyr 操作。

    那么下标在 [ l , x − 1 ] [l,x-1] [l,x1] [ y + 1 , r ] [y+1,r] [y+1,r] 的下标前缀答案不会改变。

    而下标在 [ x , y ] [x,y] [x,y]之间的前缀异或和结果要么是 X o r ( l , y ) Xor(l,y) Xor(l,y) 要么 X o r ( l , x − 1 ) Xor(l,x-1) Xor(l,x1)

    也就是说这两个集合不会相互影响,且每次操作只会使集合大小非递增。

    因此要想最终 X o r ( l , r ) = 0 Xor(l,r)=0 Xor(l,r)=0,显然这两个集合都必须包含前缀异或和为 0 0 0的下标。

    更进一步,对于区间 1 ≤ l ≤ r ≤ n 1\le l\le r\le n 1lrn,显然 X o r ( l , r ) = 0 Xor(l,r)=0 Xor(l,r)=0 而且必须存在

    X o r ( 1 , r ) = X o r ( 1 , x ) , x m o d    2 ≠ r m o d    2 Xor(1,r) =Xor(1,x) , x\mod{2}\ne r\mod 2 Xor(1,r)=Xor(1,x),xmod2=rmod2

    那么 X o r ( l , r ) = X o r ( x + 1 , r ) = X o r ( l , x ) = 0 Xor(l,r)=Xor(x+1,r)=Xor(l,x)=0 Xor(l,r)=Xor(x+1,r)=Xor(l,x)=0

    不满足必要条件1,无解。

    如果区间全为0,答案为0.

    如果 l e n ( l , r ) len(l,r) len(l,r)为奇数,答案为1。

    否则如果 a [ l ] = 0 ∣ ∣ a [ r ] = 0 a[l]=0||a[r]=0 a[l]=0∣∣a[r]=0 则可以转情况2,答案为1.

    否则如果 l a s t r ≥ l last_r \ge l lastrl 保证 [ l a s t l + 1 , r ] [last_l+1,r] [lastl+1,r] 异或和为0。操作次数为2。

    否则无解。

    int _runtimeTerror_()
    {
        int n, Q;
        cin >> n >> Q;
        map<int, int> odd, even;
        vector<int> last_nz(n + 1, 0), last(n + 1, -1), pxor(n + 1, 0);
        vector<int> a(n + 1);
        even[0] = 0;
        int cur = 0;
        for(int i=1;i<=n;++i) {
        	cin >> a[i];
        	cur ^= a[i];
        	pxor[i] = cur;
        	if(a[i] == 0) {
        		last_nz[i] = last_nz[i - 1];
        	}
        	else {
        		last_nz[i] = i;
        	}
        	if(i & 1) {
        		if(even.count(cur)) {
        			last[i] = even[cur];
        		}
        		odd[cur] = i;
        	}
        	else {
        		if(odd.count(cur)) {
        			last[i] = odd[cur];
        		}
        		even[cur] = i;
        	}
        }
        while(Q--) {
        	int l, r;
        	cin >> l >> r;
        	if(pxor[l - 1] != pxor[r]) {
        		cout << "-1\n";
        	}
        	else if(last_nz[r] < l) {
        		cout << "0\n";
        	}
        	else if(r % 2 == l % 2) {
        		cout << "1\n";
        	}
        	else if(a[l] == 0 or a[r] == 0) {
        		cout << "1\n";
        	}
        	else if(last[r] >= l) {
        		cout << "2\n";
        	}
        	else {
        		cout << "-1\n";
        	}
        }
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
  • 相关阅读:
    金仓数据库KingbaseES客户端编程接口指南-Perl DBI(3. DBI 类)
    树莓派(香橙派)通过.NET IoT 操作SPI编写屏幕驱动 顺手做个四足机器人(一)
    JavaScript的执行机制是什么,事件循环是什么?
    Maven常见面试题总结
    嵌入式Linux入门-读数据手册,设置时钟,让代码跑得更快
    操作系统 线程的创建
    计算机毕业设计Java城市交通海量数据管理系统(源码+系统+mysql数据库+lw文档)
    华为云云耀云服务器 L 实例评测:快速建站的新选择,初创企业和开发者的理想之选
    【计算机组成与设计】-第五章 memory hierarchy(二)
    浅谈继承之默认成员函数
  • 原文地址:https://blog.csdn.net/weixin_45750972/article/details/127772514