2021.12.16 eleveni的刷题记录

1. 数论

https://www.luogu.com.cn/problem/P2532

1.1卡特兰数

https://www.luogu.com.cn/blog/syksykCCC/solution-p2532

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  6. using namespace std;
  7. const int N=1e4+10;
  8. int n;
  9. struct node{
  10. int len,num[N];
  11. node(){
  12. memset(num,0,sizeof(num));
  13. len=1;num[1]=1;
  14. }
  15. node operator *(const int &k)const{
  16. node fin;
  17. for(int i=1;i<=len;i++)fin.num[i]=num[i]*k;
  18. fin.len=len;
  19. for(int i=2;i<=fin.len;i++){
  20. fin.num[i]+=fin.num[i-1]/10;
  21. fin.num[i-1]%=10;
  22. }
  23. while(fin.num[fin.len]>10){
  24. fin.num[fin.len+1]+=fin.num[fin.len]/10;
  25. fin.num[fin.len]%=10;
  26. ++fin.len;
  27. }
  28. return fin;
  29. }
  30. node operator /(const int &k)const{
  31. node fin;
  32. int t=0;
  33. for(int i=len;i>=1;i--){
  34. t=t*10+num[i];
  35. fin.num[i]=t/k;
  36. t=t%k;
  37. }
  38. fin.len=len;
  39. while(!fin.num[fin.len])--fin.len;
  40. return fin;
  41. }
  42. }ans;
  43. int main(){
  44. IOS;
  45. cin>>n;
  46. for(int i=n+2;i<=2*n;i++)ans=ans*i;
  47. for(int i=2;i<=n;i++)ans=ans/i;
  48. for(int i=ans.len;i>=1;i--)cout<<ans.num[i];
  49. return 0;
  50. }

1.2 同余

https://www.luogu.com.cn/problem/P4296

set的应用!

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<set>
  7. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  8. using namespace std;
  9. typedef long long ll;
  10. ll n;
  11. set<ll>s;
  12. int main(){
  13. cin>>n;
  14. ll m=sqrt(n);
  15. if(n==1)return puts("None"),0;
  16. s.insert(1);
  17. for(ll i=1;i<=m;i++)if(n%i==0){
  18. ll j=n/i;
  19. for(ll k=j+1;k<=n;k+=j)if((k+1)%i==0)s.insert(k);
  20. for(ll k=j-1;k<=n;k+=j)if((k-1)%i==0)s.insert(k);
  21. }
  22. if(!s.size())return puts("None"),0;
  23. for(set<ll>::iterator it=s.begin();it!=s.end();it++)cout<<*it<<endl;
  24. return 0;
  25. }

1.3 矩阵

https://www.luogu.com.cn/problem/P3873

矩阵快速幂:一直不变的那个矩阵是basic

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<stack>
  6. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  7. using namespace std;
  8. const int N=110;
  9. const int mod=4147;
  10. int n,m;
  11. struct Matrix{
  12. int num[N][N];
  13. Matrix(){
  14. memset(num,0,sizeof(num));
  15. }
  16. Matrix operator *(const Matrix &b)const{
  17. Matrix c;
  18. for(int i=1;i<=100;i++)
  19. for(int j=1;j<=100;j++)
  20. for(int k=1;k<=100;k++)
  21. c.num[i][j]=(c.num[i][j]+num[i][k]*b.num[k][j])%mod;
  22. return c;
  23. }
  24. }ans,basic;
  25. inline Matrix operator ^(Matrix x,int y){
  26. Matrix fin=x;--y;
  27. while(y){
  28. if(y&1)fin=fin*x;
  29. x=x*x;
  30. y>>=1;
  31. }
  32. return fin;
  33. }
  34. int main(){
  35. IOS;
  36. cin>>n>>m;
  37. for(int i=n;i>=1;i--)cin>>ans.num[i][1];
  38. for(int i=n;i>=1;i--)cin>>basic.num[n][i];
  39. for(int i=2;i<=n;i++)basic.num[i-1][i]=1;
  40. /*cout<<"ans "<<endl;
  41. for(int i=1;i<=n;i++)cout<<ans.num[i][1]<<endl;
  42. cout<<"basic "<<endl;
  43. for(int i=1;i<=n;i++){
  44. for(int j=1;j<=n;j++)cout<<basic.num[i][j]<<" ";
  45. cout<<endl;
  46. }
  47. cout<<endl;*/
  48. m-=n;
  49. basic=basic^m;
  50. ans=basic*ans;
  51. //cout<<"change ans"<<endl;
  52. //for(int i=1;i<=n;i++)cout<<ans.num[i][1]<<endl;
  53. cout<<ans.num[n][1];
  54. return 0;
  55. }

2. 动态规划

动态规划是算好了拿来直接用?/疑惑

