牛客小白月赛9

///C
#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
#define fi first
#define se second
#define lowbit(x) (x&(-(x)))
#define mme(a,b) memset((a),(b),sizeof((a))) 
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
#define Mod(a, b) a<b?a:a%b+b
using namespace std;
typedef long long LL;
const int MXN = 2e5 + 7;
const int mod = 1000000007;
const int INF = 0x3f3f3f3f;
int n, m;
int sum[MXN<<2][20], lazy[MXN<<2];
/*
sum[rt][i]表示的是rt子树下第i位为1的数量
区间长度是r-l+1,这一位取反操作就是数量为len-sum[][]
lazy[rt]表示这个rt区间内异或操作数的异或和
*/
void push_up(int rt) {
    for(int i = 0; i < 20; ++i) {
        sum[rt][i] = sum[rt<<1][i]+sum[rt<<1|1][i];
    }
}
void build(int l,int r,int rt) {
    if(l == r) {
        int x; scanf("%d", &x);
        for(int i = 0; i < 20; ++i) {
            if(x&(1<<i)) sum[rt][i] = 1;
            else sum[rt][i] = 0;
        }
        return;
    }
    int mid = (l+r) >> 1;
    build(l,mid,rt<<1); build(mid+1,r,rt<<1|1);
    push_up(rt);
}

void push_down(int l,int r,int rt) {
    if(lazy[rt] == 0) return;
    lazy[rt<<1] ^= lazy[rt];
    lazy[rt<<1|1] ^= lazy[rt];
    int len = r - l + 1;
    for(int i = 0; i < 20; ++i) {
        if(lazy[rt]&(1<<i)) {
            sum[rt<<1][i] = (l+r)/2 - l + 1 - sum[rt<<1][i];
            sum[rt<<1|1][i] = r - (l+r)/2 - sum[rt<<1|1][i];
        }
    }
    lazy[rt] = 0;
}
LL query(int L,int R,int l,int r,int rt) {
    if(L <= l && r <= R) {
        LL ans = 0;
        for(int i = 0; i < 20; ++i) {
            ans += ((LL)sum[rt][i]<<i);
        }
        return ans;
    }
    push_down(l,r,rt);
    int mid = (l + r) >> 1;
    if(L > mid) return query(L,R,mid+1,r,rt<<1|1);
    else if(R <= mid) return query(L,R,l,mid,rt<<1);
    return query(L,mid,l,mid,rt<<1)+query(mid+1,R,mid+1,r,rt<<1|1);
}
void update(int L,int R,int k,int l,int r,int rt) {
    if(L <= l && r <= R) {
        lazy[rt] ^= k;
        for(int i = 0; i < 20; ++i) {
            if(k&(1<<i)) sum[rt][i] = r - l + 1 - sum[rt][i];
        }
        return;
    }
    push_down(l,r,rt);
    int mid = (l + r) >> 1;
    if(L > mid) update(L,R,k,mid+1,r,rt<<1|1);
    else if(R <= mid) update(L,R,k,l,mid,rt<<1);
    else {
        update(L,mid,k,l,mid,rt<<1);
        update(mid+1,R,k,mid+1,r,rt<<1|1);
    }
    push_up(rt);
}
int main() {
    scanf("%d%d", &n, &m);
    int l, r, k, op;
    build(1, n, 1);
    while(m --) {
        scanf("%d%d%d", &op, &l, &r);
        if(op == 1) {
            printf("%lld\n", query(l, r, 1, n, 1));
        }else {
            scanf("%d", &k);
            update(l, r, k, 1, n, 1);
        }
    }
    return 0;
}


