Skip to content

泉州一中信息学Blog

信息学奥赛技术分享博客

  • 登录
  • 小学oj
  • 中学oj
  • 测试页面1
  • Toggle search form

作者: 林 珂涵

2024常州day10(2024.8.21)

Posted on 2024年8月21日2024年8月21日 By 林 珂涵 2024常州day10(2024.8.21)无评论

今天终于可以结!束!啦! 因为下午4:30才考完试,没时间打博客 所以就放到上午去打 (不是我说,都最后一天了…

Read More “2024常州day10(2024.8.21)” »

训练日志

2024常州day9

Posted on 2024年8月20日 By 林 珂涵 2024常州day9无评论

DP 早上也是成功的没讲课,所以我们要打题(悲 :laughing: 不知道为什么博客到后面全部都斜体了 1….

Read More “2024常州day9” »

训练日志

2024常州day8

Posted on 2024年8月19日2024年8月19日 By 林 珂涵 2024常州day8无评论

动态规划 动态规划适用于子问题不是独立的情况。也就 是子问题包含公共的子子问题(如fibnacci数列问题求解…

Read More “2024常州day8” »

训练日志

2024常州day7

Posted on 2024年8月18日 By 林 珂涵 2024常州day7无评论

1.树和二叉树

就是一个树状结构,
如下图:

  • 每个元素称为结点(Node);
  • 有一个特定的结点,称为根结点或树根(Root);
  • 除根结点外,其余结点被分成m(m≥0)个互不相交的有限集合T1,T2,T3,……,Tm,而每一个子集Ti又都是一棵树,称为原树的子树(Subtree)。
  • 结点的度:有多少个子节点
  • 度为0的是叶子节点
  • 树的深度:树内各节点的度的最大值
  • 先序遍历:根左右 上图的先序是:125634789
  • 后序遍历:左右根 上图的后序是:562389741
  • 注:二叉树有中序遍历:左根右
  • 满二叉树的一个特殊:
    如果有个节点为i(有父节点)
    那它的父节点为i/2
    它的左孩子是2i,右孩子是2i+1
  • 完全二叉树
  • 哈夫曼编码
    边权上的0代表右节点,1是左节点
    并且树是按出现频率排序的

2.优先队列以及大根堆小根堆

定义:
1.priority_queue q;//默认大根堆
2.priority_queue<int,vector,greather> q;//小根堆
操作(和队列基本一样,不重复了

  • 在二叉堆(以小根堆为例)里的两个基本操作:
    Put操作:往堆尾加入一个元素,并通过从下往上的调整法,使其继续保持堆的性质;
    Get操作:从堆中取出堆头元素,并删除该结点(堆尾覆盖),再通过从上往下的调整法,使其继续保持堆的性质;

例题1:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
priority_queue<ll,vector<ll>,greater<ll> > q;
ll n,sum,k,x;
int main()
{
    freopen("ugly.in","r",stdin);
    freopen("ugly.out","w",stdout);
    cin>>n;
    q.push(1);
    sum=1;
    while(sum<=n)
    {
        k=q.top();
        //cout<<sum<<" "<<q.top()<<endl;
        q.pop();
        if(x==k) continue;
        sum++;
        q.push(k*2);
        q.push(k*3);
        q.push(k*5);
        q.push(k*7);
        x=k;
    }
    cout<<k;
    return 0;
}

例题2:合并果子
2501 OJ:P369
闲来无事,打了两个代码

#include<bits/stdc++.h>//小根堆 
using namespace std;
#define int long long 
priority_queue<int,vector<int>,greater<int> > q;
int n,a,tot;
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a,q.push(a);
    while(q.size()>1)
    {
        int x=q.top();
        q.pop();
        int y=q.top();
        q.pop();
        q.push(x+y);
        tot+=x+y;
    }
    cout<<tot;
    return 0;
}  
#include<bits/stdc++.h>//大根堆 
using namespace std;
int n,x,sum,y;
priority_queue<int> q;
int main()
{
    freopen("fruit.in","r",stdin);
    freopen("fruit.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        q.push(-x);
    }
    while(q.size()-1>0)
    {
        x=-q.top();
        q.pop();
        y=-q.top();
        q.pop();
        q.push(-x-y);
    //  cout<<x<<" "<<y<<endl;
        sum+=x+y;
    }
    cout<<sum<<endl;
    return 0;
}
  • 二叉查找树
  • BST定义:
    二叉排序树或者是空树或者是满足如下性质的二叉树:
    ①若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
    ②若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
    ③左、右子树本身又各是一棵二叉排序树。
  • 最后它将进化为平衡树(

3.并查集

这是一个很古老的东西,毕竟这以及是我今天第三次学了
这个我还是掌握的不错的
就是写两个函数:一个是合并,一个是查找
也没有什么可以解释:
直接上代码:

int find(int x)
{
    if(fr[x]==x) return x;
    return fr[x]=find(fr[x]);
}
void hebing(int c,int d)
{
    fr[find(c)]=find(d);
}

1.亲戚

很早以前打过了,再打一遍
题目见:2501 OJ P346

#include<bits/stdc++.h>
using namespace std;
int m,n,q,a,b,c,d,xa,xb; 
int fa[20005];
int find(int x)
{
    if(x==fa[x]) return x;
    return fa[x]=find(fa[x]);
}
void hebing(int x,int y)
{
    fa[xa]=xb;
}
int main()
{
    freopen("relation.in","r",stdin);
    freopen("relation.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        xa=find(a);
        xb=find(b);
        if(xa!=xb) hebing(a,b);
    }
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        scanf("%d%d",&c,&d);
        if(find(c)!=find(d)) printf("No\n");
        else printf("Yes\n");
    } 
    return 0;
}

2.团伙(2501:P385)

林老师发的PPT的团伙有点不一样

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,fr[1005],b[1005][1005];
char a;
int find(int x)
{
    if(fr[x]==x) return x;
    return fr[x]=find(fr[x]);
}
void hebing(int c,int d)
{
    fr[find(c)]=find(d);
}
int main()
{
    freopen("group.in","r",stdin);
    freopen("group.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++) fr[i]=i; 
    for(int i=1;i<=m;i++)
    {
        cin>>a>>x>>y;
        if(a==&#039;F&#039;) hebing(x,y);
        if(a==&#039;E&#039;)
        {
            b[x][y]=b[y][x]=1;
            for(int j=1;j<=n;j++)
            {
                if(b[y][j]==1) hebing(x,j);
                else if(b[x][j]==1) hebing(y,j);
            }
        }
    }
    int sum=0;
    for(int i=1;i<=n;i++) if(fr[i]==i) sum++;
    cout<<sum;
    return 0;
}

3.家谱(P388)

#include<bits/stdc++.h>
using namespace std;
map<string,string> q;
string s,s1;
char a;
string find(string x)
{
    if(q[x]==x) return q[x];
    return q[x]=find(q[x]);
}
int main()
{
    freopen("gen.in","r",stdin);
    freopen("gen.out","w",stdout);
    while(cin>>a && a!=&#039;$&#039;)
    {
        cin>>s;
        if(a==&#039;#&#039;) 
        {
            s1=s;
            if(q[s]=="") q[s]=s;
        }
        else if(a==&#039;+&#039;) q[s]=s1;
        else if(a==&#039;?&#039;)
            cout<<s<<" "<<find(s)<<endl;
    }
    return 0;
}

4.朋友

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,fr[30001],fri[30005];
char a;
int find(int x)
{
    if(fr[x]==x) return x;
    return fr[x]=find(fr[x]);
}
void hebing(int c,int d)
{
    fr[find(c)]=find(d);
}
int main()
{
    freopen("friend.in","r",stdin);
    freopen("friend.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++) fr[i]=i; 
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y;
        hebing(x,y);
    }
    int maxn=0;
    for(int i=1;i<=n;i++) fri[find(i)]++;
    for(int i=1;i<=n;i++)
        if(fri[i]>0) maxn=max(maxn,fri[i]);
    cout<<maxn;
    return 0;
}

5.食物链(OJ:390)

这是一道很抽象的题目
很成功的把我自己绕进去了

#include<bits/stdc++.h>
using namespace std;
int k,n,d,x,y; 
int fa[300005];
int find(int xi)
{
    if(xi==fa[xi]) return xi;
    return fa[xi]=find(fa[xi]);
}
void hebing(int xi,int yi)
{
    int xa=find(xi);
    int xb=find(yi); 
    fa[xa]=xb;
}
int main()
{
    //freopen("eat.in","r",stdin);
    //freopen("eat.out","w",stdout);
    cin>>n>>k; 
    for(int i=1;i<=3*n;i++) fa[i]=i;
    //假设 x 为本身,那设 x+n 为猎物,那设 x+2*n为天敌; 
    int sum=0;
    for(int i=1;i<=k;++i)
    {
        cin>>d>>x>>y;
        if(x>n || y>n) {sum++;continue;}
        if(d==1)
        {
            if(find(x+n)==find(y) || find(x+2*n)==find(y)){sum++;continue;}
            //如果x和 y 是猎物或天敌的关系,就是假话;
            hebing(x,y);hebing(x+n,y+n);hebing(x+2*n,y+2*n);
            //如果x和y是同类,合并x和y的同类和猎物和天敌 
        }
        else if(d==2)
        {
            if(x==y) {sum++;continue;}
            if(find(x)==find(y) || find(x+2*n)==find(y)) {sum++;continue;}
            //如果x和y是天敌或着同类,就是假话;
            hebing(x,y+n*2);hebing(x+n,y);hebing(x+2*n,y+n);
            //如果y是X的猎物,则x的同类是 y的天敌,x的猎物是y的同类,x的天敌是y的猎物 
        }
    }
    cout<<sum; 
    return 0;
}

Read More “2024常州day7” »

训练日志

2024常州day6

Posted on 2024年8月17日2024年8月17日 By 林 珂涵 2024常州day6无评论

1.栈 栈是一种基本数据结构。 栈是一种操作受到限制的线性表:只能在一端进行读写操作,这一端称为栈顶 -栈的基…

Read More “2024常州day6” »

训练日志

2024常州day5(8.16)

Posted on 2024年8月16日 By 林 珂涵 2024常州day5(8.16)无评论

1.比赛 今天的比赛,我的成绩实在是太“理想”了 很难想象,我是怎么做到, 打了4题,4题全四十分的,真的太平…

Read More “2024常州day5(8.16)” »

训练日志

2024常州day4(8.15)(补

Posted on 2024年8月16日 By 林 珂涵 2024常州day4(8.15)(补无评论

1.这是一篇在8.16号写的blog Because昨天没有晚自习!! 步入正题 1.队列 STL队列操作 定…

Read More “2024常州day4(8.15)(补” »

训练日志

2024常州day3(8.14

Posted on 2024年8月14日 By 林 珂涵 2024常州day3(8.14无评论

今天是非常不GOOD的一天 刷到一个奇怪的一言:王只有一个!那就是我! 以及另一个奇怪的一言: 我要AK!IO…

Read More “2024常州day3(8.14” »

训练日志

2024常州集训day2-8.13

Posted on 2024年8月13日 By 林 珂涵 2024常州集训day2-8.13无评论

1.Today is a bad wonderful day. j组非常的有趣啊,it is very eas…

Read More “2024常州集训day2-8.13” »

训练日志

2024常州一中集训DAY1

Posted on 2024年8月12日 By 林 珂涵 2024常州一中集训DAY1无评论

J组 1.指针 指针的概念:内存单元的位置(编号)叫作“地址”,可以通过取地址操作符“&”获得一个变量…

Read More “2024常州一中集训DAY1” »

训练日志

文章导航

1 2 下一页
2025年 6月
一 二 三 四 五 六 日
 1
2345678
9101112131415
16171819202122
23242526272829
30  
« 2月    

2024常州 Class Classic OI Problems Contest cqr的长乐集训2023 CZYZ LOC New Game NOI NOIP Password Protected PM_PK Preview Problems Retrospect Selfmade Qusetion STL The end Training Uneasy Problem 蒟蒻 通报

  • 训练日志
  • 链表
  • 入门
  • 模拟
  • dfs序
  • 并查集
  • spfa
  • 最小割
  • 矩阵树定理
  • 仙人掌
  • BSGS
  • 凸包
  • 回文自动机
  • 递推与动归
  • 堆
  • 莫队算法
  • ST表
  • Treap
  • 树套树
  • 可持久化线段树
  • 初赛
  • 搜索
  • 贪心
  • 深度优先搜索
  • 欧拉图
  • dijkstra
  • 费用流
  • 哈夫曼树
  • kruskual
  • 置换
  • 旋转卡壳
  • KMP
  • 区间动归
  • STL
  • 链表
  • 可并堆
  • sply
  • 主席树
  • 可持久化字典树
  • 算法
  • 动态规划
  • 构造
  • 广度优先搜索
  • 最短路
  • floyd
  • 最大流
  • 虚树
  • prim
  • 筛法
  • 半平面交
  • 字典树
  • 背包动归
  • 基础数据结构
  • 分块
  • 线段树
  • 替罪羊树
  • K-DTree
  • 图论
  • 二分法
  • 迭代搜索
  • 拓扑排序
  • 有上下界网络流
  • 生成树
  • 快速幂
  • 后缀数组
  • 树形动归
  • 哈希表
  • 中级数据结构
  • 平衡树
  • 可持久化数据结构
  • 数据结构
  • 三分法
  • 启发式搜索
  • 图的连通
  • 点分治
  • 博弈论
  • AC自动机
  • 状压动归
  • 单调栈
  • 树状数组
  • 高级数据结构
  • OI资料
  • 数学
  • 高精度
  • 差分约束
  • 树上倍增
  • 素数测试
  • 后缀自动机
  • 数位动归
  • 单调队列
  • 新闻
  • 几何
  • 随机化
  • 二分图染色
  • 树链剖分
  • 欧拉函数
  • manacher
  • 斜率优化
  • 离线处理
  • 信息学奥赛学长风采
  • 字符串
  • 二分图匹配
  • prufer编码
  • 卡特兰数
  • 密码学
  • 决策单调
  • 赛后总结
  • 其他
  • 2-SAT
  • 最近公共祖先
  • 矩阵乘法
  • 记忆化搜索
  • 网络流
  • Link cut tree
  • 排列组合
  • 树
  • 高斯消元
  • 乘法逆元
  • 容斥原理
  • 调和级数
  • 概率与期望
  • 模线性方程组
  • 莫比乌斯反演
  • 快速傅里叶变换
  • 扩展欧几里德
  • 最大公约数与最小公倍数

近期文章

  • DP杂题
  • 2025年2月13日模拟赛
  • HLOJ-TEST ROUND 4-T1/T2(构造)- 3
  • HLOJ-TEST ROUND 4-T1/T2(构造)- 2
  • HLOJ-TEST ROUND 4-T1/T2(构造)- 1

近期评论

归档

  • 2025年2月
  • 2025年1月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年3月
  • 2024年2月
  • 2024年1月
  • 2023年12月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月

Copyright © 2025 泉州一中信息学Blog.

Powered by PressBook WordPress theme