zoukankan      html  css  js  c++  java
  • 牛客小白月赛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<<"
    "
    #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
    ", 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 ", 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 ", 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 ", 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 ", ans); return 0; } ```
  • 相关阅读:
    lufylegendRPG游戏引擎 Yorhom's Game Box
    讨论交流 Yorhom's Game Box
    货币之间的大小写转换
    Unreal3的D3D渲染器部分
    Linxu宿主目录
    用于主题检测的临时日志(b25e234297d442ccba394dd2241308d2 3bfe001a32de4114a6b44005b770f6d7)
    Linux命令 文件命名规则 基础
    C#_GDI_文章粗略整合
    由IDisposable接口导致的using使用 以及using的其他用法
    ADO.NET基础备忘1_SqlConnection SqlCommand SqlDataReader
  • 原文地址:https://www.cnblogs.com/Cwolf9/p/9985913.html
Copyright © 2011-2022 走看看