CSP17

news/2024/9/21 22:30:48/文章来源:https://www.cnblogs.com/wlesq/p/18352402

请注意:题目背景与题目可能没有关系
image
第一题,性质题,找到序列的最大值与最小值,我们发现如果只有正数的话和只有负数的话都很好处理,正数正序处理类似前缀加,负数后缀加,那如果正负都有,该怎么办呢?其实我们可以吧序列全变为正的或负的吧,但是需要比较一下最大值最小值,如果都变成正的话,对被卡掉,例如1 1 1 1 1 1 1 1 -1e9就死了

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define pb push_back
#define ull unsigned long long
#define pii pair<int,int>
#define lid (rt<<1)
#define rid (rt<<1|1)
#define pii pair<int,int>
using namespace std;
const int N = 1e5+5;
ll n,a[N],b[N];int cnt;
vector <pii> put;
void zh(int l,int r)
{for(int i=l;i<r;i++){if(a[i]<=a[i+1])continue;a[i+1]+=a[i];put.pb({i,i+1});cnt++;}
}
void fu(int l,int r)
{for(int i=r;i>l;i--){if(a[i]>=a[i-1])continue;a[i-1]+=a[i];put.pb({i,i-1});cnt++;			}
}
int main()
{speed();// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n;for(int i=1;i<=n;i++){cin>>a[i];b[i]=a[i];}sort(b+1,b+1+n);if(b[1]>=0){zh(1,n);cout<<cnt<<endl;for(auto [l,r]:put){cout<<l<<" "<<r<<endl;}}else{if(b[n]<=0){fu(1,n);cout<<cnt<<endl;for(auto [l,r]:put){cout<<l<<" "<<r<<endl;}}else{ll mx=b[n],pos=max_element(a+1,a+1+n)-a;ll mi=b[1],pp=min_element(a+1,a+1+n)-a;if(mx>-mi){for(int i=n;i;i--){int st=i;while(a[st]<=0&&st>0){a[st]+=mx;put.pb({pos,st});if(mx<a[st]){mx=a[st];pos=st;}cnt++;st--;}}// for(int i=1;i<=n;i++)cout<<a[i]<<" ";zh(1,n);// for(int i=1;i<=n;i++)cout<<a[i]<<" "cout<<cnt<<endl;for(auto [l,r]:put){cout<<l<<" "<<r<<endl;}				}else{for(int i=n;i;i--){int st=i;while(a[st]>=0&&st>0){a[st]+=mi;put.pb({pp,st});if(mi>a[st]){mi=a[st];pp=st;}cnt++;st--;}}// for(int i=1;i<=n;i++)cout<<a[i]<<" ";fu(1,n);// for(int i=1;i<=n;i++)cout<<a[i]<<" "cout<<cnt<<endl;for(auto [l,r]:put){cout<<l<<" "<<r<<endl;}			}}}// for(int i=1;i<n;i++)// {// 	if(a[i]>a[i+1])// 	{// 		cout<<i<<" "<<a[i]<<" "<<a[i+1]<<endl;// 		cout<<"Wa"<<endl;// 		return 0;// 	}// }return 0;
}