2.1 普通DP

https://www.luogu.com.cn/problem/P2530

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  6. using namespace std;
  7. const int N=11;
  8. const int inf=0x3f3f3f3f;
  9. int n,f[N*N][N][N][N];
  10. char a[N*N];
  11. int main(){
  12. cin>>n;
  13. for(int i=1;i<=n;i++)cin>>a[i];
  14. memset(f,inf,sizeof(f));
  15. f[0][0][0][0]=0;
  16. for(int i=1;i<=n;i++)
  17. for(int j=0;j<=10;j++)
  18. for(int k=0;k<=10-j;k++)
  19. for(int l=0;l<=10-j-k;l++){
  20. if(+k+l>10)continue;
  21. if(a[i]=='A'&&j)f[i][j][k][l]=f[i-1][j-1][k][l];
  22. if(a[i]=='B'&&k)f[i][j][k][l]=f[i-1][j][k-1][l];
  23. if(a[i]=='C'&&l)f[i][j][k][l]=f[i-1][j][k][l-1];
  24. f[i][0][k][l]=min(f[i][0][k][l],f[i][j][k][l]+1);
  25. f[i][j][0][l]=min(f[i][j][0][l],f[i][j][k][l]+1);
  26. f[i][j][k][0]=min(f[i][j][k][0],f[i][j][k][l]+1);
  27. }
  28. cout<<f[n][0][0][0];
  29. return 0;
  30. }

https://www.luogu.com.cn/problem/P4398

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  6. using namespace std;
  7. const int N=55;
  8. int n,a[N][N],b[N][N],f[N][N][N][N];
  9. inline int read(){
  10. int s=0,w=1;
  11. char ch=getchar();
  12. while(ch<'0'||ch>'9'){
  13. if(ch=='-')w=-1;
  14. ch=getchar();
  15. }
  16. while(ch<='9'&&ch>='0'){
  17. s=s*10+ch-'0';
  18. ch=getchar();
  19. }
  20. return s*w;
  21. }
  22. int main(){
  23. n=read();
  24. for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)a[i][j]=read();
  25. for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)b[i][j]=read();
  26. int ans=0;
  27. for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
  28. for(int k=1;k<=n;k++)for(int l=1;l<=n;l++){
  29. if(a[i][j]==b[k][l])
  30. f[i][j][k][l]=min(f[i-1][j-1][k-1][l-1],min(f[i][j-1][k][l-1],f[i-1][j][k-1][l]))+1;
  31. ans=max(ans,f[i][j][k][l]);
  32. }
  33. cout<<ans;
  34. return 0;
  35. }

https://www.luogu.com.cn/problem/P2592

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  6. using namespace std;
  7. const int mod=12345678;
  8. int n,m,k,f[155][155][25][25];
  9. inline int read(){
  10. int s=0,w=1;
  11. char ch=getchar();
  12. while(ch<'0'||ch>'9'){
  13. if(ch=='-')w=-1;
  14. ch=getchar();
  15. }
  16. while(ch<='9'&&ch>='0'){
  17. s=s*10+ch-'0';
  18. ch=getchar();
  19. }
  20. return s*w;
  21. }
  22. int main(){
  23. n=read();m=read();k=read();
  24. f[0][0][0][0]=1;
  25. for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)
  26. for(int u=0;u<=k;u++)for(int v=0;v<=k;v++){
  27. int x=f[i][j][u][v];
  28. f[i+1][j][max(u-1,0)][v+1]=(f[i+1][j][max(u-1,0)][v+1]+x)%mod;
  29. f[i][j+1][u+1][max(v-1,0)]=(f[i][j+1][u+1][max(v-1,0)]+x)%mod;
  30. }
  31. int ans=0;
  32. for(int i=0;i<=k;i++)for(int j=0;j<=k;j++)
  33. ans=(ans+f[n][m][i][j])%mod;
  34. cout<<ans;
  35. return 0;
  36. }

2.2 树形DP

