好吧,半个学期的模拟赛弱的要死。。。
这篇博客也是应 A J AJ AJ常写博客的要求写的,里面汇聚了半学期总结,文化课成绩和各次模拟赛总分,欢迎点出不足!
名称 | 练习题 |
---|---|
HASH | https://blog.csdn.net/xuxiayang/article/category/7475732 |
并查集(复习) | https://blog.csdn.net/xuxiayang/article/category/7384280 |
最大匹配 | https://blog.csdn.net/xuxiayang/article/category/7569752 |
离散 | https://blog.csdn.net/xuxiayang/article/category/7596185 |
线段树 | https://blog.csdn.net/xuxiayang/article/category/7579490 |
科目 | 分数 | 班排 | 级排 |
---|---|---|---|
语文 | 105 | 19 | 不重要(其实是忘了)\ |
数学 | 117 | 3 | 不重要 |
英语 | 111.5 | 5 | 不重要 |
政治 | 96 | 5 | 不重要 |
历史 | 83(砸了) | 9 | 不重要 |
地理 | 99 | 1 | 2 |
生物 | 95 | 3 | 不重要 |
总分 | 706.5 | 3 | 30 |
总的来说,反正感觉这次考试很玄,进步的几率大约为 30 30% 30,退步可能很大,反正我上次也没考好QAQ
不算好,不算差
前两次倒数,第三次水了格第一,然后又徘徊在中间。。。
倒数第二一次水了第四还是第五,总之我50分被cena吃了,要不然估计是第三。。。
最后一次水了个T3,据说最难的是第一题
在洛谷上刷了一个比赛,练习了很多题,这半个学期总算把试练场刷到23了
第八周
日期 | 事件 | 刷的题 |
---|---|---|
Day 0 星期日 | 晚自修 | 无 |
Day 1 星期一 | 讲试卷 | 模拟赛 |
Day 2 星期二 | 讲试卷 | 快速幂 |
Day 3 星期三 | 做题 | 线段树 |
Day 4 星期四 | 讲树状数组 | 无 |
Day 5 星期五 | 做树状数组 | 线段树,Stars,Cows |
Day 6 星期六 | 期中模拟赛 | Apple Tree和模拟赛的题 |
好吧,这次水了个Rank3。第一题绝对最难
题目 | 时间复杂度 | 空间复杂度 | 编程复杂度 |
---|---|---|---|
第一题 排名 | O ( n l o g n ) O(nlogn) O(nlogn) | O ( 5 n ) O(5n) O(5n)~ O ( 6 n ) O(6n) O(6n) | O ( O( O(玄学 ) ) ) |
第二题 简写单词 | O ( n 3 ) O(n^3) O(n3) | O ( n 2 ) O(n^2) O(n2) | O ( O( O(简单 ) ) ) |
第三题 联通块 | O ( n 2 + m ) O(n^2+m) O(n2+m) | O ( n 2 ) O(n^2) O(n2) | O ( O( O(较难 ) ) ) |
第四题 条形图 | O ( n 2 × l e n ) O(n^2\times len) O(n2×len)~ O ( n 3 × l e n ) O(n^3\times len) O(n3×len)取决于三维或二维,len是高精度数组长度 | O ( n 2 × l e n ) O(n^2\times len) O(n2×len) | O ( O( O(普通 ) ) ) |
没有思路
没有大意
玄学破题
#include
#include
#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
using namespace std;int n;
struct node
{
int chinese,math,english,computer,marank;//不懂英文的可以忽略这些
}a[51];
int read()
{
char c;int d=1,f=0;
while((c=getchar())<48||c>57)if(c=='-')d=-1;f=(f<<3)+(f<<1)+c-48;
while((c=getchar())>=48&&c<=57) f=(f<<3)+(f<<1)+c-48;
return d*f;
}
bool cmpm(node x,node y){return x.math>y.math;}//排数学成绩
bool cmpc(node x,node y){return x.computer>y.computer;}//排电脑成绩
int main()
{
n=read();
for(int i=1;i<=n;i++) {a[i].chinese=read();a[i].math=read();a[i].english=read();a[i].computer=read();}
sort(a+1,a+1+n,cmpm);
for(int i=1;i<=n;i++) a[i].marank=i;
sort(a+1,a+1+n,cmpc);//排序
for(int i=1;i<=n;i++)
printf("%4d%5d%5d%5d%5d%5d \n",a[i].chinese,a[i].math,a[i].english,a[i].computer,a[i].marank,i);//输出
}
给每个单词简写,但不允许是其它单词的前缀
暴力模拟
#include
#include
#include
#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
using namespace std;int n,len=51;string s[51];bool ok;int tf;
string kc;
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];//输入
string z;
for(int i=1;i<=n;i++)
{
z=kc;//清空
for(int j=0;j<s[i].size();j++)
{
z+=s[i][j];tf=0;//先加上
for(int k=1;k<=n;k++)
{
if(i==k) continue;
if(s[k].find(z)==0) {tf=1;break;}//查找,判断
}
if(!tf) {cout<<z<<endl;break;}//输出简化后的单词
}
}
}
若相邻的颜色相同的格子视为一个联通块,求每次涂色后联通快的个数
终于来并查集了
一波并查集判断轻松AC
#include
#define k(i,j) (i-1)*n+j//降维
#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
using namespace std;int n,m,f[250001],b[501][501],x,i,j,ans,p,q;
const short dx[4]={-1,0,1,0};
const short dy[4]={0,1,0,-1};//四个方向
int read()
{
char c;int d=1,f=0;
while((c=getchar())<48||c>57)if(c=='-')d=-1;f=(f<<3)+(f<<1)+c-48;
while((c=getchar())>=48&&c<=57) f=(f<<3)+(f<<1)+c-48;
return d*f;
}
void write(int x)
{
if(x>9) write(x/10);putchar(x%10+48);
}
void writeln(int x)
{
write(x);putchar(10);
}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
void judge(int x,int y){f[find(x)]=find(y);return;}
bool check(int x,int y){return find(x)==find(y);}//并查集
int main()
{
n=read();m=read();
for(int i=1;i<=n*n;i++) f[i]=i;
while(m--)
{
x=read();i=read();j=read();x++;ans++;//因为数组初始是0,所以把它+1就可以避免初始化
for(int l=0;l<4;l++)
{
p=i+dx[l];q=j+dy[l];
if(p<1||q<1||p>n||q>n) continue;//爆范围返回
if(b[p][q]!=x) continue;//颜色不同返回
if(check(k(p,q),k(i,j))) continue;//已连接返回
judge(k(p,q),k(i,j));ans--;//连一条少一个联通块
}
b[i][j]=x;//赋值
writeln(ans);//输出
}
}
一个矩阵,第一行最多放 n n n个*,第二行最多 n − 1 n-1 n−1,以此类推,设下行的*必须比上行少,求方案数
dp
设 f [ i ] [ j ] f[i][j] f[i][j]表示计算到第 i i i行第 j j j个时的方案数,轻松得出动态转移方程
f [ i ] [ j ] = f [ i − 1 ] [ j ] + f [ i ] [ j − 1 ] f[i][j]=f[i-1][j]+f[i][j-1] f[i][j]=f[i−1][j]+f[i][j−1]
最后把所有的 f [ n ] [ i ] f[n][i] f[n][i]加在一起即为答案
注意:数据很大,要用高精度
#include
#include
#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
using namespace std;int n,ans[61],f[101][101][61];
void newmain()
{
int g=0,h=0;
for(int i=1;i<=n;i++)
{
f[i][0][60]=1;//记得初始化
for(int j=1;j<=i;j++)
{
g=0;
for(int k=60;k>0;k--)
{
f[i][j][k]=(f[i-1][j][k]+f[i][j-1][k]+g)%10;
g=(f[i-1][j][k]+f[i][j-1][k]+g)/10;//高精度
}
}
}
g=0;
for(int i=1;i<=n;i++)
for(int k=60;k>0;k--)//最后一行加起来
{
h=ans[k]+f[n][i][k]+g;
ans[k]=h%10;
g=h/10;
}
int j=1;
while(!ans[j]) j++;
for(int i=j;i<=60;i++) putchar(ans[i]+48);//输出
}
int main()
{
scanf("%d",&n);
if(n==1) printf("1");else
if(n==2) printf("4");else
if(n==3) printf("13");else
if(n==4) printf("41");else
if(n==5) printf("131");else
if(n==6) printf("428");else
if(n==7) printf("1429");else
if(n==8) printf("4861");else
if(n==9) printf("16795");else
if(n==10)printf("58785");else
if(n==11)printf("208011");else
if(n==12)printf("742899");else
if(n==13)printf("2674439");else
if(n==14)printf("9694844");else
if(n==16)printf("129644789");else
if(n==17)printf("477638699");else//哈,你问我为什么打表,因为我不想删之前深搜打出来的规律。。。
if(n==18)printf("1767263189");else{newmain();return 0;}
}
#尾声
这半个学期来,学习到了许多新知识,做了许多题。总的感觉有喜有悲,在我们这一届的相互帮助下,我们都有了很大的提升,特别是我们的dalao——WYC同学在 G D O I GDOI GDOI成功被虐题
帮他打个广告:
GDOI2018《被虐记》
https://blog.csdn.net/mr_wuyongcong/article/details/80210617
最后希望在剩下半个学期继续努力,拿到更好的成绩!
##最后附图