ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

18多校8th

2019-05-19 10:51:46  阅读:221  来源: 互联网

标签:p2 rt dp1 int 18 多校 maxn define 8th


a-容斥原理(带限制的不定方程)

#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
#define ll long long
#define maxn 500005
ll n,m,k;
ll inv[maxn],f[maxn],invf[maxn];
void init(){
    inv[0]=inv[1]=1;
    for(int i=2;i<maxn;i++)
        inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    f[0]=f[1]=invf[0]=invf[1]=1;
    for(int i=2;i<maxn;i++){
        f[i]=f[i-1]*i%mod;
        invf[i]=invf[i-1]*inv[i]%mod;
    }
}
ll C(ll a,ll b){
    if(a<0 || b<0 || a>b)return 0;
    return f[b]*invf[a]%mod*invf[b-a]%mod;
}
int main(){
    int T;cin>>T;init();
    while(T--){
        scanf("%lld%lld%lld",&n,&m,&k);        
        int cur=1;    
        ll ans=0;    
        for(int i=0;i*n<=k;i++){
            ans+=cur*C(m-1,k+m-i*n-1)*C(i,m)%mod;
            ans=(ans%mod+mod)%mod;
            cur*=-1;
        }
        cout<<ans<<endl;
    }
}
View Code

E-水题

#include <bits/stdc++.h>
using namespace std;

#define REP(i,s,t) for(int i=s;i<=t;i++)
char mpa[5][5];

void rotatec(int x1,int y1,int x2,int y2){
    char a=mpa[x1][y1];
    char b=mpa[x1][y2];
    char c=mpa[x2][y1];
    char d=mpa[x2][y2];
    mpa[x1][y1]=c;
    mpa[x1][y2]=a;
    mpa[x2][y1]=d;
    mpa[x2][y2]=b;
}

void rotater(int x1,int y1,int x2,int y2){
    char a=mpa[x1][y1];
    char b=mpa[x1][y2];
    char c=mpa[x2][y1];
    char d=mpa[x2][y2];
    //printf("a=%c b=%c c=%c d=%c \n",a,b,c,d);
    mpa[x1][y1]=b;
    mpa[x1][y2]=d;
    mpa[x2][y1]=a;
    mpa[x2][y2]=c;
    //printf("1=%c 2=%c 3=%c 4=%c \n",mpa[x1][y1],mpa[x1][y2],mpa[x2][y1],mpa[x2][y2]);
}

int main(){
    int T;cin>>T;
    while(T--){
        int q;cin>>q;
        REP(i,1,3)REP(j,1,3)cin>>mpa[i][j];
        while(q--){
            string str;cin>>str;
//            cout<<"str[0]="<<str[0]<<endl;
//            cout<<"str[1]="<<str[1]<<endl;
            if(str[0]=='1'){
                if(str[1]=='C'){
                    rotatec(1,1,2,2);
                }else if(str[1]=='R'){
                    rotater(1,1,2,2);
                }
            }else if(str[0]=='2'){
                if(str[1]=='C')rotatec(1,2,2,3);
                else rotater(1,2,2,3);
            }else if(str[0]=='3'){
                if(str[1]=='C')rotatec(2,1,3,2);
                else rotater(2,1,3,2);
            }else if(str[0]=='4'){
                if(str[1]=='C')rotatec(2,2,3,3);
                else rotater(2,2,3,3);
            }
        }
        REP(i,1,3){
            REP(j,1,3){
                printf("%c",mpa[i][j]);
            }puts("");
        }
    }
}
View Code

j-线段树好题(查找区间[l,r[第一个非空元素,开全局变量)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 100005

int a[maxn],dp1[maxn],dp2[maxn],T,n,m,p,q,p2;

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int M1[maxn<<2],M2[maxn<<2];
void pushup(int rt){
    M1[rt]=max(M1[rt<<1],M1[rt<<1|1]);
    if(M1[rt<<1]>=M1[rt<<1|1])M2[rt]=M2[rt<<1];
    else M2[rt]=M2[rt<<1|1];    
}
void build(int l,int r,int rt){
    if(l==r){M1[rt]=a[l];M2[rt]=l;return;}
    int m=l+r>>1;
    build(lson);build(rson);
    pushup(rt);
}
void query1(int l,int r,int rt,int L,int R){
    if(l>=L && r<=R){if(M1[rt]>a[p2])p2=M2[rt];return;}
    int m=l+r>>1;
    if(L<=m)query1(lson,L,R);
    if(R>m)query1(rson,L,R);
}
void query(int l,int r,int rt,int L,int R,int k){
    if(l==r){if(M1[rt]>k)p2=min(p2,l);return;}
    int m=(l+r)/2;
    if(l>=L&&r<=R){        
        if(M1[rt<<1]>k)query(lson,L,R,k);
        else if(M1[rson]>k)query(rson,L,R,k);
        return;
    }
    if(L<=m)query(lson,L,R,k);
    if(R>m)query(rson,L,R,k);
}
void init(){
    for(int i=n;i;i--){
        p2=n+1;query(1,n,1,i,n,a[i]);
        if(p2>n)p2=0;dp2[i]=dp2[p2]+1;
    }
}
int main(){
    scanf("%d",&T);
    while(T--){
        int Mx=0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=n;i++){
            if(a[i]>Mx) dp1[i]=dp1[i-1]+1,Mx=a[i];
            else dp1[i]=dp1[i-1];
        }
        build(1,n,1);
        init();
        
        while(m--){
            int p,q,ans=0;
            scanf("%d%d",&p,&q);p2=0;
            if(p!=1)query1(1,n,1,1,p-1);
            ans+=dp1[p2];
            if(q>a[p2]) ans++;
            else q=a[p2];p2=n+1;
            if(p!=n) query(1,n,1,p+1,n,q);
            if(p2<=n) ans+=dp2[p2];
            printf("%d\n",ans);            
        }
    }
}
View Code

 

标签:p2,rt,dp1,int,18,多校,maxn,define,8th
来源: https://www.cnblogs.com/zsben991126/p/10888389.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有