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\n",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\n",(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\n", Seg.query(1, l1, r1)); } } return 0; }
折花枝,恨花枝,准拟花开人共卮,开时人去时。
怕相思,已相思,轮到相思没处辞,眉间露一丝。