zoukankan      html  css  js  c++  java
  • 10.11 NOIP模拟题(1)

    /*
    离散化
    差分
    */
    #include<bits/stdc++.h>
    
    #define N 4000007
    
    using namespace std;
    int n,ans;
    int tmp[N],a[N],b[N],s[N];
    
    int main()
    {
        freopen("meizi.in","r",stdin);
        freopen("meizi.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&a[i],&b[i]);
            tmp[(i<<1)-1]=a[i],tmp[i<<1]=b[i];
        }
        int num=(n<<1)+1;
        sort(tmp+1,tmp+num);
        for(int i=1;i<=n;i++)
        {
            a[i]=lower_bound(tmp+1,tmp+num,a[i])-tmp;
            b[i]=lower_bound(tmp+1,tmp+num,b[i])-tmp;
            s[a[i]]++;s[b[i]+1]--; 
        }
        for(int i=1;i<=num;i++) s[i]+=s[i-1];
        for(int i=1;i<=num;i++) ans=max(ans,s[i]);
        printf("%d
    ",ans);
        return 0;
    }

    /*
    容斥原理 先保证每列满足
    答案为 全部(每列满足) - 一行白(每列满足) + 两行白(每列满足)...
    ans=(-1)^k*C(n,k)*(2^(n-k)-1)^m
    阶乘逆元组合数
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    #define N 200001
    #define M 1000000007
    #define ll long long
    
    using namespace std;
    ll fac[N]={1,1},inv[N]={1,1},f[N]={1,1};
    int n,m;
    ll ans;
    
    ll ksm(ll a,ll b)
    {
        ll res=1;
        while(b)
        {
            if(b&1) res=res*a%M;
            b>>=1;a=a*a%M;
        }return res%M;
    }
    
    ll C(ll a,ll b)
    {
        return (fac[a]*inv[b]%M*inv[a-b]%M)%M;
    }
    
    int main()
    {
        freopen("matrix.in","r",stdin);
        freopen("matrix.out","w",stdout);
        for(int i=2;i<N;i++)
        {
            fac[i]=fac[i-1]*i%M;
            f[i]=(M-M/i)*f[M%i]%M;
            inv[i]=inv[i-1]*f[i]%M;
        }
        
        scanf("%d%d",&n,&m);
        for(int k=0;k<=n;k++)
        {
            if(k&1)
              ans=(ans-C(n,k)%M*ksm(ksm(2,n-k)-1,m))%M;
            else
              ans=(ans+C(n,k)%M*ksm(ksm(2,n-k)-1,m))%M;
        }
        printf("%lld
    ",(ans+M)%M);
        return 0;
    }

    /*
    和的期望即期望的和
    55分暴力就行
    
    线段树区间乘,加,求和
    */
    #include <iostream>
    #include <cstring>
    #include <cmath>
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    #include <vector>
    #include <map>
    #include <complex>
    
    #define inf 0x3f3f3f3f
    #define eps 1e-10
    
    #define lc k << 1
    #define rc k << 1 | 1
    
    using namespace std;
    
    typedef long long ll;
    typedef pair<ll, int> P;
    ll p;
    double tmp[200005];
    
    struct node{
        double dat, tag1, tag2;
        int l, r;
    };
    
    struct seg{
        node d[800005];
        
        void pushup(int k){
            d[k].dat = d[lc].dat + d[rc].dat;
        }
        
        void build(int k, int l, int r){
            d[k].l = l; d[k].r = r; d[k].tag1 = 0; d[k].tag2 = 1;
            if(l == r){
                d[k].dat = tmp[l];
                return;
            }
            int mid = (l + r) >> 1;
            build(lc, l, mid);
            build(rc, mid + 1, r);
            pushup(k);
        }
        
        void add(int k, double x){
            double len = d[k].r - d[k].l + 1;
            d[k].dat = (d[k].dat + x * len);
            d[k].tag1 = (d[k].tag1 + x);
        }
        
        void mul(int k, double x){
            d[k].dat = d[k].dat * x;
            d[k].tag1 = d[k].tag1 * x;
            d[k].tag2 = d[k].tag2 * x;
        }
        
        void pushdown(int k){
            if(fabs(d[k].tag2 - 1) > eps){
                mul(lc, d[k].tag2);
                mul(rc, d[k].tag2);
                d[k].tag2 = 1;
            }
            if(fabs(d[k].tag1) > eps){
                add(lc, d[k].tag1);
                add(rc, d[k].tag1);
                d[k].tag1 = 0;
            }
        }
        
        void add(int k, int l, int r, double x){
            if(l <= d[k].l && d[k].r <= r){
                add(k, x); return;
            }
            pushdown(k);
            int mid = (d[k].l + d[k].r) >> 1;
            if(l <= mid) add(lc, l, r, x);
            if(r > mid) add(rc, l, r, x);
            pushup(k);
        }
        
        void mul(int k, int l, int r, double x){
            if(l <= d[k].l && d[k].r <= r){
                mul(k, x); return;
            }
            pushdown(k);
            int mid = (d[k].l + d[k].r) >> 1;
            if(l <= mid) mul(lc, l, r, x);
            if(r > mid) mul(rc, l, r, x);
            pushup(k);
        }
        
        double query(int k, int l, int r){
            if(l <= d[k].l && d[k].r <= r){
                return d[k].dat;
            }
            pushdown(k); double sum = 0;
            int mid = (d[k].l + d[k].r) >> 1;
            if(l <= mid) sum = (sum + query(lc, l, r));
            if(r > mid) sum = (sum + query(rc, l, r));
            return sum;
        }
        
    }Seg;
    
    int n, m;
    
    int main(){
            
        freopen("random.in", "r", stdin);
        freopen("random.out", "w", stdout);
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; i ++) scanf("%lf", &tmp[i]);
        Seg.build(1, 1, n);
        while(m--){
            int opt, l1, r1, l2, r2; ll x;
            scanf("%d", &opt);
            if(opt == 1){
                scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
                   double d1 = Seg.query(1, l1, r1);
                 double d2 = Seg.query(1, l2, r2);
                   Seg.mul(1, l1, r1, double(r1 - l1) / double(r1 - l1 + 1));
                 Seg.mul(1, l2, r2, double(r2 - l2) / double(r2 - l2 + 1));
                Seg.add(1, l1, r1, d2 / double(r1 - l1 + 1) / double(r2 - l2 + 1));
                 Seg.add(1, l2, r2, d1 / double(r2 - l2 + 1) / double(r1 - l1 + 1));                   
            }
            if(opt == 2){
                scanf("%d%d", &l1, &r1);
                printf("%.8lf
    ", Seg.query(1, l1, r1));
            }
        }
        return 0;
    }
    折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
  • 相关阅读:
    leetcode 131. Palindrome Partitioning
    leetcode 526. Beautiful Arrangement
    poj 1852 Ants
    leetcode 1219. Path with Maximum Gold
    leetcode 66. Plus One
    leetcode 43. Multiply Strings
    pytorch中torch.narrow()函数
    pytorch中的torch.repeat()函数与numpy.tile()
    leetcode 1051. Height Checker
    leetcode 561. Array Partition I
  • 原文地址:https://www.cnblogs.com/L-Memory/p/9771505.html
Copyright © 2011-2022 走看看