Glad You Came hdu 6356

版权声明: https://blog.csdn.net/weixin_40959045/article/details/81569328

思路
1. 因为是大于区间中的值更新,故可以使用区间最小值进行优化
2. 递归更新至叶节点,暴力计算

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX_N = 1e5 + 100;
const int MAX_M = 5e6 + 100;
const unsigned  int MOD = (1 << 30) - 1;
typedef  long long LL;
struct Node {
    int l,r;
    int data,lazy;
    inline int mid() {
        return (l + r) >> 1;
    }
};

LL ans;
int T,N,M;
unsigned int X,Y,Z;
Node nodes[MAX_N * 4];
inline void pushdown(int index) {
    if (nodes[(index << 1)].data < nodes[index].lazy)
        nodes[(index << 1)].data =  nodes[(index << 1)].lazy = nodes[index].lazy;
    if (nodes[(index << 1) + 1].data < nodes[index].lazy)
        nodes[(index << 1) + 1].data =  nodes[(index << 1) | 1].lazy = nodes[index].lazy;
    nodes[index].lazy = -1;
}
inline void build(int index,int l,int r) {
    nodes[index].l = l;
    nodes[index].r = r;
    nodes[index].data = 0;
    nodes[index].lazy = -1;
    if (l == r) {
       return;
    }
    int mid = nodes[index].mid();
    build((index << 1),l,mid);
    build((index << 1) | 1,mid + 1,r);
}
inline void update(int index,int L,int R,int data) {
    if (nodes[index].data >= data) return;
    if (L <= nodes[index].l && nodes[index].r <= R){
        nodes[index].data = nodes[index].lazy = data;
        return;
    }
    if (nodes[index].lazy != -1) pushdown(index);
    int mid = nodes[index].mid();
    if (L <= mid) update((index << 1),L,R,data);
    if (mid < R) update((index << 1) | 1,L,R,data);
    nodes[index].data = min(nodes[(index << 1) ].data,nodes[(index << 1) | 1].data);
}
inline void query(int index) {
    if (nodes[index].l == nodes[index].r) {
        ans ^= (LL)nodes[index].data * nodes[index].l;
        return;
    }
    if (nodes[index].lazy != -1) pushdown(index);
    query((index << 1));
    query((index << 1) | 1);
}
inline unsigned int F() {
    X = X ^ (X << 11);
    X = X ^ (X >> 4);
    X = X ^ (X << 5);
    X = X ^ (X >> 14);
    unsigned int W = X ^ (Y ^ Z);
    X = Y;
    Y = Z;
    Z = W;
    return Z;

}
int main() {
    scanf("%d",&T);
    while (T--) {
        scanf("%d%d%u%u%u",&N,&M,&X,&Y,&Z);
        build(1,1,N);
        for (int i = 1;i <=  M;i++) {
            unsigned int f1 = F();
            unsigned int f2 = F();
            unsigned int f3 = F();
            int Li = min(f1 % N,f2 % N) + 1;
            int Ri = max(f1 % N,f2 % N) + 1;
            int data = f3 & MOD ;
            update(1,Li,Ri,data);
        }
        ans = 0;
        query(1);
        printf("%lld\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40959045/article/details/81569328
今日推荐