https://www.luogu.com.cn/problem/P3698

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  6. using namespace std;
  7. const int N=110;
  8. int n,m,cnt,head[N],f[2][N][N],fa[N];
  9. struct node{
  10. int to,next;
  11. }a[N*2];
  12. inline int read(){
  13. int s=0,w=1;
  14. char ch=getchar();
  15. while(ch<'0'||ch>'9'){
  16. if(ch=='-')w=-1;
  17. ch=getchar();
  18. }
  19. while(ch<='9'&&ch>='0'){
  20. s=s*10+ch-'0';
  21. ch=getchar();
  22. }
  23. return s*w;
  24. }
  25. inline void add(int u,int v){
  26. ++cnt;
  27. a[cnt].to=v;
  28. a[cnt].next=head[u];
  29. head[u]=cnt;
  30. }
  31. inline void pre(int x,int fai){
  32. fa[x]=fai;
  33. for(int i=head[x];i;i=a[i].next){
  34. int v=a[i].to;
  35. if(v==fai)continue;
  36. pre(v,x);
  37. }
  38. }
  39. inline void dfs(int x){
  40. f[0][x][0]=f[1][x][0]=1;
  41. for(int i=head[x];i;i=a[i].next){
  42. int v=a[i].to;
  43. if(v==fa[x])continue;
  44. dfs(v);
  45. for(int j=n;j>=1;j--)
  46. for(int k=0;k<j;k++){
  47. if(j-k>=2)
  48. f[1][x][j]=max(f[1][x][j],f[1][v][k]+f[1][x][j-k-2]),
  49. f[0][x][j]=max(f[0][x][j],f[1][v][k]+f[0][x][j-k-2]);
  50. f[0][x][j]=max(f[0][x][j],f[0][v][k]+f[1][x][j-k-1]);
  51. }
  52. }
  53. for(int i=1;i<=n;i++)
  54. f[0][x][i]=max(f[0][x][i],f[0][x][i-1]),
  55. f[1][x][i]=max(f[1][x][i],f[1][x][i-1]);
  56. }
  57. int main(){
  58. m=read();n=read();
  59. for(int i=1;i<m;i++){
  60. int u,v;
  61. u=read()+1;v=read()+1;
  62. add(u,v);add(v,u);
  63. }
  64. pre(1,0);
  65. //for(int i=1;i<=n;i++)cout<<fa[i]<<" ";cout<<endl;
  66. dfs(1);
  67. cout<<f[0][1][n];
  68. return 0;
  69. }

https://www.luogu.com.cn/problem/P4438

处理树二选一减小空间可以编号处理,每次处理一条链,这样最多需要的编号个数就是链的长度

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  6. using namespace std;
  7. #define int long long
  8. const int N=4e4+10;
  9. const int inf=0x3f3f3f3f;
  10. int n,son[N][2],dfsx[N],f[200][50][50];
  11. struct Satin{
  12. int a,b,c;
  13. }rural[N];
  14. inline int read(){
  15. int s=0,w=1;
  16. char ch=getchar();
  17. while(ch<'0'||ch>'9'){
  18. if(ch=='-')w=-1;
  19. ch=getchar();
  20. }
  21. while(ch<='9'&&ch>='0'){
  22. s=s*10+ch-'0';
  23. ch=getchar();
  24. }
  25. return s*w;
  26. }
  27. inline void dfs(int x,int id,int L,int R){
  28. dfsx[x]=id;
  29. if(x>=n){
  30. for(int i=0;i<=L;i++)
  31. for(int j=0;j<=R;j++)
  32. f[dfsx[x]][i][j]=1ll*rural[x-n+1].c*1ll*(rural[x-n+1].a+i)*1ll*(rural[x-n+1].b+j);
  33. return ;
  34. }
  35. dfs(son[x][0],id+1,L+1,R);dfs(son[x][1],id+2,L,R+1);
  36. for(int i=0;i<=L;i++)
  37. for(int j=0;j<=R;j++)
  38. f[dfsx[x]][i][j]=min(1ll*f[dfsx[son[x][0]]][i][j]+f[dfsx[son[x][1]]][i][j+1],
  39. 1ll*f[dfsx[son[x][0]]][i+1][j]+f[dfsx[son[x][1]]][i][j]);
  40. }
  41. signed main(){
  42. //memset(f,inf,sizeof(f));
  43. n=read();
  44. for(int i=1;i<n;i++){
  45. int u,v;
  46. u=read();v=read();
  47. if(u<0)u=-u+n-1;
  48. if(v<0)v=-v+n-1;
  49. son[i][0]=u;son[i][1]=v;
  50. }
  51. for(int i=1;i<=n;i++)rural[i].a=read(),rural[i].b=read(),rural[i].c=read();
  52. dfs(1,1,0,0);
  53. cout<<f[dfsx[1]][0][0];
  54. return 0;
  55. }

2.3 区间DP

https://www.luogu.com.cn/problem/P4302

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<stack>
  6. #include<queue>
  7. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  8. using namespace std;
  9. const int N=110;
  10. const int inf=0x3f3f3f3f;
  11. int f[N][N],len[N];
  12. string s;
  13. inline int check(int L,int R,int lenth){
  14. for(int i=L;i<=R;i++)if(s[i]!=s[L+(i-L)%lenth])return 0;
  15. return 1;
  16. }
  17. int main(){
  18. cin>>s;
  19. for(int i=1;i<=100;i++){
  20. if(i<10)len[i]=1;
  21. else if(i<100)len[i]=2;
  22. else len[i]=3;
  23. }
  24. int n=s.length();
  25. s=' '+s;
  26. memset(f,inf,sizeof(f));
  27. for(int i=1;i<=n;i++)f[i][i]=1;
  28. for(int l=2;l<=n;l++)
  29. for(int i=1;i+l-1<=n;i++){
  30. int j=i+l-1;
  31. for(int k=i;k<j;k++)f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
  32. for(int k=1;k<l;k++)if(l%k==0)
  33. if(check(i,j,k))f[i][j]=min(f[i][j],f[i][i+k-1]+2+len[l/k]);
  34. }
  35. cout<<f[1][n];
  36. return 0;
  37. }

