zoukankan      html  css  js  c++  java
  • hdu多校第二场dls题解 dls的搬运工

    A题Absolute

    #include <bits/stdc++.h>
    using namespace std;
    #define rep(i,a,n) for (int i=a;i<n;i++)
    #define per(i,a,n) for (int i=n-1;i>=a;i--)
    #define pb push_back
    #define mp make_pair
    #define all(x) (x).begin(),(x).end()
    #define fi first
    #define se second
    #define SZ(x) ((int)(x).size())
    typedef vector<int> VI;
    typedef long long ll;
    typedef pair<int,int> PII;
    const ll mod=998244353;
    ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
    ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
    // head
     
    int n,l[20],r[20];
    vector<PII> evt;
    int comb[20][20];
    ll inv[20];
    int ret[20],poly[20],rret[20];
    ll integral(int *c,int n,int x) {
        ll ret=0; ll w=1;
        rep(i,0,n+1) {
            w=w*x%mod;
            ret=(ret+w*c[i]%mod*inv[i+1])%mod;
        }
        return ret;
    }
    int main() {
        scanf("%d",&n);
        int s=0;
        rep(i,0,n) {
            scanf("%d%d",l+i,r+i);
            s-=l[i];
            r[i]-=l[i];
            if (r[i]==0) {
                --i; --n;
            }
        }
        if (n==0) {
            printf("%d
    ",abs(s));
            return 0;
        }
        rep(i,0,20) {
            comb[i][0]=comb[i][i]=1;
            rep(j,1,i) {
                comb[i][j]=(comb[i-1][j-1]+comb[i-1][j])%mod;
            }
        }
        rep(i,0,20) inv[i]=powmod(i,mod-2);
        rep(S,0,(1<<n)) {
            int lb=0;
            rep(i,0,n) if (S&(1<<i)) lb+=r[i];
            evt.pb(mp(lb,__builtin_parity(S)?-1:1));
        }
        evt.pb(mp(s,0));
        bool sg=0;
        sort(all(evt));
        ll ans=0;
        rep(i,0,SZ(evt)) {
            int x=evt[i].fi;
            int y=(i==SZ(evt)-1)?1e9:evt[i+1].fi;
            ll w=1;
            per(j,0,n) {
                poly[j]=w*comb[n-1][j]%mod;
                w=w*(mod-x)%mod;
            }
            if (evt[i].se==1) {
                rep(j,0,n) ret[j]=(ret[j]+poly[j])%mod;
            }
            if (evt[i].se==-1) {
                rep(j,0,n) ret[j]=(ret[j]+mod-poly[j])%mod;            
            }
            if (evt[i].se==0) {
                sg^=1;
            }
            rret[0]=0;
            rep(j,0,n) rret[j+1]=ret[j];
            rep(j,0,n) rret[j]=(rret[j]-(ll)ret[j]*s)%mod;
            if (sg) {
                ans+=integral(rret,n,y)-integral(rret,n,x);
            } else {
                ans+=integral(rret,n,x)-integral(rret,n,y);
            }
    //        printf("%lld
    ",ans);
     
        }
        ans%=mod;
        if (ans<0) ans+=mod;
        rep(j,1,n) ans=ans*inv[j]%mod;
        rep(j,0,n) ans=ans*powmod(r[j],mod-2)%mod;
        printf("%lld
    ",ans);
    }
    View Code

    B题Counting Permutations

    #include <bits/stdc++.h>
    using namespace std;
    #define rep(i,a,n) for (int i=a;i<n;i++)
    #define per(i,a,n) for (int i=n-1;i>=a;i--)
    #define pb push_back
    #define mp make_pair
    #define all(x) (x).begin(),(x).end()
    #define fi first
    #define se second
    #define SZ(x) ((int)(x).size())
    typedef vector<int> VI;
    typedef long long ll;
    typedef pair<int,int> PII;
    ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
    // head
     
    const int N=220;
    int dp[N][1010],comb[N][N],fr[N],n,x;
    ll tmp[1010];
    ll mod=1000000007,mod2;
    int main() {
        scanf("%lld",&mod);
        mod2=mod*mod;
        rep(i,0,201) {
            comb[i][0]=comb[i][i]=1;
            rep(j,1,i) comb[i][j]=(comb[i-1][j-1]+comb[i-1][j])%mod;
        }
        dp[0][0]=1; fr[0]=0;
        dp[1][1]=1; fr[1]=1;
        for (int i=2;i<=200;i++) {
            for (int j=0;j<i;j++) {
                int l=j,r=i-1-j,x=min(l,r)+1;
                if (l>r) break;
                fr[i]=max(fr[i],x+fr[l]+fr[r]);
                rep(k,0,fr[l]+fr[r]+1) tmp[k]=0;
                for (int pl=l;pl<=fr[l];pl++) {
                    for (int pr=r;pr<=fr[r];pr++) {
                        tmp[pl+pr]=tmp[pl+pr]+(ll)dp[l][pl]*dp[r][pr];
                        if (tmp[pl+pr]>=mod2) tmp[pl+pr]-=mod2;
                    }
                }
                ll coef=comb[i-1][l]; if (l<r) coef=coef*2%mod;
                rep(k,0,fr[l]+fr[r]+1) {
                    dp[i][k+x]=(dp[i][k+x]+tmp[k]%mod*coef)%mod;
                }
            }
        }
        while (scanf("%d%d",&n,&x)!=EOF) {
            if (x>fr[n]) puts("0");
            else printf("%d
    ",dp[n][x]);
        }
    }
     
    View Code
     

    C题 Cover

    // C
    #include <bits/stdc++.h>
    using namespace std;
    #define rep(i,a,n) for (int i=a;i<n;i++)
    #define per(i,a,n) for (int i=n-1;i>=a;i--)
    #define pb push_back
    #define mp make_pair
    #define all(x) (x).begin(),(x).end()
    #define fi first
    #define se second
    #define SZ(x) ((int)(x).size())
    typedef vector<int> VI;
    typedef long long ll;
    typedef pair<int,int> PII;
    const ll mod=1000000007;
    ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
    ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
    // head
     
    const int N=101000;
    int _,n,x,y;
    pair<PII,int> p[N];
    int main() {
        for (scanf("%d",&_);_;_--) {
            scanf("%d",&n);
            rep(i,0,3*n) {
                scanf("%d%d",&x,&y);
                p[i]=mp(mp(x,y),i);
            }
            sort(p,p+3*n);
            rep(i,0,n) {
                printf("%d %d %d
    ",p[3*i].se+1,p[3*i+1].se+1,p[3*i+2].se+1);
            }
        }
    }
     
    #include<algorithm>
    #include <iostream>
    #include <stdlib.h>
    #include <string.h>
    #include  <stdio.h>
    #include   <math.h>
    #include   <time.h>
    #include   <vector>
    #include   <bitset>
    #include    <queue>
    #include      <map>
    #include      <set>
    using namespace std;
     
    #define next VIVONEX
    const int N=100005,M=500005;
     
    int n,m,G[N],tot,e[M],next[M],deg[N],top,stk[M],vis[M],fa[N],w;
    vector<int> ji[N],Ans[N];
     
    int getfa(int u)
    {
        return u==fa[u]?u:fa[u]=getfa(fa[u]);
    }
     
    inline void adde(int u,int v)
    {
    //    cout<<u<<" "<<v<<endl;
        next[++tot]=G[u];G[u]=tot;e[tot]=v;
    }
     
    void dfs(int u)
    {
        for(int &v=G[u];v;v=next[v])
        {
            if(vis[v>>1])
                continue;
            int t=v;
            vis[v>>1]=1;dfs(e[v]);
            stk[++top]=(t&1?-(t>>1):t>>1);
        }
    }
     
    #define clr(_) memset(_,0,sizeof(_))
     
    void solve()
    {
        clr(G);clr(deg);clr(vis);
        tot=1;
        for(int i=1;i<=n;i++)
            ji[i].clear(),Ans[i].clear(),fa[i]=i;
        for(int i=1,u,v;i<=m;i++)
            scanf("%d%d",&u,&v),adde(u,v),adde(v,u),deg[u]++,deg[v]++,fa[getfa(u)]=getfa(v);
        for(int i=1;i<=n;i++)
            if(deg[i]&1)
                ji[getfa(i)].push_back(i);
        w=0;
        for(int i=1;i<=n;i++)
            if(fa[i]==i)
            {
                if(!ji[i].size())
                {
                    top=0;dfs(i);++w;
                    while(top)
                        Ans[w].push_back(stk[top--]);
                }
                else
                {
                    for(int j=0;j<ji[i].size();j+=2)
                        adde(ji[i][j],ji[i][j+1]),adde(ji[i][j+1],ji[i][j]);
                //    cout<<tot<<endl;
                    top=0;dfs(i);
                    vector<int> pos;
                    for(int i=top;i;i--)
                        if(stk[i]>m||stk[i]<-m)
                            pos.push_back(i);
                    for(int i=0;i<pos.size()-1;i++)
                    {
                        w++;
                        for(int j=pos[i]-1;j>pos[i+1];j--)
                            Ans[w].push_back(stk[j]);
                    }
                    w++;
                    for(int j=pos[pos.size()-1]-1;j;j--)
                        Ans[w].push_back(stk[j]);
                    for(int j=top;j>pos[0];j--)
                        Ans[w].push_back(stk[j]);
                }
            }
        int t=w;
        for(int i=1;i<=w;i++)
            if(Ans[i].size()==0)
                t--;
        cout<<t<<endl;
        for(int i=1;i<=w;i++)
            if(Ans[i].size()!=0)
            {
                printf("%d",Ans[i].size());
                for(int j=0;j<Ans[i].size();j++)
                    printf(" %d",Ans[i][j]);
                puts("");
            }
    }
     
    int main()
    {
        while(cin>>n>>m)
            solve();
        return 0;
    }
    View Code

    D题  Game

    #include<algorithm>
    #include <iostream>
    #include <stdlib.h>
    #include <string.h>
    #include  <stdio.h>
    #include   <math.h>
    #include   <time.h>
    #include   <vector>
    #include   <bitset>
    #include    <queue>
    #include      <map>
    #include      <set>
    using namespace std;
     
    int n;
    int main()
    {
        while(scanf("%d",&n)!=EOF)
            puts("Yes");
        return 0;
    }
    View Code

    E题 Hack it

    #include <bits/stdc++.h>
    using namespace std;
    #define rep(i,a,n) for (int i=a;i<n;i++)
    #define per(i,a,n) for (int i=n-1;i>=a;i--)
    #define pb push_back
    #define mp make_pair
    #define all(x) (x).begin(),(x).end()
    #define fi first
    #define se second
    #define SZ(x) ((int)(x).size())
    typedef vector<int> VI;
    typedef long long ll;
    typedef pair<int,int> PII;
    const ll mod=1000000007;
    ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
    ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
    // head
     
    int p;
    bool grid[3010][3010];
    int main() {
        p=47;
        rep(i,0,p) rep(j,0,p) {
            rep(k,0,p) grid[i*p+j][k*p+(j*k+i)%p]=1;
        }
        puts("2000");
        rep(i,0,2000) {
            rep(j,0,2000) printf("%d",grid[i][j]);
            puts("");
        }
    }
    View Code

    F题 Matrix

    #include <bits/stdc++.h>
    using namespace std;
    #define rep(i,a,n) for (int i=a;i<n;i++)
    #define per(i,a,n) for (int i=n-1;i>=a;i--)
    #define pb push_back
    #define mp make_pair
    #define all(x) (x).begin(),(x).end()
    #define fi first
    #define se second
    #define SZ(x) ((int)(x).size())
    typedef vector<int> VI;
    typedef long long ll;
    typedef pair<int,int> PII;
    const ll mod=998244353;
    ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
    ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
    // head
     
    const int N=3010;
    ll fac[N],fnv[N];
    int pw[9000100];
    int gg[3010][3010];
    ll f[3010][3010];
    int n,m,a,b;
    int main() {
        fac[0]=fnv[0]=1;
        rep(i,1,3001) fac[i]=fac[i-1]*i%mod,fnv[i]=powmod(fac[i],mod-2);
        pw[0]=1;
        for (int i=1;i<=9000000;i++) pw[i]=pw[i-1]*2%mod;
        for (int w=0;w<=3000;w++) for (int z=0;z<=3000;z++) gg[w][z]=pw[w*z]*fnv[w]%mod*fnv[z]%mod;
        for (int s=0;s<=3001;s++) {
            for (int u=s;u>=0;u--) {
                int val=fnv[u]*fnv[s-u]%mod;
                if ((s-u)%2) val=mod-val;
                f[s][u]=(f[s][u+1]+val)%mod;
            }
        }
        while (scanf("%d%d%d%d",&n,&m,&a,&b)!=EOF) {
            ll ans=0;
            rep(w,0,n-a+1) rep(z,0,m-b+1) ans=(ans+f[n-w][a]*f[m-z][b]%mod*gg[w][z])%mod;
            printf("%lld
    ",ans*fac[n]%mod*fac[m]%mod);
        }
    }
    View Code

    G题  Native Operations

    #include <bits/stdc++.h>
    using namespace std;
    #define rep(i,a,n) for (int i=a;i<n;i++)
    #define per(i,a,n) for (int i=n-1;i>=a;i--)
    #define pb push_back
    #define mp make_pair
    #define all(x) (x).begin(),(x).end()
    #define fi first
    #define se second
    #define SZ(x) ((int)(x).size())
    typedef vector<int> VI;
    typedef long long ll;
    typedef pair<int,int> PII;
    const ll mod=1000000007;
    ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
    ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
    // head
     
    const int N=101000;
    struct node {
        int fg;
        int s;
        int mv;
    }nd[4*N];
    int b[N],n,m,l,r;
    char s[20];
     
    void upd(int p) {
        nd[p].mv=min(nd[p+p].mv,nd[p+p+1].mv);
        nd[p].s=nd[p+p].s+nd[p+p+1].s;
    }
    void setf(int p,int f) {
        nd[p].fg+=f;
        nd[p].mv+=f;
    }
    void build(int p,int l,int r) {
        nd[p].fg=0;
        if (l==r) {
            nd[p].mv=b[l]-1;
            nd[p].s=0;
        } else {
            int md=(l+r)>>1;
            build(p+p,l,md);
            build(p+p+1,md+1,r);
            upd(p);
        }
    }
    void push(int p) {
        if (nd[p].fg) {
            setf(p+p,nd[p].fg);
            setf(p+p+1,nd[p].fg);
            nd[p].fg=0;
        }
    }
    int query(int p,int l,int r,int tl,int tr) {
        if (tl==l&&tr==r) return nd[p].s;
        else {
            push(p);
            int md=(l+r)>>1;
            if (tr<=md) return query(p+p,l,md,tl,tr);
            else if (tl>md) return query(p+p+1,md+1,r,tl,tr);
            else return query(p+p,l,md,tl,md)+query(p+p+1,md+1,r,md+1,tr);
        }
    }
    void modify(int p,int l,int r,int tl,int tr) {
        if (tl>tr) return;
    //    printf("modify %d %d %d %d %d %d
    ",l,r,tl,tr,nd[p].mv,nd[p].s);
        if (tl==l&&tr==r) {
            if (nd[p].mv>0) {
                nd[p].mv--;
                nd[p].fg--;
            } else {
                if (tl==tr) {
                    nd[p].mv=b[l]-1;
                    nd[p].s++;
                } else {
                    push(p);
                    int md=(l+r)>>1;
                    if (nd[p+p].mv==0) modify(p+p,l,md,tl,md);
                        else setf(p+p,-1);
                    if (nd[p+p+1].mv==0) modify(p+p+1,md+1,r,md+1,tr);
                        else setf(p+p+1,-1);
                    upd(p);
                }
            }
        } else {
            push(p);
            int md=(l+r)>>1;
            if (tr<=md) modify(p+p,l,md,tl,tr);
            else if (tl>md) modify(p+p+1,md+1,r,tl,tr);
            else modify(p+p,l,md,tl,md),modify(p+p+1,md+1,r,md+1,tr);
            upd(p);
        }
    //    printf("ff %d %d
    ",p,nd[p].s);
    }
     
    int main() {
        while (scanf("%d%d",&n,&m)!=EOF) {
            rep(i,1,n+1) scanf("%d",b+i);
            build(1,1,n);
            rep(i,1,m+1) {
                scanf("%s%d%d",s,&l,&r);
                if (s[0]=='a') {
                    modify(1,1,n,l,r);
                } else {
                    printf("%d
    ",query(1,1,n,l,r));
                }
            }
        }
    }
    View Code

    H题 Odd Shops

    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<bitset>
    using namespace std;
    const int N=17,M=50,gow1=(1<<18)-1;
    int A[21],B[21],n,K,C[100],preK,fir[100],zerobit;
    int go[4][1<<18],pd[1<<18];
    long long f[2][1<<18],L,R,m,Lim[70],checkB;
    char ch[30];
    void preget(int K){
        long long x=0,y=0; int k1=K;
        for (int i=0;i<=N;i++){
            x|=(1ll*(k1&1)<<(i<<1)); k1>>=1;
        }
        pd[K]=(((x^checkB)>>zerobit)==0);
        go[0][K]=((x>>N)&gow1);
        go[1][K]=((x>>N+1)&gow1);
        for (int i=0;i<=n;i++) if (A[i]) y^=(x<<i);
        go[2][K]=((y>>N)&gow1);
        go[3][K]=((y>>N+1)&gow1);
     
    }
    long long solve(long long m,long long lim){
        if (lim==0) return 0;
        Lim[0]=lim;
        for (int i=1;i<=60;i++) Lim[i]=(Lim[i-1]+1)>>1;
        memset(f,0x00,sizeof f);
        memset(fir,0x00,sizeof fir); fir[0]=1;
        memset(C,0x00,sizeof C); C[M]=1;
        long long nowlen=1; int now=0; f[0][1<<N]=1;
        int LI=0; while ((1ll<<LI)<=m) LI++;
        for (int t=LI-1;t>=0;t--){
            int ne=now^1; long long *F=f[now]; long long *G=f[ne];
            memset(f[ne],0x00,sizeof f[ne]);
            long long lim=Lim[t];
            if ((m&(1ll<<t))==0){
                for (int i=0;i<(1<<N+1);i++) G[go[0][i]]+=F[i];
                for (int i=0;i<(1<<N+1);i++) G[go[1][i]]+=F[i];
                nowlen<<=1;
                bitset<150>x,y;
                x=0; y=0;
                for (int i=0;i<=M;i++) x[i<<1]=C[i];
                int del=max(0ll,nowlen-lim);
                for (int i=0;i<del;i++){
                    int num=0;
                     for (int j=0;j<=N;j++)
                         num+=(x[(M<<1)-i-N+j+1]<<j);
                     G[num]--;
                }
            //    cout<<M<<" "<<del<<endl;
                for (int i=0;i<=M;i++)
                    C[i]=x[i+M-del+1];
                nowlen=min(nowlen,lim);
                x=0;
                for (int i=0;i<=M;i++) x[i<<1]=fir[i];
                for (int i=0;i<=M;i++) fir[i]=x[i];
            } else {
                for (int i=0;i<(1<<N+1);i++) G[go[2][i]]+=F[i];
                for (int i=0;i<(1<<N+1);i++) G[go[3][i]]+=F[i];
                nowlen=(nowlen<<1)+n;
                bitset<150>x,y;
                x=0; y=0;
                for (int i=0;i<=M;i++) x[i<<1]=C[i];
                for (int i=0;i<=n;i++) if (A[i]) y^=(x<<i);
                for (int i=0;i<n;i++){
                    int num=0;
                    for (int j=0;j<=N;j++)
                        num+=(y[(M<<1)+n-i-N+j+1]<<j);
                    G[num]++;
                }
                int del=max(0ll,nowlen-lim);// cerr<<del<<endl;
                for (int i=0;i<del;i++){
                    int num=0;
                    for (int j=0;j<=N;j++)
                        num+=(y[(M<<1)+n-i-N+j+1]<<j);
                    G[num]--;
                }
                for (int i=0;i<=M;i++) C[i]=y[i+n+M-del+1];
                nowlen=min(nowlen,lim);
                x=0; y=0;
                for (int i=0;i<=M;i++) x[i<<1]=fir[i];
                for (int i=0;i<=n;i++) if (A[i]) y^=(x<<i);
                for (int i=0;i<=M;i++) fir[i]=y[i];
            }
            now=ne;
        }
        long long ans=0;
        for (int i=0;i<(1<<N+1);i++)
            if (pd[i]&&f[now][i]){
            //    cout<<"asd "<<f[now][i]<<" ";
            //    for (int j=0;j<=N;j++) if (i&(1<<j)) putchar('1'); else putchar('0'); putchar('
    ');
                ans+=f[now][i];
            }
        return ans;     
    }
    void solve(){
        checkB=0;
        n=10;L=1;R=n*m+1;K=1;
        preK=K;
        memset(A,0x00,sizeof A);
        memset(B,0x00,sizeof B);
        A[0]=1;
        for(int i=1,w=0;i<=n;i++)
            scanf("%d",&w),A[i]=w&1;
        if (R-L+1<K){
            printf("0
    "); return;
        }
        B[0]=1;
        zerobit=(N-preK+1<<1); //cout<<zerobit<<endl;
        for (int i=0;i<preK;i++) if (B[i]) checkB|=(1ll<<(N-i<<1));
        long long tot=n*m+1;
        for (int i=0;i<(1<<N+1);i++) preget(i);
        printf("%lld
    ",(solve(m,tot-L+1)-solve(m,tot-R+K-1))%998244353);
    }
    int main(){
        while(cin>>m)
            solve();
        return 0;
    }
    View Code

    I 题 Segment

    from fractions import Fraction as F
     
    def prob(n,l,r):
        if l==1 and r==n:
            return F(1,1)
        elif l==1 or r==n:
            return F(1,r-l+1)
        else:
            return F(2,(r-l+1)*(r-l+2))
     
    def solve(n,l,r):
        ret=0
        for i in xrange(1,n+1):
            for j in xrange(i,n+1):
                if (i<l and j>r) or (i==l and j==r):
                    ret+=prob(n,i,j)
                elif i<=r and j>r:
                    ret+=prob(n,i,j)*(1+F(r-i+(i!=l),j-i))
                elif j>=l and i<l:
                    ret+=prob(n,i,j)*(1+F(j-l+(j!=r),j-i))
        return ret
     
    H=[0]
     
    for i in xrange(1,100):
        H.append(H[i-1]+F(1,i))
     
    def solve3(n,l,r):
        ret=0
        if l==1:
            ret+=1-F(r-1,n-1)+H[n-1]-H[r]
        else:
            if r==n:
                ret+=2*(H[n-1]-H[l-1])-(l-2)*(F(1,l-1)-F(1,n-1))
            else:
                ret+=H[n-1]-H[l-1]+F(1,r)*F(r-l,r-1)
                ret+=H[r-1]-H[l-1]-(l-2)*(F(1,l-1)-F(1,r-1))
        return ret
     
    def ff(p,q):
        if p<=1 or q>=n:
            return 0
        return 2*(H[q-1]-H[q-p]+H[n-p]-H[n-1])
     
    def solve2(n,l,r):
        if l==1 and r==n:
            return 1
        if r==n:
            l,r=n+1-r,n+1-l
        ret=0
     
        if l==1:
            ret+=(1+F(r-1,n-1))
        else:
            ret+=1
        ret+=solve3(n,l,r)
        ret+=solve3(n,n+1-r,n+1-l)
     
        if l!=r:
            ret+=ff(l-1,l)
            ret+=ff(r,r+1)
            ret-=ff(l-1,r+1)
            if l>1:
                ret+=F(2,r-l+1)-F(2,r-l+2)
        else:
            ret+=ff(l,l)
        if l>1:
            ret+=F(r-l,(r-l+1)*(r-l+2))-F(r-l,(n-l)*(n-l+1))
        ret+= H[r-l+1]+H[n-r-1]-H[n-l-1]-F(n-r,n-l)
     
        if l>1:
            ret+=F(r-l,(r-l+1)*(r-l+2))-F(r-l,(r-1)*r);
            ret+=H[r-l+1]+H[l-2]-H[r-2]-F(l-1,r-1);
        return ret
     
    for n in xrange(1,10):
        for l in xrange(1,n+1):
            for r in xrange(l,n+1):
                print n,l,r,solve(n,l,r),solve2(n,l,r)
                assert solve(n,l,r)==solve2(n,l,r)
    View Code
    #include<algorithm>
    #include <iostream>
    #include <stdlib.h>
    #include <string.h>
    #include  <stdio.h>
    #include   <math.h>
    #include   <time.h>
    #include   <vector>
    #include   <bitset>
    #include    <queue>
    #include      <map>
    #include      <set>
    using namespace std;
     
    typedef long long LL;
    const int N=1000005,Mod=998244353;
    int n,q,inv[N],H[N];
     
    int Pow(int x,int y)
    {
        int s=1;
        while(y)
        {
            if(y&1)
                s=s*(LL)x%Mod;
            x=x*(LL)x%Mod;y>>=1;
        }
        return s;
    }
     
    int F(int a,int b)
    {
        return a*(LL)inv[b]%Mod;
    }
     
    int solve3(int l,int r)
    {
        int ret=0;
        if(l==1)
            ret=(1ll-F(r-1,n-1)+H[n-1]-H[r]+Mod*2)%Mod;
        else if(r==n)
            ret=((2*(H[n-1]-H[l-1])-(LL)(l-2)*(F(1,l-1)-F(1,n-1)))%Mod+Mod)%Mod;
        else
            ret=((H[n-1]-H[l-1]+F(1,r)*(LL)F(r-l,r-1)+H[r-1]-H[l-1]-(LL)(l-2)*(F(1,l-1)-F(1,r-1)))%Mod+Mod)%Mod;
        return ret;
    }
     
    int ff(int p,int q)
    {
        if(p<=1||q>=n)
            return 0;
        return 2*((LL)H[q-1]-H[q-p]+H[n-p]-H[n-1]+Mod*2)%Mod;
    }
     
    int solve(int l,int r)
    {
        if(l==1&&r==n)
            return 1;
        if(r==n)
            r=n+1-l,l=1;
        int ret=0;
     
        if(l==1)
            ret=(ret+1+F(r-1,n-1))%Mod;
        else
            ret=(ret+1)%Mod;
        ret=(ret+solve3(l,r))%Mod;
        ret=(ret+solve3(n+1-r,n+1-l))%Mod;
     
        if(r<n)
        {
            if(l>1)
                ret=((ret+(r-l)*((LL)F(1,r-l+1)-F(1,r-l+2)-F(1,n-l)+F(1,n-l+1)))%Mod+Mod)%Mod;
            ret=(ret+(LL)H[r-l+1]+H[n-r-1]-H[n-l-1]-F(n-r,n-l)+Mod*2)%Mod;
        }
        if(l>1)
        {
            if(r<n)
                ret=((ret+(r-l)*((LL)F(1,r-l+1)-F(1,r-l+2)-F(1,r-1)+F(1,r)))%Mod+Mod)%Mod;
            ret=(ret+(LL)H[r-l+1]+H[l-2]-H[r-2]-F(l-1,r-1)+Mod*2)%Mod;
        }
     
        if(l!=r)
        {
            ret=(ret+ff(l-1,l)+(LL)ff(r,r+1)-ff(l-1,r+1)+Mod)%Mod;
            if(l>1)
                ret=(ret+F(2,r-l+1)-F(2,r-l+2)+(LL)Mod)%Mod;
        }
        else
            ret=(ret+ff(l,l))%Mod;
        return ret;
    }
     
    int main()
    {
        cin>>n>>q;
        inv[1]=1;
        for(int i=2;i<=n;i++)
            inv[i]=(Mod-(Mod/i))*(LL)inv[Mod%i]%Mod;
        for(int i=1;i<=n;i++)
            H[i]=(H[i-1]+inv[i])%Mod;
        for(int i=1,l,r;i<=q;i++)
            scanf("%d%d",&l,&r),printf("%d
    ",solve(l,r));
        return 0;
    }
    View I Code

    J题 Swaps and Inversions

    #include<algorithm>
    #include <iostream>
    #include <stdlib.h>
    #include <string.h>
    #include  <stdio.h>
    #include   <math.h>
    #include   <time.h>
    #include   <vector>
    #include   <bitset>
    #include    <queue>
    #include      <map>
    #include      <set>
    using namespace std;
     
    const int N=100005;
    typedef long long LL;
    LL ans;
    int n,x,y,a[N],c[N];
     
    inline void msort(int l,int r)
    {
      if(l==r)return;
      int mid=(l+r)>>1;
      msort(l,mid);msort(mid+1,r);
      int i=l,j=mid+1,k=l;
      while(i<=mid&&j<=r){
        if(a[i]<=a[j])
          c[k++]=a[i++];
        else{
          c[k++]=a[j++];
          ans+=(mid-i+1);
        }
      }
      while(i<=mid)c[k++]=a[i++];
      while(j<=r)c[k++]=a[j++];
      for(i=l;i<=r;i++)
        a[i]=c[i];
    }
     
    void solve()
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        ans=0;
        msort(1,n);
        cout<<ans*min(x,y)<<endl;
    }
     
    int main()
    {
        while(scanf("%d%d%d",&n,&x,&y)!=EOF)
            solve();
        return 0;
    }
    View Code

    2A

  • 相关阅读:
    数值数据类型
    如何提高数据迁移和复制的速度
    dns解析
    cdn加速
    集群
    JavaScript初学者应注意的七个细节
    CXF 5参考资料
    深入理解Spring MVC 思想
    【深入理解Java内存模型】
    牛人论
  • 原文地址:https://www.cnblogs.com/163467wyj/p/9369034.html
Copyright © 2011-2022 走看看