zoukankan      html  css  js  c++  java
  • hdu多校 2

    。。。 后面四个小时都在挂机很难受。

    1010

    裸的逆序对

    //#pragma comment(linker, "/stack:200000000")
    //#pragma GCC optimize("Ofast,no-stack-protector")
    //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
    //#pragma GCC optimize("unroll-loops")
    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define vi vector<int>
    #define mod 1000000007
    #define ld long double
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pll pair<ll,ll>
    #define pil pair<int,ll>
    #define pli pair<ll,int>
    #define pii pair<int,int>
    #define cd complex<double>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
    inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
    inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
    
    using namespace std;
    
    const double eps=1e-8;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    const int N=500000+10,maxn=50000+10,inf=0x3f3f3f3f;
    
    struct BIT{
        ll sum[N];
        void add(int i,int v)
        {
            for(;i<N;i+=i&(-i))sum[i]+=v;
        }
        ll query(int i)
        {
            ll ans=0;
            for(;i;i-=i&(-i))ans+=sum[i];
            return ans;
        }
    }b;
    int Hash[N],a[N];
    int main()
    {
        int n,x,y;
        while(~scanf("%d%d%d",&n,&x,&y))
        {
            memset(b.sum,0,sizeof b.sum);
            int cnt=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
                Hash[cnt++]=a[i];
            }
            sort(Hash,Hash+cnt);
            cnt=unique(Hash,Hash+cnt)-Hash;
            ll ans=0;
            for(int i=1;i<=n;i++)
            {
                a[i]=lower_bound(Hash,Hash+cnt,a[i])-Hash+1;
    //            printf("%d ",a[i]);
                b.add(a[i],1);
                ans+=b.query(cnt+5)-b.query(a[i]);
            }
    //        puts("");
            printf("%lld
    ",ans*min(x,y));
        }
        return 0;
    }
    /********************
    
    ********************/
    View Code

    1004

    因为1的存在所以先手必胜

    1007

    因为序列b为 1, 2, 3, 4, 5, 6 .... n, 所以所有点的更新次数不超过 m/1 + m/2 + m/3 .... + m/n = mlogm,

    所以就是暴力扣出要更新的点更新就好啦。 天天写搓lazy,反思一下。。

    #include<bits/stdc++.h>
    #define LL long long
    #define fi first
    #define se second
    #define mk make_pair
    #define pii pair<int, int>
    
    using namespace std;
    
    const int N = 1e5 + 7;
    const int M = 1e5 + 7;
    const int inf = 0x3f3f3f3f;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const int mod = 1e9 +7;
    
    int n, q, b[N], mx[N << 2], lazy[N << 2], stk[N], tot;
    char s[N];
    
    struct BIT {
        int a[N];
        void init() {
            memset(a, 0, sizeof(a));
        }
        void modify(int x, int v) {
            for(int i = x; i <= n; i += i & -i)
                a[i] += v;
        }
        int query(int x) {
            int ans = 0;
            for(int i = x; i; i -= i & -i)
                ans += a[i];
            return ans;
        }
    } bit;
    
    void build(int l, int r, int rt) {
        lazy[rt] = 0;
        if(l == r) {
            mx[rt] = -b[l];
            return;
        }
    
        int mid = l + r >> 1;
        build(l, mid, rt << 1);
        build(mid + 1, r, rt << 1 | 1);
        mx[rt] = max(mx[rt << 1], mx[rt << 1 | 1]);
    }
    
    void pushdown(int rt) {
        if(lazy[rt] != 0) {
            lazy[rt << 1] += lazy[rt];
            lazy[rt << 1 | 1]  += lazy[rt];
            mx[rt << 1] += lazy[rt];
            mx[rt << 1 | 1] += lazy[rt];
            lazy[rt] = 0;
        }
    }
    
    void update(int L, int R, int v, int l, int r, int rt) {
        if(l >= L && r <= R) {
            lazy[rt] += v;
            mx[rt] += v;
            return;
        }
    
        int mid = l + r >> 1;
    
        pushdown(rt);
    
        if(L <= mid) update(L, R, v, l, mid, rt << 1);
        if(R > mid) update(L, R, v, mid + 1, r, rt << 1 | 1);
    
        mx[rt] = max(mx[rt << 1], mx[rt << 1 | 1]);
    }
    
    void solve(int l, int r, int rt) {
        if(mx[rt] < 0) return;
        if(l == r) {
            stk[tot++] = l;
            return;
        }
    
        int mid = l + r >> 1;
        pushdown(rt);
    
        solve(l, mid, rt << 1);
        solve(mid + 1, r, rt << 1 | 1);
    
    }
    
    int main() {
    
        while(scanf("%d%d", &n, &q) != EOF) {
            bit.init();
            for(int i = 1; i <= n; i++) {
                scanf("%d", &b[i]);
            }
            build(1, n, 1);
    
            while(q--) {
                int l, r;
                scanf("%s%d%d", s, &l, &r);
                if(s[0] == 'a') {
                    update(l, r, 1, 1, n, 1);
                    tot = 0;
                    solve(1, n, 1);
    
                    for(int i = 0; i < tot; i++) {
                        update(stk[i], stk[i], -b[stk[i]], 1, n, 1);
                        bit.modify(stk[i], 1);
                    }
    
                } else {
                    printf("%d
    ", bit.query(r) - bit.query(l - 1));
                }
            }
        }
        return 0;
    }
    
    
    /*
    */
    View Code

    补题-----------------------------------------------------------------

    1005

    比赛的时候一直构造不出来。。 很神奇的构造方法。。。

    #include<bits/stdc++.h>
    #define LL long long
    #define fi first
    #define se second
    #define mk make_pair
    #define pii pair<int, int>
    
    using namespace std;
    
    const int N = 3000 + 7;
    const int M = 1e5 + 7;
    const int inf = 0x3f3f3f3f;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const int mod = 1e9 +7;
    
    int a[N][N];
    
    int main() {
    
        int p = 47;
        for(int i = 0; i < p; i++) {
            for(int j = 0; j < p; j++) {
                for(int k = 0; k < p; k++) {
                    a[i * p + j][k * p + (j * k + i) % p] = 1;
                }
            }
        }
    
        puts("2000");
        for(int i = 0; i < 2000; i++) {
            for(int j = 0; j < 2000; j++) {
                printf("%d", a[i][j]);
            }
            puts("");
        }
        return 0;
    }
    
    
    /*
    */
    View Code

    1003

    后面一直在写这个题, 构造虚拟点,去掉多余的边,方法都想出来了,可能是对欧拉回路不够了解,一直没a,后来队友补了。

  • 相关阅读:
    Asp.Net Core中Session使用
    服务器开发- 牌和牌的基本操作
    服务器开发- Asp.Net Core中的websocket,并封装一个简单的中间件
    Lua Table转C# Dictionary
    Asp.Net Core 2.1+的视图缓存(响应缓存)
    C#中await和async关键字的简单理解
    SQLSERVER中分割字符串成多列
    Asp.Net Core Identity+EFCore + Mysql踩坑记录
    小试牛刀2:JavaScript基础题
    CSS典型案例实践
  • 原文地址:https://www.cnblogs.com/CJLHY/p/9369775.html
Copyright © 2011-2022 走看看