https://www.luogu.com.cn/problem/P3847

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<set>
  7. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  8. using namespace std;
  9. const int N=3010;
  10. int n,a[N],f[N][N];
  11. int main(){
  12. IOS;
  13. cin>>n;
  14. for(int i=1;i<=n;i++)cin>>a[i];
  15. for(int l=2;l<=n;l++)
  16. for(int i=1;i+l-1<=n;i++){
  17. int j=i+l-1;
  18. if(a[i]==a[j])f[i][j]=f[i+1][j-1];
  19. else f[i][j]=min(f[i+1][j-1],min(f[i][j-1],f[i+1][j]))+1;
  20. }
  21. cout<<f[1][n];
  22. return 0;
  23. }

2.4 概率DP

https://www.luogu.com.cn/problem/P2059

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  7. using namespace std;
  8. const int N=55;
  9. int n,m,a[N];
  10. double f[N][N];
  11. int main(){
  12. cin>>n>>m;
  13. f[1][1]=1.0;
  14. for(int i=1;i<=m;i++)cin>>a[i];
  15. for(int i=2;i<=n;i++){
  16. for(int k=1;k<=m;k++){
  17. int aim=a[k]%i?a[k]%i:i;
  18. for(int j=1;j<i;j++){
  19. aim=aim+1>i?1:aim+1;
  20. f[i][aim]+=f[i-1][j]/(double)m;
  21. }
  22. }
  23. }
  24. for(int i=1;i<=n;i++)printf("%.2lf%% ",f[n][i]*100);
  25. return 0;
  26. }

2.5 二进制优化

https://www.luogu.com.cn/problem/P4095

完全背包

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  7. using namespace std;
  8. #define int long long
  9. const int N=1010;
  10. int n,m,cnt,pre[N*10][N],suf[N*10][N],L[N*10],R[N*10];
  11. struct node{
  12. int cost,val,id;
  13. }a[N*N];
  14. signed main(){
  15. IOS;
  16. cin>>n;
  17. for(int i=1;i<=n;i++){
  18. int cost,val,num;
  19. cin>>cost>>val>>num;
  20. L[i]=cnt;
  21. for(int j=1;j<=num;j*=2){
  22. ++cnt;
  23. a[cnt].cost=cost*j;a[cnt].val=val*j;
  24. a[cnt].id=i;
  25. num-=j;
  26. }
  27. if(num)
  28. a[++cnt].cost=cost*num,a[cnt].val=val*num,a[cnt].id=i;
  29. R[i]=cnt+1;
  30. }
  31. for(int i=1;i<=cnt;i++){
  32. memcpy(pre[i],pre[i-1],sizeof(pre[i-1]));
  33. for(int j=1000;j>=a[i].cost;j--)
  34. pre[i][j]=max(pre[i][j],pre[i-1][j-a[i].cost]+a[i].val);
  35. }
  36. for(int i=cnt;i>=1;i--){
  37. memcpy(suf[i],suf[i+1],sizeof(suf[i+1]));
  38. for(int j=1000;j>=a[i].cost;j--)
  39. suf[i][j]=max(suf[i][j],suf[i+1][j-a[i].cost]+a[i].val);
  40. }
  41. cin>>m;
  42. for(int i=1;i<=m;i++){
  43. int limit,maxn;
  44. cin>>limit>>maxn;
  45. ++limit;
  46. int ans=0;
  47. for(int j=0;j<=maxn;j++)
  48. ans=max(ans,pre[L[limit]][j]+suf[R[limit]][maxn-j]);
  49. cout<<ans<<endl;
  50. }
  51. return 0;
  52. }

3. 基础算法

3.1 贪心

https://www.luogu.com.cn/problem/UVA1344

