9.24模拟赛
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e3+11,St=1e3,mod=1e4; 4 int dp[N][N],sum[N][N]; 5 6 inline int re_ad() { 7 char ch=getchar(); int x=0,f=1; 8 while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } 9 while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); 10 return x*f; 11 } 12 13 int main() 14 { 15 int T=re_ad(); 16 dp[0][0]=dp[1][0]=sum[0][0]=1; 17 for(int i=0;i<=St;++i) sum[1][i]=1; 18 for(int i=2;i<=St;++i) for(int j=0;j<=St;++j) { 19 if(j<=(i*(i-1)/2)) { 20 if(j<i) dp[i][j]=sum[i-1][j]; 21 else dp[i][j]=(sum[i-1][j]-sum[i-1][j-i]+mod)%mod; 22 } 23 !j?sum[i][j]=dp[i][j]:sum[i][j]=(sum[i][j-1]+dp[i][j])%mod; 24 } 25 for(int n,m;T--;) n=re_ad(),m=re_ad(),printf("%d\n",dp[n][m]); 26 // for(int i=1;i<=5;++i) { for(int j=1;j<=5;++j) printf("%d ",dp[i][j]); puts(""); } 27 // for(int i=1;i<=5;++i) { for(int j=1;j<=5;++j) printf("%d ",sum[i][j]); puts(""); } 28 return 0; 29 }
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=4e3+11,St=2e3,Tree_Sz=1e5+11; 4 int n,m,a[N],t[N],dp[N],st[N]; 5 6 inline int re_ad() { 7 char ch=getchar(); int x=0,f=1; 8 while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } 9 while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); 10 return x*f; 11 } 12 13 inline void get_ans(int d) { 14 memset(t,0x3f,sizeof(t)); 15 t[St+0]=d; 16 for(int i=d-1,lj=0;i>=1;--i) lj+=((a[i]>a[d])?1:-1),t[lj+St]=i; 17 // printf("t %d: ",d); for(int i=St-5;i<=St+5;++i) printf("%d ",t[i]); puts(""); 18 dp[d]=max(dp[d],d-t[St-0]+1); 19 for(int i=d+1,lj=0;i<=n;++i) lj+=((a[i]>=a[d])?1:-1),dp[d]=max(dp[d],i-t[St-lj]+1); //,printf("%d: %d %d\n",d,lj,dp[d]); 20 } 21 22 namespace ST { 23 int val[Tree_Sz]; 24 inline void Pushup(int d) { val[d]=max(val[d<<1],val[d<<1|1]); } 25 void build(int d,int l,int r) { 26 if(l==r) { val[d]=dp[l]; return ; } 27 int mid=(l+r)>>1; 28 build(d<<1,l,mid),build(d<<1|1,mid+1,r); 29 Pushup(d); 30 } 31 inline void Build() { build(1,1,n); } 32 int query(int d,int l,int r,int x,int y) { 33 if(x<=l && r<=y) return val[d]; 34 int mid=(l+r)>>1,res=0; 35 if(x<=mid) res=max(res,query(d<<1,l,mid,x,y)); 36 if(y>=mid+1) res=max(res,query(d<<1|1,mid+1,r,x,y)); 37 return res; 38 } 39 inline int Query(int x,int y) { return query(1,1,n,x,y); } 40 /* 41 void print_search(int d,int l,int r) { 42 printf("%d %d %d: %d\n",d,l,r,val[d]); 43 if(l==r) return ; 44 int mid=(l+r)>>1; 45 print_search(d<<1,l,mid),print_search(d<<1|1,mid+1,r); 46 } 47 inline void Print_Test() { print_search(1,1,n); } 48 */ 49 } 50 51 int main() 52 { 53 n=re_ad(); 54 for(int i=1;i<=n;++i) a[i]=re_ad(); 55 for(int i=1;i<=n;++i) get_ans(i); 56 // for(int i=1;i<=n;++i) printf("%d ",dp[i]); puts(""); 57 ST::Build(); 58 // ST::Print_Test(); 59 m=re_ad(); 60 for(int i=1,x,y;i<=m;++i) x=re_ad(),y=re_ad(),printf("%d\n",ST::Query(x,y)); 61 return 0; 62 }
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=2e5+11,M=(1<<8)+11; 4 int T,dp[M][M]; 5 char s[11]; 6 bool zj[M][M]; 7 inline int re_ad() { 8 char ch=getchar(); int x=0,f=1; 9 while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } 10 while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); 11 return x*f; 12 } 13 inline void Insert(int d,int k) { 14 int d1=(d>>8),d2=(d&((1<<8)-1)); 15 for(int j=0;j<(1<<8);++j) if(zj[d2][j]) dp[d1][j]+=k; 16 // printf("Insert %d %d: %d %d: %d\n",d,k,d1,d2,dp[0][6]); 17 } 18 inline void Query(int d) { 19 int d1=(d>>8),d2=(d&((1<<8)-1)),res=0; 20 for(int i=0;i<(1<<8);++i) if(zj[i][d1]) res+=dp[i][d2]; 21 printf("%d\n",res); 22 } 23 int main() 24 { 25 for(int i=0;i<(1<<8);++i) for(int j=0;j<(1<<8);++j) zj[i][i|j]=true; 26 T=re_ad(); 27 for(int x;T--;) scanf("%s",s),x=re_ad(),s[0]=='c'?Query(x):Insert(x,s[0]=='a'?1:-1); 28 // for(int i=0;i<16;++i) { for(int j=0;j<16;++j) printf("%d",zj[i][j]); puts(""); } 29 return 0; 30 }