牛客小白月赛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;
}


///E
#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 ar[MXN], br[MXN], now[MXN];
struct lp{
    int l, r, sum;
}cw[MXN*30];
int root[MXN], tot;
void update(int l,int r,int last,int &cur,int c) {
    cw[++tot] = cw[last];
    cur = tot;
    cw[tot].sum ++;
    if(l == r) return;
    int mid = (l + r) >> 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;
}


///D
#include<bits/stdc++.h>
#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<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
const int MXN = 1e5 + 5;
const LL mod = 23333;
int n, m;
int ar[MXN];
int fa[MXN], dep[MXN], siz[MXN], son[MXN], top[MXN];
int tid[MXN], rtid[MXN], rnk[MXN], inde;
LL sum1[MXN<<2], sum2[MXN<<2], flag[MXN<<2];
std::vector<int> 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;
}


///F
///AC:
#include<bits/stdc++.h>
#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<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
typedef pair<int,int> 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<<j)) dp[i][j] = dp[i-1][j] + 1;
        }
    }
    for(int i = 2; i <= n; ++i) ar[i] += ar[i-1];
    LL ans = 0;
    for(int i = 1; i <= n; ++i) {
        std::vector<pii> vs;
        for(int j = 0; j < 20; ++j) {
            vs.push_back({dp[i][j], 1<<j});
        }
        sort(vs.begin(), vs.end());
        LL xr = 0;
        int len = vs.size();
        for(int j = len-1; j >= 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<bits/stdc++.h>
#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<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
typedef pair<int,int> 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<<j)) dp[i][j] = dp[i-1][j] + 1;
        }
    }
    for(int i = 2; i <= n; ++i) ar[i] += ar[i-1];
    LL ans = 0;
    for(int i = 1; i <= n; ++i) {
        std::vector<pii> vs;
        for(int j = 0; j <= 20; ++j) {
            vs.push_back({dp[i][j], 1<<j});
        }
        sort(vs.begin(), vs.end());
        LL res = 0, xr = 0;
        int sz = 0;
        int len = vs.size();
        for(int j = len-1; j >= 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;
}

转载于:https://www.cnblogs.com/Cwolf9/p/9985913.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值