田忌告诉我说他不想赛马!

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  6. using namespace std;
  7. const int N=1024;
  8. int n,a[N],b[N],ans=0;
  9. inline int read(){
  10. int s=0,w=1;
  11. char ch=getchar();
  12. while(ch<'0'||ch>'9'){
  13. if(ch=='-')w=-1;
  14. ch=getchar();
  15. }
  16. while(ch<='9'&&ch>='0'){
  17. s=s*10+ch-'0';
  18. ch=getchar();
  19. }
  20. return s*w;
  21. }
  22. int main(){
  23. freopen("uva1344.out","w",stdout);
  24. while(~scanf("%d",&n)&&n){
  25. for(int i=1;i<=n;i++)a[i]=read();
  26. for(int j=1;j<=n;j++)b[j]=read();
  27. sort(a+1,a+n+1);
  28. sort(b+1,b+n+1);
  29. ans=0;
  30. int aL=1,bL=1,aR=n,bR=n;
  31. for(int i=1;i<=n;i++){
  32. if(a[aR]>b[bR])ans+=200,--aR,--bR;
  33. else if(a[aR]<b[bR])ans-=200,++aL,--bR;
  34. else if(a[aL]>b[bL])ans+=200,++aL,++bL;
  35. else{
  36. if(a[aL]<b[bR])ans-=200;
  37. ++aL,--bR;
  38. }
  39. }
  40. cout<<ans<<endl;
  41. }
  42. return 0;
  43. }

https://www.luogu.com.cn/problem/P3963

那啥,实际上咱可以用单调队列水的……

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  7. using namespace std;
  8. #define int long long
  9. const int N=2e5+10;
  10. typedef long long ll;
  11. int n,m,W,ai[N];
  12. ll summaxn,summinn,maxn[N],minn[N];
  13. struct node{
  14. int score,val;
  15. bool operator <(const node &b)const{
  16. return score<b.score;
  17. }
  18. }a[N];
  19. priority_queue<int>qmaxn;
  20. priority_queue<int>qminn;
  21. signed main(){
  22. IOS;
  23. cin>>m>>n>>W;
  24. for(int i=1;i<=n;i++)cin>>a[i].score>>a[i].val,ai[i]=a[i].score;
  25. sort(ai+1,ai+n+1);
  26. int len=unique(ai+1,ai+n+1)-ai-1;
  27. for(int i=1;i<=n;i++)a[i].score=lower_bound(ai+1,ai+len+1,a[i].score)-ai;
  28. sort(a+1,a+n+1);
  29. //cout<<"sort "<<endl;
  30. //for(int i=1;i<=n;i++)cout<<a[i].score<<" "<<a[i].val<<endl;
  31. int ans=-1;
  32. for(int i=1;i<=n;i++){
  33. while(qminn.size()>m/2)summinn-=qminn.top(),qminn.pop();
  34. minn[i]=summinn;
  35. summinn+=a[i].val,qminn.push(a[i].val);
  36. }
  37. for(int i=n;i>=1;i--){
  38. while(qmaxn.size()>m/2)summaxn-=qmaxn.top(),qmaxn.pop();
  39. maxn[i]=summaxn;
  40. summaxn+=a[i].val,qmaxn.push(a[i].val);
  41. }
  42. /*cout<<"minn"<<endl;
  43. for(int i=1;i<=n;i++)cout<<minn[i]<<" ";cout<<endl;
  44. cout<<"maxn"<<endl;
  45. for(int i=1;i<=n;i++)cout<<maxn[i]<<" ";cout<<endl;*/
  46. for(int i=m/2+1;i<=n-m/2;i++)if(minn[i]+a[i].val+maxn[i]<=W)ans=ai[a[i].score];
  47. cout<<ans;
  48. return 0;
  49. }

https://www.luogu.com.cn/problem/P3845

又是奶牛挤奶,但我依旧48pts,望天,心好累,心好塞~

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  7. using namespace std;
  8. const int N=1010;
  9. int t,n,top;
  10. struct node{
  11. int x,y;
  12. bool operator <(const node &b)const{
  13. return y==b.y?x<b.x:y<b.y;
  14. }
  15. }a[N],endi[N];
  16. int main(){
  17. IOS;
  18. cin>>t;
  19. while(t--){
  20. memset(&endi,0,sizeof(endi));
  21. top=0;
  22. cin>>n;
  23. for(int i=1;i<=n;i++){
  24. cin>>a[i].x>>a[i].y;
  25. a[i].y*=-1;
  26. if(a[i].x>a[i].y)swap(a[i].x,a[i].y);
  27. }
  28. sort(a+1,a+n+1);
  29. //cout<<"sort "<<endl;
  30. //for(int i=1;i<=n;i++)cout<<a[i].x<<" "<<a[i].y<<endl;
  31. top=1;
  32. endi[1]=a[1];
  33. for(int i=2;i<=n;i++){
  34. int flag=0;
  35. for(int j=1;j<=top;j++){
  36. if(a[i].x>=endi[j].x){
  37. endi[j]=a[i];
  38. flag=1;
  39. break;
  40. }
  41. }
  42. if(!flag)endi[++top]=a[i];
  43. }
  44. cout<<top<<endl;
  45. }
  46. return 0;
  47. }

3.2 递推

