18多校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; } }
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(""); } } }
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); } } }