3.25 考试
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.25 考试相关的知识,希望对你有一定的参考价值。
又是考得惨不忍睹的一次 最近这个状态真的是……
1.简单的数列
不想怎么说的一道题目 无奈qwq
考场忘开longlong痛失30分
可以显然发现这是个跟求逆序对那类题目有些相似的玩意儿
考场想到了树状数组 然而实在是忘得差不多QAQ
!注意 近期不能只往前赶了!还要时不时复习一下之前的!
可以显然发现这是个跟求逆序对那类题目有些相似的玩意儿
考场想到了树状数组 然而实在是忘得差不多QAQ
!注意 近期不能只往前赶了!还要时不时复习一下之前的!
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<string> 7 #define ll long long 8 #define db double 9 #define N 60000 10 using namespace std; 11 int n; 12 int a[N],q[N*4]; 13 ll c[2][N]; 14 int lowbit(int x){ 15 return x&(-x); 16 } 17 void update(int x){ 18 while (x<=32770){ 19 q[x]++; 20 x+=lowbit(x); 21 } 22 } 23 int query(int x){ 24 int ans=0; 25 while (x>0){ 26 ans+=q[x]; 27 x-=lowbit(x); 28 } 29 return ans; 30 } 31 int main(){ 32 scanf ("%d",&n); 33 int x; 34 ll ans=0; 35 memset(q,0,sizeof(q)); 36 for (int i=1;i<=n;++i) scanf ("%d",&x),a[i]=x+1; 37 for (int i=1;i<=n;++i){ 38 c[0][i]=query(a[i]-1); 39 update(a[i]); 40 } 41 memset(q,0,sizeof(q)); 42 for (int i=n;i>=1;--i){ 43 c[1][i]=query(a[i]-1); 44 update(a[i]); 45 } 46 for (int i=1;i<=n;++i) ans+=c[0][i]*c[1][i]; 47 printf ("%lld\n",ans); 48 return 0; 49 }
2.黄金矿工
啊一看到这题脑子里就是以前写的那个采油的
于是丝毫不带脑子地n^4前缀和加枚举
然后看了看范围就知道肯定卡不过
直接弃疗
正解就是一个裸的最大子矩阵和
大体思想相当于是进行压维 试想 把一个矩阵挤扁了 那不就变成一个序列了吗
于是这个问题就被转化了为了我们熟悉的最大连续子序列的问题啦
预处理每一列的和,再之后就可以变成n三方的问题了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<string> 7 #define ll long long 8 #define db double 9 #define N 400 10 #define inf -9000010 11 using namespace std; 12 int n; 13 ll w[N][N],s[N][N],p[N]; 14 int main(){ 15 scanf ("%d",&n); 16 for (int i=1;i<=n;++i) 17 for (int j=1;j<=n;++j){ 18 scanf ("%lld",&w[i][j]); 19 if (!w[i][j]) w[i][j]=inf; 20 s[i][j]=s[i-1][j]+w[i][j]; 21 } 22 ll mx=inf*1000; 23 for (int i=0;i<n;++i) 24 for (int j=i+1;j<=n;++j){ 25 memset(p,0,sizeof(p)); 26 for (int k=1;k<=n;++k) p[k]=max(s[j][k]-s[i][k],s[j][k]-s[i][k]+p[k-1]); 27 for (int k=1;k<=n;++k) mx=max(mx,p[k]); 28 } 29 if (mx<=10) mx=10; 30 printf ("%lld\n",mx-10); 31 return 0; 32 }
3.旅行
本次考试最神的一题
考场傻逼dfsT到飞起
苦思20分钟无果 滚去瞄题解
居然是并查集!!!看完不由得拍桌大叫
妙啊!
主要思想是抓住了n比较少和分数只跟两个值有关的特性
可以对最小值进行枚举 然后再随意地塞边连图 如果成功了就记下最大值
(因为之前有排序操作 所以我们找到的最大值肯定是相对而言最小的)
根据这题我们可以建立一种简化与抓要点的思维:一是抓数据范围的特性,很多时候数据就在暗示着什么,二是抓最后求的值到底与什么相关,如两个值相互影响时就可以枚举其一以求出另一个
最后请让我再喊一声
妙啊23333333
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<string> 7 #define ll long long 8 #define db double 9 #define N 6000 10 #define inf 100000000 11 using namespace std; 12 int n,m,tot=0,s,t,a1,a2; 13 int head[N*4],vis[N*2],f[N]; 14 db ans=inf; 15 struct hh{ 16 int x,y,z; 17 }b[N*4]; 18 int gcd(int x,int y){return y==0?x:gcd(y,x%y);} 19 int find(int x){return x==f[x]?x:f[x]=find(f[x]);} 20 bool cmp(hh a,hh b){return a.z<b.z;} 21 int main(){ 22 scanf ("%d%d",&n,&m); 23 for (int i=1;i<=n;++i) f[i]=i; 24 int x,y,z; 25 for (int i=1;i<=m;++i){ 26 scanf ("%d%d%d",&x,&y,&z); 27 int f1=find(x),f2=find(y); 28 if (f1!=f2) f[f1]=f2; 29 b[++tot].x=x,b[tot].y=y,b[tot].z=z; 30 } 31 scanf ("%d%d",&s,&t); 32 if (find(s)!=find(t)){printf ("IMPOSSIBLE\n") ; return 0; } 33 sort(b+1,b+m+1,cmp); 34 for (int k=1;k<=m;++k){ 35 int l; 36 bool fl=0; 37 for (int i=1;i<=n;++i) f[i]=i; 38 for (int i=k;i<=m;++i){ 39 int f1=find(b[i].x),f2=find(b[i].y); 40 if (f1!=f2) f[f1]=f2; 41 if (find(s)==find(t)){ 42 l=i; 43 fl=1; 44 break; 45 } 46 } 47 if (fl){ 48 db q=(b[l].z+0.0)/(b[k].z+0.0); 49 if (q<ans) ans=q,a1=b[l].z,a2=b[k].z; 50 } 51 } 52 int q=gcd(a1,a2); 53 a1/=q,a2/=q; 54 if (a2==1) printf ("%d\n",a1); 55 else printf("%d/%d\n",a1,a2); 56 return 0; 57 }
4.牛跑步
明摆着的a* 可是我也明摆着没看过a*(可能会被老师打死)
于是上bfs 想到了优先队列将一个什么长排一下(其实还是看过一点a*的)
但是代码功力感人 瞬间放弃
等会儿再来实现qwq
这次考试我还是一如既往地辣鸡呀?_?
有一点小无奈 但也没什么意外的
最近这几天状态的确有点问题 再加上我的基础以及思维能力都弱得一麻批qwq
所以嘛……之后还是要努力啦!
真是不想再当菜鸡了哼! !!!!
这次考试我还是一如既往地辣鸡呀?_?
有一点小无奈 但也没什么意外的
最近这几天状态的确有点问题 再加上我的基础以及思维能力都弱得一麻批qwq
所以嘛……之后还是要努力啦!
真是不想再当菜鸡了哼! !!!!
以上是关于3.25 考试的主要内容,如果未能解决你的问题,请参考以下文章