image
这题,如果直接用暴力矩阵乘法的话是\(O(n^3)\),显然过不了,但我们可以发现一个性质,就是我们可以随机一个\(n\times 1\)矩阵,值得注意的是矩阵不满足交换律,但是\(randP \times A\times B \equiv randP\times C\)矩阵由\(n^2\)转换为\(n\)
这样我们就转换为\(O(n^2)\)的复杂度了

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define pb push_back
#define ull unsigned long long
#define pii pair<int,int>
#define lid (rt<<1)
#define rid (rt<<1|1)
using namespace std;
const ll mod=998244353;
ll n;
mt19937 seed(random_device{}());
int rand(int l,int r)
{uniform_int_distribution<int>range(l,r);return range(seed);
}
struct Matrix
{vector <vector<ll>> a;int n,m;Matrix(int _n,int _m):n(_n),m(_m){a.resize(n+1,vector<ll>(m+1));}void resize(int n,int m){a.resize(n+1,vector<ll>(m+1));}Matrix operator * (const Matrix& A)const{Matrix ans(n,1);for(int i=1;i<=n;i++)for(int j=1;j<=A.m;j++)for(int k=1;k<=m;k++)ans.a[i][j]=(ll)(ans.a[i][j]+(ll)a[i][k]*A.a[k][j]*1ll%mod)%mod;return ans;}void T(){cout<<"******"<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)cout<<a[i][j]<<" ";cout<<endl;}}
};
int main()
{speed();// freopen("sequence2.in","r",stdin);freopen("in.in","r",stdin);freopen("out.out","w",stdout);int T;cin>>T;while(T--){cin>>n;Matrix A(n,n),B(n,n),C(n,n),b(n,1);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>A.a[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>B.a[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>C.a[i][j];for(int i=1;i<=n;i++)b.a[i][1]=rand(1,16);// b.T();C=C*b;// C.T();b=B*b;//这里注意啊,为什么这么写A*(B*b)=C*b// b.T();b=A*b;// b.T();bool f=1;for(int i=1;i<=n;i++){if(!f)break;for(int j=1;j<=1;j++){if(b.a[i][j]!=C.a[i][j]){f=0;break;}}}if(f)cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}

image

这题暴力分就是二维背包,考场上这都能写挂,挂了35分

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define pb push_back
#define ull unsigned long long
#define pii pair<int,int>
#define lid (rt<<1)
#define rid (rt<<1|1)
using namespace std;
const int N = 1e4+5;
short n,A,B;short dp[N][N];
struct ac
{short a,b;
}q[N];
int ans;
bool vis[N];
void dfs(int a,int b,int cnt)
{if(a>A||b>B){ans=max(ans,cnt);return;}for(int i=1;i<=n;i++){if(vis[i])continue;vis[i]=1;dfs(a+q[i].a,b+q[i].b,cnt+1);vis[i]=0;}	
}
int main()
{speed();// freopen("construct2.in","r",stdin);// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n>>A>>B;short mx=0;for(int i=1;i<=n;i++){cin>>q[i].a>>q[i].b;mx=max(q[i].a,mx);mx=max(q[i].b,mx);}mx=max(mx,A);mx=max(mx,B);// dfs(0,0,0);int ans=0;for(int i=1;i<=n;i++){for(int j=mx;j>=q[i].a;j--){for(int k=mx;k>=q[i].b;k--){// if(j>=A&&j-q[i].a>=A)continue;// if(k>=B&&k-q[i].b>=B)continue;dp[j][k]=max<short>(dp[j][k],dp[j-q[i].a][k-q[i].b]+1);// if(j>=A&&j-q[i].a>=A)continue;// if(k>=B&&k-q[i].b>=B)continue;ans=max<short>(ans,dp[j][k]);// cout<<j<<" "<<k<<" "<<dp[j][k]<<endl;}}}// for(int i=0;i<=mx;i++)ans=max(ans,dp[A][i]);// for(int i=0;i<=mx;i++)ans=max(ans,dp[i][B]);cout<<dp[A][B]+(dp[A][B]!=n)<<endl;return 0;
}

正解
考虑到\(O(nV^2)\)\(V\)太大了,我们可以换一种枚举方式,换成\(f_{i,j,k}\)枚举前\(i\)人中选了\(j\)个人,\(A\)值为多少,复杂度为\(O(n^2V)\)这样就可以过了

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define pb push_back
#define ull unsigned long long
#define pii pair<int,int>
#define lid (rt<<1)
#define rid (rt<<1|1)
using namespace std;
const int N = 1e4+5;
int n,A,B,dp[2][85][N];
struct ac
{int a,b;
}q[N];
bool cmp(ac a,ac b)
{return a.b<b.b;
}
int ans;
bool vis[N];int main()
{speed();// freopen("construct2.in","r",stdin);// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n>>A>>B;int mx=0;for(int i=1;i<=n;i++){cin>>q[i].a>>q[i].b;mx=max(q[i].a,mx);mx=max(q[i].b,mx);}mx=max(mx,A);mx=max(mx,B);memset(dp,0x3f,sizeof dp);dp[0][0][0]=0;;for(int i=1;i<=n;i++){for(int j=0;j<=i;j++){for(int v=A;v>=0;v--){dp[i&1][j][v]=dp[(i-1)&1][j][v];if(j>=1&&v>=q[i].a)dp[i&1][j][v]=min(dp[i&1][j][v],dp[(i-1)&1][j-1][v-q[i].a]+q[i].b);// cout<<dp[i][j][v]<<endl;}}}for(int j=1;j<=n;j++)for(int v=A;v>=0;v--)if(dp[n&1][j][v]<=B)ans=max(ans,j);cout<<min(ans+1,n)<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/781315.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

丰富有趣的颜色空间

颜色空间就像是一套套颜色语言,其将视觉上的颜色以数字的形式定义表示,使其能够准确描述某个颜色简介 颜色是视觉的表现,而自然界的颜色是多姿多彩的,如果让我们用语言描述一个自然界的颜色,有些人可能会用红橙黄绿蓝靛紫,外加一些修饰词,但它不太能够准确的描述一个颜色…

Struts2基础1--创建一个Struts2 Web应用程序

Struts2不仅仅是Struts1 的升级版本,更是一个全新的Struts架构,是当前较为普及和成熟的基于MVC设计模式的Web应用程序框架,并在RIA(Rich Internet Applications)Web应用程序开发中得到了广泛应用,成为最好的Web框架之一。本文将通过详细的步骤来说明如何下载获取相关资源…

STM32学习记录(九):RTC

RTC框图 实时时钟(Real-time clock: RTC)是一个独立的计时器。RTC提供一组连续运行的计数器,可以与合适的软件一起使用,以提供时钟日历功能。可以写入计数器值以设置系统的当前时间/日期。可以选择以下三种作为RTC时钟源:HSE时钟进行128分频 LSE振荡器时钟 LSI振荡器时钟有关…

炒鸡好用的Markdown语法

简介 Markdown是一种轻量级标记语言,它最初由John Gruber和Aaron Swartz在2004年共同创建,可以通过简单、纯文本的语法,快速构建格式化、排版精美的文档。其可与HTML混编,可导出为HTML、PDF、Word等格式的文件 Markdown可以让作者更多地关注内容本身而非格式排版。同样的内…

Arweave区块链私有化部署

Arweave区块链私有化部署Arweave区块链主打数据永久存储,即保存在区块链的数据永久存在、不可篡改。公链主网络arweave.N.1在2024年8月11日累计产生了148万个区块(见下截图所示),区块还在不断产生,大约2分钟产生一个区块。Arweave区块链可以在Ubuntu 22.04LTS或Ubuntu 24.04…

多线程复习总结

1基本概念 1什么是进程什么是线程 进程:是程序执行一次的过程,他是动态的概念,是资源分配的基本单位。一个应用程序(1个进程是一个软件)。 线程:一个进程可以有多个线程,线程是cpu调度的单位,一个进程中的执行场景/执行单元。 对于java程序来说,当在DOS命令窗口中输入…

kubernetes-POD的基本原理

目录什么是POD?POD有以下特点:为什么使用POD作为最小单元,而不是container为什么允许一个POD里有多个容器POD中如何管理多个容器POD的yaml格式定义配置文件说明如何使用PodPOD的持久性和终止Pause我们首先在节点上运行一个pause容器然后再运行一个nginx容器,nginx将为localh…

【投资认知】- 2024Q1的英伟达NVIDIA

来自关注的Twitter博主@ZeevyInvesting 💡 Investing visuals | 📜 One-pager analysis | 📈 Tech portfolio updates | 🥊 Business Battles来源:https://twitter.com/ZeevyInvesting/status/1801691822705512947名词解释CAGR:复合年增长率(Compound Annual Grow…

【1.0版】【MYSQL安全】sql注入系列:基于报错的 SQL 盲注

主题 sql注入:基于报错的 SQL 盲注一、Floor报错注入1.1 floor 函数1.2 rand函数 1.3 count(*) 1.4 floor函数实际利用二、extractvalue函数三、updatexml函数:同extractvalue本来网页是不显示信息的,但是我们可以构造 payload 让信息通过错误提示回显出来一、Floor报错注入…

CISC和RISC

CISC的特点RISC的特点CISC和RISC的比较如何分辨CISC和RISCCISC的指令不定长,RISC的指令都是定长的 RISC中只有Load\Store类指令可以访问主存

P1502 窗口的星星 题解

题目传送门。 思路 扫描线 扫描线 首先,将题目中给出的条件和问题进行转化: 首先先不考虑边框上的点不算在内的限制,考虑一个点可以对那些矩形产生贡献。 只考虑矩形的右上角,容易发现,每个星星的亮度只对右上角在以星星为左下角的长为 \(W\),高为 \(H\)的矩形有贡献。 如…