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

原文地址:https://www.cnblogs.com/163467wyj/p/9369034.html