https://www.luogu.com.cn/problem/P3856

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  7. using namespace std;
  8. #define int long long
  9. const int N=110;
  10. int f[N][N][N],lastia[N],lastib[N],lastic[N];
  11. char a[N],b[N],c[N];
  12. signed main(){
  13. scanf("%s",a+1);scanf("%s",b+1);scanf("%s",c+1);
  14. int lena=strlen(a+1),lenb=strlen(b+1),lenc=strlen(c+1);
  15. for(int i=1;i<=lena;i++){
  16. lastia[a[i]-'a'+1]=i;
  17. memset(lastib,0,sizeof(lastib));
  18. for(int j=1;j<=lenb;j++){
  19. lastib[b[j]-'a'+1]=j;
  20. memset(lastic,0,sizeof(lastic));
  21. for(int k=1;k<=lenc;k++){
  22. lastic[c[k]-'a'+1]=k;
  23. for(int d=1;d<=26;d++){
  24. int ai=lastia[d],bi=lastib[d],ci=lastic[d];
  25. if(!ai||!bi||!ci)continue;
  26. f[i][j][k]+=f[ai-1][bi-1][ci-1]+1;
  27. //利用容斥原理,反正就是把各种情况分别揪出来
  28. //一共有26种,也就是分别以26种英文字母结尾
  29. //而且没揪出来一种就额外多增加一种子串——原来重复的字母+1
  30. //并且以前被更新过的数组不会被重复更新
  31. //这是递推
  32. }
  33. }
  34. }
  35. }
  36. cout<<f[lena][lenb][lenc];
  37. return 0;
  38. }

4.图论

4.1 Tarjan(强连通分量)

https://www.luogu.com.cn/problem/P4306

注意:

最后计算总数的时候要给点边计算边染色,否则会出现有两个点都连接到同一个

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<stack>
  6. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  7. using namespace std;
  8. const int N=2010;
  9. int n,cnt,tot,head[N],sizei[N],belong[N],vis[N],low[N],dfn[N],ind;
  10. int cnti,headi[N],ru[N],fin[N];
  11. struct node{
  12. int from,to,next;
  13. }a[N*N],ai[N*N];
  14. stack<int>stacki;
  15. inline int read(){
  16. int s=0,w=1;
  17. char ch=getchar();
  18. while(ch<'0'||ch>'9'){
  19. if(ch=='-')w=-1;
  20. ch=getchar();
  21. }
  22. while(ch<='9'&&ch>='0'){
  23. s=s*10+ch-'0';
  24. ch=getchar();
  25. }
  26. return s*w;
  27. }
  28. inline void add(int u,int v){
  29. ++cnt;
  30. a[cnt].from=u;
  31. a[cnt].to=v;
  32. a[cnt].next=head[u];
  33. head[u]=cnt;
  34. }
  35. inline void addi(int u,int v){
  36. ++cnti;
  37. ai[cnti].from=u;
  38. ai[cnti].to=v;
  39. ai[cnti].next=headi[u];
  40. headi[u]=cnti;
  41. }
  42. inline void Tarjan(int x){
  43. low[x]=dfn[x]=++ind;
  44. stacki.push(x);
  45. vis[x]=1;
  46. for(int i=head[x];i;i=a[i].next){
  47. int v=a[i].to;
  48. if(!dfn[v]){
  49. Tarjan(v);
  50. low[x]=min(low[x],low[v]);
  51. }else if(vis[v])low[x]=min(low[x],dfn[v]);
  52. }
  53. int k=0;
  54. if(low[x]==dfn[x]){
  55. ++tot;
  56. do{
  57. k=stacki.top();stacki.pop();
  58. vis[k]=0;
  59. belong[k]=tot;
  60. ++sizei[tot];
  61. }while(k!=x);
  62. }
  63. }
  64. inline void dfs(int x,int fa){
  65. fin[x]=sizei[x];
  66. for(int i=headi[x];i;i=ai[i].next){
  67. int v=ai[i].to;
  68. if(v==fa)continue;
  69. if(vis[v])continue;
  70. vis[v]=1;
  71. dfs(v,x);
  72. fin[x]+=fin[v];
  73. }
  74. }
  75. int main(){
  76. n=read();
  77. for(int i=1;i<=n;i++){
  78. string s;cin>>s;
  79. for(int j=1;j<=n;j++)if(s[j-1]=='1')add(i,j);
  80. }
  81. for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i);
  82. /*cout<<"belong "<<endl;
  83. for(int i=1;i<=n;i++)cout<<belong[i]<<" ";cout<<endl;
  84. cout<<"sizei "<<endl;
  85. for(int i=1;i<=tot;i++)cout<<sizei[i]<<" ";cout<<endl;
  86. cout<<"addi "<<endl;*/
  87. for(int i=1;i<=cnt;i++)
  88. if(belong[a[i].from]!=belong[a[i].to])
  89. addi(belong[a[i].from],belong[a[i].to]),++ru[belong[a[i].to]];//,cout<<belong[a[i].from]<<" "<<belong[a[i].to]<<endl;
  90. //if(cnti==0)return cout<<n*n,0;
  91. //cout<<"ru "<<endl;
  92. //for(int i=1;i<=tot;i++)cout<<ru[i]<<" ";cout<<endl;
  93. memset(vis,0,sizeof(vis));
  94. for(int i=1;i<=tot;i++)if(!ru[i])dfs(i,i);
  95. int ans=0;
  96. //cout<<"fin "<<endl;
  97. for(int i=1;i<=tot;i++)ans+=fin[i]*sizei[i];//,cout<<fin[i]<<" ";cout<<endl;
  98. cout<<ans;
  99. return 0;
  100. }
  101. /*
  102. 5
  103. 01000
  104. 00110
  105. 10000
  106. 00000
  107. 00010
  108. ans 15
  109. */

