Skip to content

泉州一中信息学Blog

信息学奥赛技术分享博客

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

每日归档: 2024年8月18日

常州Day7

Posted on 2024年8月18日 By 吴 欣蓉 常州Day7无评论

背包 01背包 #include<bits/stdc++.h> using namespace s…

Read More “常州Day7” »

训练日志

常州day7

Posted on 2024年8月18日 By 陈, 泓霖 常州day7无评论

今天下午讲动态规划中的背包,以前已经学过了,而后面的有一点难。今天晚上继续吃沙县。

训练日志

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 CZYZ DAY7

Posted on 2024年8月18日 By 黄, 涵波 2024 CZYZ DAY7无评论

上午打题 今天依旧没有比赛,打之前没打完的题 T1 昨日的比赛第二题 这里的话首先注意到模数100003是一个…

Read More “2024 CZYZ DAY7” »

训练日志

常州集训Day7

Posted on 2024年8月18日 By 王伟铨 常州集训Day7无评论

今天早上学了堆&优先队列 //小根堆 void push(int m){ int i=l++; hea…

Read More “常州集训Day7” »

训练日志

常州暑假集训Day7

Posted on 2024年8月18日2024年8月18日 By 杨, 明浩 常州暑假集训Day7无评论

今天我们学习了优先队列,二叉树,并查集。这一些之前都有学过,因此题基本上有打的都有过,还去帮助了同学,同学都觉…

Read More “常州暑假集训Day7” »

训练日志

常州Seven Day堆,二叉树

Posted on 2024年8月18日 By 陈文杨 常州Seven Day堆,二叉树无评论

堆 堆:最早出现在操作系统中,实现对任务或进程的调度。并不是按照任务队列简单地执行FIFO,而是按照一定的优先…

Read More “常州Seven Day堆,二叉树” »

训练日志

2024常州暑假集训Day7——8.18

Posted on 2024年8月18日 By 郑, 铭轩 2024常州暑假集训Day7——8.18无评论

早上8:00整,我们又又又来到了这与我们“亲爱”的Quanzhou No.1 High School有长达20…

Read More “2024常州暑假集训Day7——8.18” »

训练日志

24常州集训Day7

Posted on 2024年8月18日2024年8月18日 By 邱逸杰 24常州集训Day7无评论

今天学了优先队列,树和并查集 优先队列之前写过就不写了 树的话主要是学二叉树(binary tree) 每个非…

Read More “24常州集训Day7” »

训练日志

常州集训Day7——8.18

Posted on 2024年8月18日 By 李丰泰 常州集训Day7——8.18无评论

上午 树和堆复习。树概念太抽象了,要借助其他数据结构来实现。我今天只学会了用数组,链表还不会。老师今天发火了,…

Read More “常州集训Day7——8.18” »

训练日志

文章导航

1 2 下一页
2024年 8月
一 二 三 四 五 六 日
 1234
567891011
12131415161718
19202122232425
262728293031  
« 7月   9月 »

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