10.2

考试:

1.数位DP 或者找规律

2.SB题,扫一遍找最大最小即可

3.莫比乌斯反演

出题人相出个数论和数据结构的综合题,但是找不到NOIP级别的,没办法只能忍痛割爱出个莫比乌斯,话说回来,莫比乌斯要是会了,其他的应该也就会了……(吧

看这个操作 1 n d v

相当于 \(a[x] += v[\gcd(x,n)=d]\)

\(v[\gcd(x,n) = d] = v [\gcd(\frac{x}{d},\frac{n}{d})=1] = v\sum\limits_{k|\gcd(\frac{x}{d},\frac{n}{d})} \mu(k) = v\sum\limits_{k|\frac{x}{d},k|\frac{n}{d}} \mu(k)\)

\(=\sum\limits_{k|\frac{n}{d},kd|x} v\mu(k)\)

如果按照操作来说我们现在其实就是枚举了所有的 \(\frac{n}{d}\) 的约数 \(k\), 然后枚举所有 \(kd\) 的倍数,对应位置加上 \(v\mu(k)\) 就行了。 查询 \(O(1)\) 查询

但是这样修改的复杂度太大,查询的复杂度太低,不妨让修改的时候枚举约数,查询的时候也枚举约数。也即我们修改的时候,新开一个数组 \(f\),枚举约数之后只让 \(kd\) 加上 \(v\mu(k)\) 查询的时候查询\(\sum\limits_{i=1}^n\sum\limits_{d|i} f(d)=\sum\limits_{d=1}^n f(d)\lfloor \frac{n}{d}\rfloor\)

后面的东西跟根号分块就行了,前面的东西始终是个区间和,单点修改区间求和,使用树状数组就可以了

时间复杂度$O(q\sqrt{l}\log l+ l \log l) $

4.代码:

int mu[N],prime[N],vis[N],cnt,tot,p[N],l,m,val[N];
void add(int x,int v){
while(x<=l){
val[x]+=v; x+=x&(-x);
}
}
int ask(int pos){
int sum=0;
while(pos){
sum+=val[pos];
pos-=pos&(-pos);
}
return sum;
}
void yilin()
{
mu[1]=1;
for(int i=2;i<=200000;i++){
if(!vis[i]){
prime[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=-mu[i];
}
}
}
int main(){
yilin();
while(1){
memset(val,0,sizeof(val));
printf("Case #%lld:\n",++tot);
l=read(); m=read();
if(l==0 && m==0)break;
for(int i=1;i<=m;i++){
int opt,n,d,v; opt=read();
if(opt==1){
n=read(); d=read(); v=read();
if(n%d!=0)continue;
for(int k=1; k*k<=(n/d); k++)
{
if((n/d)%k==0)add(k*d,v*mu[k]);
if(k*k!=n/d)add( d*( (n/d)/k ),v*mu[(n/d)/k]);
}
}
else{
x=read();
int ans=0;
for(int l=1,r;l<=x;l=r+1){
r=min(x,x / (x / l));
ans+=(x/l) * ((ask(r)-ask(l-1));
}
printf("5d\n",ans);
}
}
}
}

5.裴蜀定理

\(ax+by=m\)有整数解时当且仅当m是\(gcd(a,b)\)的倍数。裴蜀等式有解时必然有无穷多个整数解,每组解x、y都称为裴蜀数,可用扩展欧几里得算法求得。

例如,12和42的最大公约数是6,则方程\(12x+42y=6​\)有解。事实上有(-3)×12 + 1×42 = 6及4×12 + (-1)×42 =6。特别来说,方程 ax+by=1 有整数解当且仅当整数a和b互素。

6.数论分块

整除分块快速处理:\(\huge\sum_{i=1}^{n}{\lfloor \frac{n}{i} \rfloor}\)

通过打表找规律,可以发现 特定块的\(\lfloor \frac{n}{i} \rfloor\)的值是相同的,假设起始位置为l,那么结束位置\(\lfloor \frac{n}{\lfloor \frac{n}{l}\rfloor} \rfloor\)

for(int l=1,r;l<=x;l=r+1){
r=min(x,x / (x / l));
ans+=(x/l) * ((ask(r)-ask(l-1));}

10.3

BZOJ 4879

对于每个点分三种情况

  • 没走过这个点,有颜色,无解
  • 走过这个点,有颜色,那么最早时刻在最后一次经过这个点之后
  • 走过这个点,没颜色,那么最晚时刻在最后一次经过这个点之后

原问题变为了求最后一次经过某个点的时间

倒过来做变成第一次经过某个点的时间

一次操作无非就是横着擦一下或者竖着擦一下,先只考虑横着擦一下,我们把原图从上到下,从左到右编号,那么每次操作相当于把原序列中没有数字的部分都抹成某个数字,这个题就变成了BZOJ 疯狂的馒头,直接并查集找最右面的点就 OK 了

还有竖着的怎么半?分两次做,一次只做横着的,从上到下从左到右编号,一次只做竖着的从左到右从上到下编号,两次答案取交集就可以了

时间复杂度 \(O(\text{union-find-set})\)

即使你写的是 \(n\log n\) 也能通过测试数据,但是 \(set\) 模拟的做法大概率会 T

​ 可以用最小生成树,建边从0~n.

10.4

1.能量项链 考虑中间的十分,每种颜色值出现了两次我们可以在一种颜色出现第一次的时候 +1, 出现第二次的时候 -1,那么前缀和相等的一对点一定可以成为一对分割点 ,如果颜色出现了不止一次的话,+1,-1显然不行

所以我们可以每次加减一个不同的很大整数来避免重复。

2.动态规划,每次倒着扫就行

3.树剖加DP

​ 考虑这样一个问题,要怎么样的点才能满足三个点两两距离相等呢?

1、存在三个点有共同的 \(lca\)。

2、存在一个点,使得它到它两颗不同的子树种两点的距离为 \(d\) 且它存在 \(d\) 级祖先。

\(f(x,i)\) 表示以 \(x\) 为根的子树中,距离 \(x\) 为 \(i\) 的点数

\(g(x,i)\) 表示以 \(x\) 为根的子树中, 形如下图的的 \((a,b)\) 数量

其中 \(d\) 可以是任意值(说白了就是都考虑进去),或者说只要在上面街上一个长度为 \(i\) 的边就可以构成一个合法的三元组。

考虑转移,枚举 \(x\) 的下一个儿子 \(u\)

\(g(x,i) += f(x,i)\times f(u,i-1) + g(u,i+1)\)

\(f(x,i) += f(u,i-1)\)

4.线段树 [POI2015]KIN 看电影

10.5

1.旅行者和火把问题,首先贪心有两种方式,一种是每次最快的运一个人再回来,第二种是前两个人先过去,最快的送火把回来,然后两个最慢的过去,次快的再回来,这样是运两个人,动态规划维护这个贪心,设\(f[x]\)是从最后运到x位置的最小代价

第一种方案:\(a[1]+a[i]+f[i+1]\)

第二种方案:\(f[i+2]+a[1]+2*a[2]+a[i+1]\)

所以方程:\(f[i]=min(a[1]+a[i]+f[i+1],f[i+2]+a[1]+2*a[2]+a[i+1]);\)

注意特判,因为给出的按升序排列,所以当\(n<=2\)时直接输出\(a[n]\).

2.动态规划,

设\(g[l][r][i][j]\)为将l~r删至剩下的数的最小值为i,最大值为j,的最小代价。

\(f[l][r]\)为将l~r的序列全部删掉的最小总代价。

可以离散化一下

\(g[l][r][min(i,w[r])][max(j,w[r])]=g[l][r-1][i][j]\) 和前面的l~r-1放到一起删。

\(g[l][r][i][j]=min(g[l][r][i][j],g[l][k][i][j]+f[k+1][r])\) 和后面的k+1~r作为被包含子区间删去。

\(f[l][r]=g[l][r][i][j]+a+b*(j-i)^2\)

3.动态DP,

这个DP在树上进行,考虑轻重链剖分,设\(f[i]\)为以i 为跟的字数满足条件的最小总代价

\(f[i]=\text{min}(v[i],\sum\limits_{i\to j}f[j])\)

由于需要DDP,所以转化为

设y 为x的重儿子,x的所有轻儿子的f之和为g[x],则有\(f[x]=\text{min}(v[x],f[y]+g[x])\)

接下来可以用矩阵转移这个东西,每个叶子结点的代价已知

0 f[u] * 0 a[x] = 0 f[x]

​ \(\infty\) g[x]

第二行的转移结果不考虑

10.6

10.7

1.每次选三个,直接枚举所有情况,看哪个更优

2.概率DP

3.开一个bitset即可

代码:

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<bitset>
#define N 10005
#define M 100005
using namespace std;
bitset<N> to[N];
bitset<N> vis,quan;
int f[N][N],a[N],n,m,ans=2147483647;
int main()
{
n=read(); m=read();
for(int i=1;i<=n;i++)quan[i]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)f[i][j]=2147483647;
int x,y,c;
for(int i=1;i<=m;i++)
{
x=read();y=read();c=read();
if(f[x][y]==2147483647)a[x]++;
to[x][y]=1;
f[x][y]=min(f[x][y],c);
}
int mx;
for(int i=1;i<n;i++)
for(int j=i;j<=n;j++)
{
mx=0;
if(a[i]+a[j] < n)continue;
vis=to[i]|to[j];
if(vis != quan)continue;
for(int k=1;k<=n;k++) mx=max(mx,min(f[i][k],f[j][k]));
if(mx)ans=min(ans,mx);
}
if(ans==2147483647)puts("No solution");
else printf("%d\n",ans);
}
/*
4 13
1 1 1
1 2 3
1 3 3
1 4 5
2 1 2
2 2 1
2 3 2
3 1 4
3 3 4
3 4 1
4 1 2
4 2 3
4 4 3
*/

对拍

while( ((double)clock()-yilr) / CLOCKS_PER_SEC < 0.75) dfs(1,0,++dep);

CLOCKS_PER_SEC 这个常数在Windows下等于1000

迭代加深搜会用

对拍程序:

#include<cstdio>
#include<ctime>
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
int T=0;
while(1)
{
double t1=clock();
system("F:\\random.exe");
double t2=clock();
system("F:\\baoli.exe");
double t3=clock();
system("F:\\sol.exe");
if(system("fc F:\\baoli.out F:\\sol.out"))
{
puts("yelir doesn't love you");
break;
}
else
printf("yelir love you,测试点 %d 总时间 %.0f",++T,(clock()-t1)/1000.0 );
}
return 0;
}
#include<cstdlib>
#include<cstdio>
#include<ctime>
using namespace std;
int main()
{
int T = 0;
while(1)
{
double ti = clock();
system("F:\\random.exe");
double st = clock();
system("F:\\baoli.exe");
double ed = clock();
system("F:\\sol.exe");
if (system("fc F:\\baoli.out F:\\sol.out")) {
puts("Wrong Answer");
return 0;
}
else
{
printf("Accepted, 测试点 #%d, 用时 %.0lfms 总用时 %.0lfs\n", ++ T, ed - st, (clock() - ti) / 1000);
}
}
}

各种排序

稳定的排序:

插入排序(直接插,二分插),冒泡排序,归并排序,基数排序,

不稳定的排序:

希尔排序,堆排序,快速排序,选择排序

yelir

1.注意撞关键字,比如next, end,y1,y2,x1,x2,j1,j2

2.注意超空间,时间问题,卡评测要专业

qsing2

1.是一道物理题,分三种情况,从高到低,从低到高,平跳,推式子即可

2.回声也就说明重复,可证最多重复一千次,然后建一棵Tire树,每次加入前查询,不必配直接返回即可。

3.线段树,当前点若没有人则赋为inf,单点修改,最后一问,可维护一下区间有多少学生,线段树区间求和即可,注意最后要从tail向前扫,因为他到队尾后还可能向队尾走,而且不一定总的队长为n+m,可能更长,而且注意build传参的范围,不是n,而是n+m.

#define N 20050
using namespace std;
int tr[20005005][2];
char s[2000];
int ans,tot,n;
inline void Insert(){
int k = 0;
for(int i = 0;i <= 1000;i ++){
int o = s[i] - '0';
if(!tr[k][o]) tr[k][o] = ++ tot;
k = tr[k][o];
}
}
inline int Ask() {
int k = 0,res = 0;
for(int i = 0;i <= 1000;i ++) {
int o = s[i] - '0';
if(!tr[k][o]) {
return res;
}
else k = tr[k][o],res ++;
}
return res;
}
int main() {
scanf("%d",&n);
for(int i = 1;i <= n;i ++) {
scanf("%s",s);
int len = strlen(s),cnt = 0;
for(int j = len;j <= 1000;j ++)
s[j] = s[cnt],cnt = (cnt + 1) % len;
ans = max(ans,Ask()); Insert();
}
printf("%d\n",ans);
fclose(stdin); fclose(stdout);
return 0;
}

CSP考前总结的更多相关文章

  1. CSP考前复习

    前言 因为loceaner太菜了,他什么东西都不会 所以他打算学一个东西就记录一下 不过因为他很菜,所以他不会写原理-- 而且,他希望在2019CSP之前不会断更 就酱紫,就是写给他自己的--因为他太 ...

  2. NOIP&CSP 考前 Dev-cpp 的选项问题和考试心态

    (进入考场后您将获得一个崭新的 \(Dev-cpp\),没有中文,没有编译选项,没有缺省源:我还将获得一个崭新的脑子,没有心态,没有智商,没有调试能力--) 中文 \[Step1 \] \[Step2 ...

  3. csp考前

    T1不会太麻烦,不行心里多说几遍"沙比提,沙比提".就做出来了. 后天就要出发了,可是我感觉不到长进---- 可能又学一年是个不明智的想法,退役预定.

  4. 2019.11.11 洛谷月赛t3

    题目背景 由于Y校的老师非常毒瘤,要求\(zhouwc\)在\(csp\)考前最后\(3\)天参加期中考,\(zhouwc\)非常生气,决定消极考试,以涂完卡但全错为目标.现在\(retcarizy\ ...

  5. 洛谷 P5640 【CSGRound2】逐梦者的初心

    洛谷 P5640 [CSGRound2]逐梦者的初心 洛谷传送门 题目背景 注意:本题时限修改至250ms,并且数据进行大幅度加强.本题强制开启O2优化,并且不再重测,请大家自己重新提交. 由于Y校的 ...

  6. 2019/11/12 CSP模拟赛&&考前小总结

    写在前面的总结 离联赛只有几天了,也马上就要回归文化课了. 有点舍不得,感觉自己的水平刚刚有点起色,却又要被抓回文化课教室了,真想在机房再赖几天啊. 像19/11/11那场的简单题,自己还是能敲出一些 ...

  7. CCF CSP/CCSP报名费优惠的方法以及常见疑问

    目录 1. 本文地址 2. 认证作用 2.1. 高校认可 2.2. 赛事认可 2.3. 企业认可 3. 报名费价格及获取优惠的方法 3.1. CCF CSP 3.2. CCF CCSP 4. 语言与I ...

  8. 「CSP」第一届提高组考后总结

    「CSP」第一届提高组考后总结 问题分析+反思 成绩 心态 考前心态 考时心态 考后心态 方法 心灵鸡汤... 在学习了三年之后,我们信竞迎来了初中最后一次大考,也是第一次 CSPCSPCSP 考试. ...

  9. 2020 CSP&NOIP 游记

    CSP初赛 CSP初赛 Day -1 早上打了模拟赛,T2寒假正好做过,然而还是还是被踩Orz,郑外NB!.中午出校吃了大盘鸡和拉面,还带回来了三瓶可乐. 初赛知识点看了两页不(看)想(不)看(懂)了 ...

随机推荐

  1. 详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本(转)

    原文:https://www.jb51.net/article/156927.htm

  2. Spring Cloud Alibaba学习笔记(10) - Spring消息编程模型下,使用RocketMQ收发消息

    编写生产者 集成 添加依赖 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId&g ...

  3. 发布后的项目打开swagger

    使用netcore作为纯后端提供api已经变得越来越频繁,swagger也成为很多人的选择.通常会在代码中限制ASPNETCORE_ENVIRONMENT为Production时关闭swagger.但 ...

  4. VS.NET(C#)--2.3良构的XHTML

    良构的XHTML 1.关闭所有标签 2.禁止标签嵌套 3.区分大小写 4.引号  所有属性值都要置于引号中 5.唯一的根元素<html></html> 6.保留字符 XML中五 ...

  5. ECMAScript5面向对象技术(1)--原始类型和引用类型

    概述 大多数开发者在使用Java或C#等基于类的语言的过程中学会了面向对象编程.由于JavaScript没有对类的正式支持,这些开发者在学习JavaScript时往往会迷失方向: JavaScript ...

  6. FI-TCODE收集

    主数据:FS00         编辑总帐科目FS01         创建主记录FS02         更改主记录FS03         显示主记录FS04         总帐科目更改(集中地 ...

  7. 【SpringMVC】RESTful支持

    一.概述 1.1 什么是RESTful 1.2 URL的RESTful实现 二.演示 2.1 需求 2.2 第一步更改DispatcherServlet配置 2.3 第二步参数通过url传递 2.4 ...

  8. 利用 Python django 框架 输入汉字,数字,字符,等。。转成二维码!

    利用 Python django 框架 输入汉字,数字,字符,等..转成二维码! 模块必备:Python环境 + pillow  + qrcode 模块 核心代码import qrcode qr = ...

  9. 华为SDN:解决传统网络3大问题

    转:http://mp.ofweek.com/tele/a145613326756 科技潮人 2013-08-05 14:20 传统网络之困 互联网爆炸式增长,除了规模和发展速度远超之前所有曾出现的数 ...

  10. 基于numpy实现矩阵计算器

    要求 制作一个Python的矩阵计算器: ① 程序提供任意两矩阵的加.乘法运算:方阵的行列式计算.逆矩阵计算.特征分解:任意矩阵的转置等计算功能,可自行添加功能 ② 从控制台通过键盘获取数据并完成以上 ...