```cpp ///E #include #define lson rt<<1 #define rson rt<<1|1 #define fi first #define se second #define lowbit(x) (x&(-(x))) #define mme(a,b) memset((a),(b),sizeof((a))) #define fuck(x) cout<<"* "<> 1; if(c <= mid) update(l,mid,cw[last].l,cw[tot].l,c); else update(mid+1,r,cw[last].r,cw[tot].r,c); } int query(int l,int r,int cur,int c) { if(!c) return 0; if(l == r) return cw[cur].sum; int mid = (l + r) >> 1; if(c <= mid) return query(l,mid,cw[cur].l,c); else { int ans = cw[cw[cur].l].sum; ans += query(mid+1,r,cw[cur].r,c); return ans; } } struct one{ int l, r, c; }op[MXN]; int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; ++i) scanf("%d", &ar[i]), br[i] = ar[i]; cw[0].l = cw[0].r = cw[0].sum = 0; int k = 100000; int l, r, c, T = n; for(int i = 0; i < m; ++i) { scanf("%d%d%d", &l, &r, &c); op[i].l = l;op[i].r = r;op[i].c = c; br[++T] = c; } sort(br+1,br+1+T); k = unique(br+1,br+1+T) - br; for(int i = 1; i <= n; ++i) { now[i] = lower_bound(br+1,br+k,ar[i]) - br; } for(int i = 1; i <= n; ++i) { update(1, k, root[i-1], root[i], now[i]); } for(int i = 0; i < m; ++i) { l = op[i].l; r = op[i].r; c = op[i].c; c = lower_bound(br+1,br+k,c) - br; printf("%d\n", query(1,k,root[r],c)-query(1,k,root[l-1],c)); } return 0; } ```
```cpp ///D #include #define lson rt<<1 #define rson rt<<1|1 #define fi first #define se second #define mme(a,b) memset((a),(b),sizeof((a))) #define fuck(x) cout<<"* "< mp[MXN]; void dfs_1(int u,int ba,int D) { dep[u] = D; son[u] = 0; fa[u] = ba; siz[u] = 1; for(auto v: mp[u]) { if(v == ba) continue; dfs_1(v, u, D + 1); siz[u] += siz[v]; if(siz[v] > siz[son[u]]) son[u] = v; } } void dfs_2(int u,int ba) { tid[u] = ++inde; rnk[inde] = u; if(son[u]) { top[son[u]] = u; dfs_2(son[u], u); } for(auto v: mp[u]) { if(v == ba || v == son[u]) continue; top[v] = v; dfs_2(v, u); } rtid[u] = inde; } void Mod(LL &a, LL &b, LL &c) { if(a >= mod) a %= mod; if(b >= mod) b %= mod; if(c >= mod) c %= mod; } void push_up(int rt) { sum1[rt] = sum1[lson] + sum1[rson]; sum2[rt] = sum2[lson] + sum2[rson]; Mod(sum1[rt], sum2[rt], flag[rt]); } void build(int l,int r,int rt) { flag[rt] = 0; if(l == r) { sum1[rt] = ar[rnk[l]] % mod; sum2[rt] = sum1[rt] * sum1[rt] % mod; return; } int mid = (l + r) >> 1; build(l,mid,lson), build(mid+1,r,rson); push_up(rt); } void push_down(int rt, int Len) { if(flag[rt] == 0) return; flag[lson] += flag[rt]; flag[rson] += flag[rt]; sum2[lson] = (sum2[lson] + 2*sum1[lson]*flag[rt]%mod + flag[rt]*flag[rt]*(Len-(Len>>1)))%mod; sum2[rson] = (sum2[rson] + 2*sum1[rson]*flag[rt]%mod + flag[rt]*flag[rt]*(Len>>1))%mod; sum1[lson] += flag[rt]*(Len-(Len>>1)); sum1[rson] += flag[rt]*(Len>>1); Mod(sum1[lson], sum2[lson], flag[lson]); Mod(sum1[rson], sum2[rson], flag[rson]); flag[rt] = 0; } void update(int L,int R,int c,int l,int r,int rt) { if(L <= l && r <= R) { flag[rt] += c; sum2[rt] = (sum2[rt] + 2*sum1[rt]*c%mod + (LL)c*c*(r-l+1))%mod; sum1[rt] += (LL)c*(r-l+1); Mod(sum1[rt], sum2[rt], flag[rt]); return; } push_down(rt, r-l+1); int mid = (l + r) >> 1; if(L > mid) update(L,R,c,mid+1,r,rson); else if(R <= mid) update(L,R,c,l,mid,lson); else { update(L,mid,c,l,mid,lson); update(mid+1,R,c,mid+1,r,rson); } push_up(rt); } LL query(int L,int R,int l,int r,int rt) { if(L <= l && r <= R) { return sum2[rt]%mod; } push_down(rt, r-l+1); int mid = (l + r) >> 1; if(L > mid) return query(L,R,mid+1,r,rson); else if(R <= mid) return query(L,R,l,mid,lson); else { return (query(L,mid,l,mid,lson)+query(mid+1,R,mid+1,r,rson))%mod; } } int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; ++i) scanf("%d", &ar[i]), ar[i] %= mod; for(int i = 1, a, b; i < n; ++i) { scanf("%d%d", &a, &b); mp[a].push_back(b); mp[b].push_back(a); } inde = 0; dfs_1(1, 1, 1); top[1] = 1; dfs_2(1, 1); build(1, n, 1); int op, x, y; while(m --) { scanf("%d%d", &op, &x); if(op == 1) { scanf("%d", &y); y %= mod; update(tid[x],rtid[x],y,1,n,1); }else { printf("%lld\n", query(tid[x],rtid[x],1,n,1)); } } return 0; } ```
```cpp ///F ///AC: #include #define lson rt<<1 #define rson rt<<1|1 #define fi first #define se second #define mme(a,b) memset((a),(b),sizeof((a))) #define fuck(x) cout<<"* "< pii; const int MXN = 1e5 + 5; const int mod = 1000000007; int n, m; int dp[MXN][20]; LL ar[MXN]; int main() { scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%lld", &ar[i]); for(int i = 1; i <= n; ++i) { for(int j = 0; j < 20; ++j) { dp[i][j] = 0; if(ar[i]&(1< vs; for(int j = 0; j < 20; ++j) { vs.push_back({dp[i][j], 1<= 0; --j) { pii x = vs[j]; xr += x.second; ans = max(ans, xr*(ar[i]-ar[i-x.first])); } } printf("%lld\n", ans); return 0; } ///WA: #include #define lson rt<<1 #define rson rt<<1|1 #define fi first #define se second #define mme(a,b) memset((a),(b),sizeof((a))) #define fuck(x) cout<<"* "< pii; const int MXN = 1e5 + 5; const int mod = 1000000007; int n, m; int dp[MXN][21]; LL ar[MXN]; int main() { scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%lld", &ar[i]); for(int i = 1; i <= n; ++i) { for(int j = 0; j <= 20; ++j) { dp[i][j] = 0; if(ar[i]&(1< vs; for(int j = 0; j <= 20; ++j) { vs.push_back({dp[i][j], 1<= 0; --j) { pii x = vs[j]; if(j != len-1) sz = (ar[i-x.first]-ar[i-vs[j+1].first]); res -= xr * sz; res += (LL)x.second * (ar[i]-ar[i-x.first]); ans = max(ans, res); xr += x.second; } } printf("%lld\n", ans); return 0; } ```
posted @ 2018-11-19 21:37  Cwolf9  阅读(131)  评论(0编辑  收藏  举报