SDWC补题计划
2018的寒假去了SD的冬令营,因为一班二班难度悬殊,对我很不友好,几乎什么也没学会,但是我把两个班的课件都存了下来,现在慢慢把两个班的例题以及课后题都补一补(毕竟冬令营的钱不能白花)。
这些题目横跨各大知名题库以及一大批外国题库,以至于我注册了一批新账号......
基础班Day1:
这一天的课事实上我并没有去听,而是去二班考试并愉快的爆零了,幸好不大难,自己看也能学会。
Day1主要讲了队列,栈,堆,(加权)并查集。还提出了“因为数组也是数据结构,所以一切题目都是数据结构题”的精彩言论。
UVA514 Rails:https://www.luogu.org/problemnew/show/UVA514
题目概述:(火车,铁轨,车厢……)有一个无限大的栈,按照1-n的顺序依次入栈,询问是否能生成给定的出栈序。
栈的题目,模拟。以前练习初赛时见过这种题的手画版本...事实上也就是那个思路。如果现在想让一个数出栈,可是它还没入栈,就不停的入栈直到它入栈后再弹出;如果它已经在栈里,则必须是栈顶,否则就无法生成这个序列。这题在洛谷上难度虚高,主要是读入很奇妙;输出时如果n将要变化了,要换行,样例里却没换,导致很容易wa。
# include <cstdio>
# include <iostream>
# include <cstring> using namespace std; int n;
int a[],sta[],h=,q=,s=; int main()
{
scanf("%d",&n);
while (n)
{
memset(a,,sizeof(a));
scanf("%d",&a[]);
while (a[]!=)
{
for (int i=;i<=n;i++)
scanf("%d",&a[i]);
q=s=;
h=;
for (int i=;i<=n;++i)
{
while(s<=a[i])
sta[++h]=s++;
while(sta[h]==a[q])
q++,h--;
}
if(s!=n+||h!=||q!=n+)
printf("No\n");
else
printf("Yes\n");
scanf("%d",&a[]);
}
printf("\n");
scanf("%d",&n);
}
return ;
}
Rails
NOI2001 食物链:https://www.luogu.org/problemnew/show/P2024
题目概述:有三种动物,食物关系竟然形成了一个环(好不科学啊),给出一些描述:A被B吃,A吃B,A与B是同类,默认先说的话是正确的,并以此判断一共有几句假话。
这大概是加权并查集最著名的习题了,也可以不用加权做,注意一下加权并查集的路径压缩,还是挺容易写错的。(做完这个题,你的并查集就算入门了---loli)
int father(int x)
{
if (x!=f[x])
{
int aa=father(f[x]);
v[x]=(v[x]+v[f[x]])%;
f[x]=aa;
}
return f[x];
}
加权并查集_路径合并
有一个地方一定要想清楚,在同一个并查集里的元素并不一定是同种生物,只是可以确定相对的关系,如果这里明白了也就比较简单了。
带权并查集的集合合并也别写错啦...就是解一个方程。