4.2 DFS

https://www.luogu.com.cn/problem/P3848

对于暴搜,我选择把它转化成图再暴搜/斜眼笑/手动狗头

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  7. using namespace std;
  8. const int N=1e4+10;
  9. int n,start,endi,cnt,top,head[N],id[110][110],mapi[110][110],vis[N];
  10. long long ans;
  11. struct node{
  12. int to,next,val;
  13. }a[N*200];
  14. inline int read(){
  15. int s=0,w=1;
  16. char ch=getchar();
  17. while(ch<'0'||ch>'9'){
  18. if(ch=='-')w=-1;
  19. ch=getchar();
  20. }
  21. while(ch<='9'&&ch>='0'){
  22. s=s*10+ch-'0';
  23. ch=getchar();
  24. }
  25. return s*w;
  26. }
  27. inline void add(int u,int v,int w){
  28. ++cnt;
  29. a[cnt].to=v;
  30. a[cnt].val=w;
  31. a[cnt].next=head[u];
  32. head[u]=cnt;
  33. }
  34. inline void dfs(int x,long long tot){
  35. ans=max(ans,tot);
  36. for(int i=head[x];i;i=a[i].next){
  37. int v=a[i].to;
  38. if(vis[v])continue;
  39. vis[v]=1;
  40. dfs(v,tot+a[i].val);
  41. vis[v]=0;
  42. }
  43. }
  44. int main(){
  45. n=read();start=read();endi=read();
  46. //cout<<"add "<<endl;
  47. for(int i=1;i<=n;i++){
  48. int lasti=0,x=0,y=0;
  49. for(int j=1;j<=n;j++){
  50. mapi[i][j]=read();
  51. if(!mapi[i][j])id[i][j]=++top;
  52. if(!mapi[i][j]&&!lasti)lasti=id[i][j],x=i,y=j;
  53. else if(!mapi[i][j]&&lasti){
  54. int val=abs(x-i)+abs(y-j);
  55. if(val<=1)goto aa;
  56. add(lasti,top,val);add(top,lasti,val);
  57. //cout<<lasti<<" "<<top<<" "<<val<<endl;
  58. aa:
  59. lasti=top,x=i,y=j;
  60. }
  61. }
  62. }
  63. for(int j=1;j<=n;j++){
  64. int lasti=0,x=0,y=0;
  65. for(int i=1;i<=n;i++){
  66. if(id[i][j]&&!lasti)lasti=id[i][j],x=i,y=j;
  67. else if(id[i][j]&&lasti){
  68. int val=abs(x-i)+abs(y-j);
  69. if(val<=1)goto bb;
  70. add(lasti,id[i][j],val);add(id[i][j],lasti,val);
  71. //cout<<lasti<<" "<<id[i][j]<<" "<<val<<endl;
  72. bb:
  73. lasti=id[i][j],x=i,y=j;
  74. }
  75. }
  76. }
  77. /*cout<<"id "<<endl;
  78. for(int i=1;i<=n;i++){
  79. for(int j=1;j<=n;j++)cout<<id[i][j]<<" ";
  80. cout<<endl;
  81. }
  82. cout<<endl;*/
  83. vis[id[start][endi]]=1;
  84. dfs(id[start][endi],0);
  85. cout<<ans;
  86. return 0;
  87. }

2021.12.16 eleveni的刷题记录的更多相关文章

  1. 2021.12.21 eleveni的刷题记录

    2021.12.21 eleveni的刷题记录 0. 有意思的题 P6701 [POI1997] Genotype https://www.luogu.com.cn/problem/P6701 状压优 ...

  2. 2021.12.19 eleveni的刷题记录

    2021.12.19 eleveni的刷题记录 0. 本次记录有意思的题 0.1 每个点恰好经过一次并且求最小时间 P2469 [SDOI2010]星际竞速 https://www.luogu.com ...

  3. [BUUCTF-Pwn]刷题记录1

    [BUUCTF-Pwn]刷题记录1 力争从今天(2021.3.23)开始每日至少一道吧--在这里记录一些栈相关的题目. 最近更新(2021.5.8) 如果我的解题步骤中有不正确的理解或不恰当的表述,希 ...

  4. 攻防世界Web刷题记录(新手区)

    攻防世界Web刷题记录(新手区) 1.ViewSource 题如其名 Fn + F12 2.get post 3.robots robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个 ...

  5. 刷题记录:[CISCN2019 东北赛区 Day2 Web3]Point System

    目录 刷题记录:[CISCN2019 东北赛区 Day2 Web3]Point System 知识点 1.padding-oracle attack 2.cbc字节翻转攻击 3.FFMpeg文件读取漏 ...

  6. 刷题记录:[CISCN 2019 初赛]Love Math

    目录 刷题记录:[CISCN 2019 初赛]Love Math 思路一 思路二 总结 刷题记录:[CISCN 2019 初赛]Love Math 题目复现链接:https://buuoj.cn/ch ...

  7. 刷题记录:[De1ctf] shell shell shell

    目录 刷题记录:[De1ctf] shell shell shell 一.知识点 1.源码泄露 2.正则表达式不完善导致sql注入 3.soapclient反序列化->ssrf 4.扫描内网 5 ...

  8. 刷题记录:[LCTF]bestphp's revenge

    目录 刷题记录:[LCTF]bestphp's revenge 一.知识点 1.SoapClient触发反序列化导致ssrf 2.serialize_hander处理session方式不同导致sess ...

  9. 刷题记录:[SUCTF 2019]CheckIn

    目录 刷题记录:[SUCTF 2019]CheckIn 一.涉及知识点 1.利用.user.ini上传\隐藏后门 2.绕过exif_imagetype()的奇技淫巧 二.解题方法 刷题记录:[SUCT ...

随机推荐

  1. ZYNQ SGI、PPI、SPI三种中断的实例(含代码)

    ZYNQ中断分为3类: SGI(Software Generated Interrupts)软件中断 PPI(Private Peripheral Interrupts)私有外设中断 SPI(Shar ...

  2. 如果一个service服务出现异常,无响应,如何定位,定位过程

    假设一个service服务出现异常,要如何定位

  3. Linux服务器上搭建Centos7.0+Apache+php+Mysql网站

    一.安装Linux系统 1.1虚拟机搭建Linux Centos7.0版本,搭建过程省略. 二. 安装apache.php.mysql.php-gd等组件. 2.1安装Apache服务程序(apach ...

  4. 记录Markdown的学习

    目录 1. 引言 2. 标题 这是一级标题 这是二级标题 这是三级标题 这是四级标题 3. 文字相关 3.1 粗体 3.2 斜体 3.3 粗体和斜体 3.4 删除线 3.5 混合使用 3.6 反引号引 ...

  5. 如何移植sqlite3到嵌入式平台

    本人也时常看其他人的blog,搜索资料的目的是尽快解决当前的问题,例如如何移植一个ssh,尽快要明白所需的东西,方能移植完成. 移植sqlite3的步骤如下: 1. 到官方网站下载指定的源码包:htt ...

  6. 什么是 Daemon 线程?它有什么意义?

    所谓后台(daemon)线程,是指在程序运行的时候在后台提供一种通用服务的线 程,并且这个线程并不属于程序中不可或缺的部分.因此,当所有的非后台线程 结束时,程序也就终止了,同时会杀死进程中的所有后台 ...

  7. JVM的基础知识

    一.JVM的基础知识 1.JVM内存结构: 1.JVM堆内存结构: 2.JVM内存分配: 3.Java的堆机构和垃圾回收: 4.Jvm堆内存配置参数: 5.JVM新生代概念和配置: 6.JVM老生代概 ...

  8. jsp报错问题之“使用jstl的c标签choose报错Illegal text inside "c:choose" tag问题”

    一.报错 [bessky_it][ERROR][2022-03-25 17:19:07] | PLATFORM | ):[c]鍜孾/com.bessky.pss.portal/purchase/sam ...

  9. (stm32f103学习总结)—ADC模数转换实验

    一.STM32F1 ADC介绍 TM32F103 系列一般都有 3 个 ADC,这些 ADC 可以独立使用,也可 以使用双重(提高采样率).STM32F1 的 ADC 是 12 位逐次 逼近型的模拟数 ...

  10. C语言 | 栈的应用 | 非递归栈实现快排

    /* 非递归栈实现快排 */ #include <stdio.h> #include <math.h>> #include <malloc.h> #inclu ...