# include <cstdio>
# include <iostream> using namespace std; int f[]={},v[]={}; int n,k,x,y,z,S=; int father(int x)
{
if (x!=f[x])
{
int aa=father(f[x]);
v[x]=(v[x]+v[f[x]])%;
f[x]=aa;
}
return f[x];
} bool Ya(int x,int y,int z)
{
int a=father(y);
int b=father(z);
if (a==b)
{
if(x==)
{
if(v[y]==v[z]) return true;
return false;
}
if (x==)
{
if(v[z]-v[y]!=-&&v[z]-v[y]!=) return false;
return true;
}
}
if (a!=b)
{
if(x==)
{
v[b]=(v[y]-v[z]+)%;
f[b]=a;
}
if (x==)
{
v[b]=(v[y]-v[z]+)%;
f[b]=a;
}
return true;
}
} int main()
{
scanf("%d%d",&n,&k);
for (int i=;i<=n;i++)
{
f[i]=i;
v[i]=;
}
for (int i=;i<=k;i++)
{
scanf("%d%d%d",&x,&y,&z);
if (z>n||y>n)
S++;
else
if (y==z&&x==) S++;
else
if (Ya(x,y,z)==false) S++;
}
printf("%d",S);
return ;
}
食物链
合并果子:https://www.luogu.org/problemnew/show/P1090
题意概述:合并两堆果子的代价是两堆重量之和,要求将n堆果子合并成一堆,求最小代价。
贪心的想一想发现每次选最小的两堆合并就是最优的。用堆是可以的,也可以用两个队列:首先排序作为第一个队列,每次新合并出来的放进第二个队列末尾,两个队列都是单调的,如果再用一个桶排序就可以达到$O(N)$,但是懒得写...
# include <cstdio>
# include <iostream> using namespace std; int a,H[]={},r=,n,po,M,t; void push(int x)
{
po=++r;
while(x<H[po/])
{
H[po]=H[po/];
po=po/;
}
H[po]=x;
} void Heapify(int x)
{
M=x;
if (r>=x*+&&H[M]>H[x*+]) M=x*+;
if (r>=x*&&H[M]>H[x*]) M=x*;
if (M!=x)
{
t=H[x];
H[x]=H[M];
H[M]=t;
Heapify(M);
}
} void pop()
{
if (r==)
{
H[]=;
r=;
return;
}
H[]=H[r--];
Heapify();
} int main()
{
int x,y,S=;
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d",&a);
push(a);
}
for (int i=;i<n;i++)
{
x=H[]; pop();
y=H[]; pop();
S+=x+y;
push(x+y);
}
cout<<S;
return ;
}
合并果子
蚯蚓:https://www.luogu.org/problemnew/show/P2827
题意概述:有n根蚯蚓,每次选出一根最长的切成给定比例的两段,同时其他的蚯蚓长度增加一个常数,求每次被切断的蚯蚓长度。
首先可以反着想,认为是被剪了的蚯蚓长度减少一个常数,就可以用堆维护了,听起来非常棒,而且很符合今天的上课内容,然而T掉了。那么正解是什么呢?和上一道题一样,又是队列...因为我们是用缩短长度的做法做的,所以每次取出的最长蚯蚓的长度是单调递减的,又因为比例相同,所以切成的两段也是递减的,所以就是三个递减的队列了。
# include <cstdio>
# include <iostream>
# include <algorithm>
# include <cstring>
# define R register int using namespace std; int h_1=,t_1=,h_2=,t_2=,h_3=,t_3=,n,m,q,t;
long long x_1,x_2,x,u,v;
long long q_1[],q_2[],q_3[],ans;
const int inf=-1e8; bool cmp(long long a,long long b)
{
return a>b;
} int main()
{
scanf("%d%d%d%lld%lld%d",&n,&m,&q,&u,&v,&t);
memset(q_1,,sizeof(q_1));
memset(q_2,,sizeof(q_2));
memset(q_3,,sizeof(q_3));
for (R i=;i<=n;++i)
scanf("%lld",&q_1[i]);
sort(q_1+,q_1++n,cmp);
for (R i=;i<=m;++i)
{
if(q_1[h_1]>=q_2[h_2]&&q_1[h_1]>=q_3[h_3])
x=q_1[h_1++];
else if(q_2[h_2]>=q_1[h_1]&&q_2[h_2]>=q_3[h_3])
x=q_2[h_2++];
else if(q_3[h_3]>=q_2[h_2]&&q_3[h_3]>=q_1[h_1])
x=q_3[h_3++];
x=x+(i-)*q;
if(i%t==) printf("%lld ",x);
x_1=u*x/v;
x_2=x-x_1;
q_2[++t_2]=x_1-i*q;
q_3[++t_3]=x_2-i*q;
}
printf("\n");
for (R i=;i<=n+m;++i)
{
if(q_1[h_1]>=q_2[h_2]&&q_1[h_1]>=q_3[h_3])
ans=q_1[h_1++];
else if(q_2[h_2]>=q_1[h_1]&&q_2[h_2]>=q_3[h_3])
ans=q_2[h_2++];
else if(q_3[h_3]>=q_2[h_2]&&q_3[h_3]>=q_1[h_1])
ans=q_3[h_3++];
if(i%t==) printf("%lld ",ans+m*q);
}
return ;
}
蚯蚓
Largest Rectangle in a Histogram:http://poj.org/problem?id=2559
Open Gold - Trapped in the Haybales:https://www.lydsy.com/JudgeOnline/problem.php?id=4099
这在bzoj上是个权限题,usaco上肯定有,然而我找不到。。。下次借个权限号做。
基础班Day2:我把课件弄丢啦!!有好心人给我一份吗!
基础班Day3:
深搜、广搜,虽然是基础算法但是也有不少难题呢。
基础班Day4:
贪心,dp。
基础班Day5:
数论,倍增。
基础班Day6:
线段树与树状数组。
提高班Day1:
线段树,主席树。
提高班Day2:
数论。
提高班Day3:
计算几何。
提高班Day4:
动规及优化。
提高班Day5:
Splay,Lct,链剖,网络流,图论题目选讲。
提高班Day6:(老师跑路了没上课)
补完这些还有每天的考试题,也都是很好的题,感觉任务艰巨。
---shzr
SDWC补题计划的更多相关文章
- bzoj3208: 花神的秒题计划Ⅰ
3208: 花神的秒题计划Ⅰ Time Limit: 16 Sec Memory Limit: 128 MBSubmit: 323 Solved: 211[Submit][Status] Desc ...
- hdu5017:补题系列之西安网络赛1011
补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...
- 2017河工大校赛补题CGH and 赛后小结
网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- [数]补题ver.
上次补题好像把两次训练混在一起了,总之先按时间顺序补完这一次|ू・ω・` ) HDU-6301 不会的东西不能逃避.jpg 红小豆非常讨厌构造题,因为非常不会,并且非常逃避学习这类题,因为总也搞不清楚 ...
- [TaskList] 省选前板子补完计划
省选前本子补完计划 [ ] 带权并查集 [ ] 树上莫队 - UOJ58 [WC2013]糖果公园 loj2485「CEOI2017」Chase
- OSPF补全计划-0 preface
哇靠,一看日历吓了我一跳,我这一个月都没写任何东西,好吧,事情的确多了点儿,同事离职,我需要处理很多untechnical的东西,弄得我很烦,中间学的一点小东西(关于Linux的)也没往这里记,但是我 ...
- bzoj 前100题计划
bzoj前100题计划 xz布置的巨大的坑.. 有空填题解... 1002 轮状病毒 用python手动matrixtree打表. #include<bits/stdc++.h> #def ...
随机推荐
- vue常见知识点整理
什么是 mvvm? MVVM 是 Model-View-ViewModel 的缩写.mvvm 是一种设计思想.Model 层代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑:View ...
- Netty面试
声明:此文章非本人所 原创,是别人分享所得,如有知道原作者是谁可以联系本人,如有转载请加上此段话 1.BIO.NIO 和 AIO 的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要 ...
- mybatis之Sql语句构建器
SQL类: 方法 描述 SELECT(String) SELECT(String...) 开始或插入到 SELECT子句. 可以被多次调用,参数也会添加到 SELECT子句. 参数通常使用逗号分隔的列 ...
- before(),after(),prepend(),append()等新DOM方法简介
一.DOM API也在不断升级 web前端标准一直在不断升级,比方说,说了很多年的HTML5.CSS3,以及天天见的ES6. 然后,似乎就没有然后了.实际上,除了HTML5/CSS3/ES6+,关于D ...
- js小练习-移除数组中的元素
移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回 代码: <!DOCTYPE HTML><html> <he ...
- ASP.NET MVC 简单事务添加
ASP.NET MVC 简单事务 //实例化查询上下文 using ( BookStoreEntities db = new BookStoreEntities()) { //找到需要价格和名称的数据 ...
- SQL Server 2017搭建主从备份
SQL Server 2017搭建主从¶ 关于日志传输¶ 和Oracle DG,Mysql主从一样,SQL Server也支持主从的高可用.进一步提高数据的安全性和业务的高可用.通过将主库上的日志传输 ...
- 简单侧边栏js效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux中文字体
◆ 背景说明 报表,在windows下,展现.导出都正常,在linux下,字体变大了.比如,单元格的大小设计好后,里面的字当好能一行显示完,将报表放到linux下后,字变大了,一行显示不完了,变 ...
- MQTT介绍(3)java模拟MQTT的发布,订阅
MQTT目录: MQTT简单介绍 window安装MQTT服务器和client java模拟MQTT的发布,订阅 在此强调一下mqtt的使用场景: 1.不可靠.网络带宽小的网络 2.运行的设备CPU. ...