NOI 2015 分类: noi 2015-0...


我只会做送分题。。。


Day1

T1 离散化+并查集
T2 树链剖分,线段树维护区间内元素个数


Day2
T1 Huffman树,Huffman树是严格k叉树是比较好处理的,所以加入一些权值为0的点使得 点数 mod (k - 1) = 1


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <utility>
#include <iostream>
#include <algorithm>

const int maxn = 100005;

template<class Num>void read(Num &x)
{
    char c; int flag = 1;
    while((c = getchar()) < '0' || c > '9')
        if(c == '-') flag *= -1;
    x = c - '0';
    while((c = getchar()) >= '0' && c <= '9')
        x = (x<<3) + (x<<1) + (c-'0');
    x *= flag;
    return;
}
template<class Num>void write(Num x)
{
    if(x < 0) putchar('-'), x = -x;
    static char s[20];int sl = 0;
    while(x) s[sl++] = x%10 + '0',x /= 10;
    if(!sl) {putchar('0');return;}
    while(sl) putchar(s[--sl]);
}
struct vetor
{
#define begin() (__arr + 1)
#define end() (__arr + __len + 1)

    int *__arr, __len;

    void set(int size)
    {
        __len = 0, __arr = (int*)malloc(sizeof(int)*size);
    }
    void push_back(int x)
    {
        __arr[++__len] = x;
    }
    int size()
    {
        return __len;
    }
    void unique()
    {
        std::sort(begin(),end());
        __len = std::unique(begin(),end()) - begin();
    }
    int find(int x)
    {
        return std::lower_bound(begin(), end(), x)-begin()+1;
    }
    int get(int x)
    {
        return __arr[x];
    }
    void erase()
    {
        __len = 0;
    }
#undef begin
#undef end
}bowl;


int n, fa[maxn<<1];

int find(int x)
{
    return (x == fa[x])?x:(fa[x] = find(fa[x]));
}

struct option
{
    int i, j, e;

    void scan()
    {
        read(i), read(j), read(e);
        bowl.push_back(i);
        bowl.push_back(j);
    }
    void prework()
    {
        i = bowl.find(i);
        j = bowl.find(j);
    }
    void gather()
    {
        if(i > j) std::swap(i, j);
        fa[find(j)] = find(i);
    }
    bool check()
    {
        return find(i) == find(j);
    }
}op[maxn];

int main()
{
    int T;

    freopen("prog.in","r",stdin);
    freopen("prog.out","w",stdout);

    std::cin >> T, bowl.set(maxn<<1);

    while(T--)
    {
        bool ans = true;

        bowl.erase();

        std::cin >> n;
        for(int i = 1; i <= n; i++)
            op[i].scan();

        bowl.unique();
        for(int i = 1; i <= bowl.size(); i++)
            fa[i] = i;

        for(int i = 1; i <= n; i++)
            op[i].prework();    
        for(int i = 1; i <= n; i++)
            if(op[i].e) op[i].gather();
        for(int i = 1; i <= n; i++)
            if(!op[i].e && op[i].check())
            {
                ans = false;
                break;
            }

        if(ans) puts("YES");
        else    puts("NO");
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <utility>
#include <iostream>
#include <algorithm>

const int maxn = 100005, Nya = -1;

template<class Num>void read(Num &x)
{
    char c; int flag = 1;
    while((c = getchar()) < '0' || c > '9')
        if(c == '-') flag *= -1;
    x = c - '0';
    while((c = getchar()) >= '0' && c <= '9')
        x = (x<<3) + (x<<1) + (c-'0');
    x *= flag;
    return;
}
template<class Num>void write(Num x)
{
    if(x < 0) putchar('-'), x = -x;
    static char s[20];int sl = 0;
    while(x) s[sl++] = x%10 + '0',x /= 10;
    if(!sl) {putchar('0');return;}
    while(sl) putchar(s[--sl]);
}

int n, q;
namespace seg
{
#define L(x) ((x)<<1)
#define R(x) ((x)<<1|1)

    int tag[maxn<<2], cnt[maxn<<2];

    void set()
    {
        cnt[1] = tag[1] = 0;
    }
    int pushdown(int x,int ll,int rr)
    {
        int mid = (ll + rr) >> 1;
        if(tag[x] != Nya)
        {
            cnt[L(x)] = tag[x]*(mid - ll + 1);
            cnt[R(x)] = tag[x]*(rr - mid);
            tag[L(x)] = tag[R(x)] = tag[x];

            tag[x] = Nya;
        }
        return mid;
    }
    void update(int x)
    {
        cnt[x] = cnt[L(x)] + cnt[R(x)];
    }
    void color(int ll,int rr,int l,int r,int si,int col)
    {
        if(ll == l && rr == r)
        {
            tag[si] = col;
            cnt[si] = (rr - ll + 1)*col;
            return;
        }
        int mid = pushdown(si, ll, rr);

        if(mid < l) color(mid + 1, rr, l, r, R(si), col);
        else if(r <= mid) color(ll, mid, l, r, L(si), col);
        else
        {
            color(ll, mid, l, mid, L(si), col);
            color(mid + 1, rr, mid + 1, r, R(si), col);
        }

        update(si);
    }
    int count()
    {
        return cnt[1];
    }
#undef L
#undef R
}

namespace tree
{
    struct Edge
    {
        int v, next;
        Edge(int v = 0,int next = 0):v(v),next(next){}
    }edge[maxn];

    int el, head[maxn];
    int size[maxn], fa[maxn];
    int dfn[maxn], dl;
    int top[maxn], son[maxn];
    int fc[maxn], end[maxn];

    void NewEdge(int u,int v)
    {
        edge[++el] = Edge(v, head[u]), head[u] = el;
    }
    void init()
    {
        fa[1] = 0;
        for(int i = 2; i <= n; i++)
        {
            read(fa[i]), fa[i]++;
            NewEdge(fa[i], i);
        }
    }
    void dfs(int a)
    {
//      dep[a] = dep[fa[a]] + 1;
        size[a] = 1, son[a] = 0;

        for(int i = head[a], p; i ; i = edge[i].next)
        {
            dfs(p = edge[i].v);

            size[a] += size[p];

            if(size[p] > size[son[a]])
            son[a] = p;
        }
        return;
    }
    void build(int a)
    {
        dfn[++dl] = a, fc[a] = dl;

        if(son[fa[a]] == a)
            top[a] = top[fa[a]];
        else
            top[a] = a;

        if(son[a]) build(son[a]);

        for(int i = head[a], p; i ; i = edge[i].next)
            if((p = edge[i].v) != son[a]) build(p);

        end[a] = dl;
    }
    void prework()
    {
        dfs(1), build(1);
    }
    void install(int c)
    {
        while(c)
        {
            seg::color(1, n,fc[top[c]],fc[c], 1, 1);
            c = fa[top[c]];
        }
    }
    void uninstall(int c)
    {
        seg::color(1, n,fc[c],end[c], 1, 0);
    }
}
void Solve()
{
    int last = 0, now;
    for(int i = 1, x; i <= q; i++)
    {
        static char str[10];
        scanf("%s",str);
        read(x), x++;

        if(str[0] == 'i')
            tree::install(x);
        else
            tree::uninstall(x);

            now = seg::count();
        write(abs(now - last));
            last = now, puts("");
    }
}

int main()
{
    freopen("manager.in","r",stdin);
    freopen("manager.out","w",stdout);

    std::cin >> n;

    tree::init();

    tree::prework();

    seg::set();

    std::cin >> q, Solve();

//  std::cerr << clock()*1.0/CLOCKS_PER_SEC << std::endl;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <vector>
#include <utility>
#include <stack>
#include <queue>
#include <iostream>
#include <algorithm>

template<class Num>void read(Num &x)
{
    char c; int flag = 1;
    while((c = getchar()) < '0' || c > '9')
        if(c == '-') flag *= -1;
    x = c - '0';
    while((c = getchar()) >= '0' && c <= '9')
        x = (x<<3) + (x<<1) + (c-'0');
    x *= flag;
    return;
}
template<class Num>void write(Num x)
{
    if(x < 0) putchar('-'), x = -x;
    static char s[20];int sl = 0;
    while(x) s[sl++] = x%10 + '0',x /= 10;
    if(!sl) {putchar('0');return;}
    while(sl) putchar(s[--sl]);
}

const int maxn = 1e5+15;
typedef std::pair<long long,int> heapnode;
#define Root_Min std::vector<heapnode>,std::greater<heapnode>

int n, k; long long w[maxn], total;
std::priority_queue<heapnode, Root_Min> heap;

int main()
{
    heapnode top;

    freopen("epic.in","r",stdin);
    freopen("epic.out","w",stdout);

    std::cin >> n >> k;
    for(int i = 1; i <= n; i++) read(w[i]);

    for(int i = 1; i <= n; i++)
        heap.push(std::make_pair(w[i], 0));

    while(n%(k-1) != 1%(k-1))
        heap.push(std::make_pair(w[++n], 0));

    while(heap.size() != 1)
    {
        long long cost = 0;
        int depth = 0;

        for(int i = 1; i <= k; i++)
        {
            if(heap.empty()) break;

            top = heap.top();

            cost += top.first;

            depth = std::max(depth, top.second + 1);

            heap.pop();
        }

        total += cost;
        heap.push(std::make_pair(cost, depth));
    }

    std::cout << total << std::endl;
    std::cout << heap.top().second;

    fclose(stdin);
    fclose(stdout);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/dashgua/p/4722965.html

NOI2015试题 NOI2015试题,有2天的题= = PDF格式的,压缩了一下 立即下载

相关推荐

海康/大华设备如何接入GB28181平台?最新2022版互联避坑指南

本文详细解析了海康/大华设备接入GB28181平台的最新2022版互联避坑指南,涵盖参数配置、实时视音频点播协议交互及典型故障排查。重点介绍了GB/T28181-2022标准下的设备编码规范、SIP服务器配置及媒体流保活机制,帮助工程团队高效解决设备离线和媒体流中断等问题。

weixin_30733003的博客 685

NOI 2015题解

[luogu P2168] [NOI2015]荷马史诗 就是k叉哈夫曼树 考虑二叉的时候就是每次取最小的两个合并 k叉就是每次取k个合并 这题唯一要注意的就是要补0 code: #include<bits/stdc++.h> #define ll long long using namespace std; int n, k; ll x; priority_queue<pair<ll, ll>, vector<pair<ll, ll> >, greate

lahlah的博客 765

AHB总线协议

1. 简介         AHB总线规范是AMBA总线规范的一部分,AMBA总线规范是ARM公司提出的总线规范,被大多数SoC设计采用,它规定了AHB (Advanced High-performance Bus)、ASB (Advanced System Bus)、APB (Advanced Peripheral Bus)。AHB用于高性能、高时钟频率的系统结构,典型的应用如ARM核与系统内

ivy_reny的专栏 8万+

【NOI2015】荷马史诗

  题目链接 https://www.luogu.org/problem/P2168   题目大意是给定n 个单词的出现次数wi,求用k进制的前缀码转换后得到的最小总长度,以及在保证总长度最小时的最长串 si 的长度最短。   这题现在来看算是NOI里很简单的了(我竟然凹出来了w),但是据说当时这题可是难倒一大片。首先是因为这题题干太长不怎么容易看懂,另外可能是因为当时哈弗曼树还...

a1137775617的博客 708

HybridCLR热更新全流程实操:用Addressables实现资源+代码双热更(Unity 2021版)

本文详细介绍了在Unity 2021 LTS版本中,如何结合HybridCLR代码热更新与Addressables资源管理系统,实现资源与代码的双热更解决方案。通过环境配置、技术架构设计、实战案例和性能优化,帮助开发者解决中大型项目中的依赖管理和版本协同问题,提升游戏迭代效率。

cc789的博客 845

Dify 第 10 篇 Dify 知识库手把手案例

本文介绍了如何利用Dify平台构建《阿里巴巴Java开发手册》智能助手。首先详细讲解了知识库创建的完整流程,包括文档上传、分段设置(推荐父子分段+段落上下文)、索引方式选择(高质量+混合检索)等关键步骤。随后指导用户进行分段质量检查和召回测试,强调TopK和Score参数的调优策略。接着演示了Chatflow应用开发过程,通过知识检索节点和LLM节点的配置,实现从知识库智能获取答案的功能。最后展示了应用发布和实际使用效果,成功实现了基于知识库的问答交互。案例采用DeepSeek-R1大模型,并支持答案引用显

甘蓝的专栏 1699

NOI2015 程序自动分析 并查集 + 离散化

用并查集维护这些集合。先处理所有“相等”的条件,合并每两个 x 的集合。然后遍历“不等”的条件,如果存在两个x处于同一集合,那么就不可被满足,输出“NO”;若不存在,则可以被满足,输出“YES”。 但是,本题 x 的范围是 1 ...

yjr_0000123的博客 418

[SaaS] 阿里妈妈-万相营造

有controlnet的介入,我们是默认controlnet会介入,在inapinting时会把带有商品的画布做一点扩充,然后走inapinting和controlnet,其实也做了一点outpainting的工作。基于阿里妈妈营销平台,提供从图文到视频再到落地页的素材级智能化创意支持,是您营销创意数字资产累积和升值的阵地,最大化提升营销的效率和效果。目前看来抠图基本都是sam了,现在weshop也是,都有一个预扣好的主体,但是一点进去也会重新sam。atomovideo->图生视频。

liguandong 522

[NOI2015] 软件包管理器

通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。而且,由于你之前的工作,除 00 号软件包以外,在你的管理器当中的软件包都会依赖一个且仅一个软件包,而 00 号软件包不依赖任何一个软件包。注意,安装一个已安装的软件包,或卸载一个未安装的软件包,都不会改变任何软件包的安装状态,即在此情况下,改变安装状态的软件包数为 0。同时,如果想要卸载软件包 b,则必须卸载软件包 a。

m0_61949623的博客 959

【图像去噪】基于加权核范数最小化算法实现图像去噪附matlab代码

1 简介 WNNM是一种约束矩阵奇异值稀疏性的低秩算法,在NNM理论基础上增加了核范数权重,有效利用了自然图像的先验信息并提高了核范数的灵活性. 2 部分代码 ​clcclear allclose allnSig = 100;O_Img = double(imread('Monarch.png'));​randn('seed', 0);N_Img = O_Img + nSig* randn(size(O_Img)); ..

qq_59747472的博客 3114

【经验&技巧】DDR仿真中的挑战与解决方案

由于DDR的数据总线具备双向数据传输功能,需要对读写模式进行独立仿真环境的创建,并且分为连续和突发模式,再加之有单端和差分信号、有数据总线和地址总线,需要在数据传输过程中额外注意串扰的影响,并选择合适的驱动和负载以找寻设计裕量与串扰强度之间的平衡,因此,实际操作步骤和分析过程还是较为繁琐耗时的,需要设计者具有足够的耐心。

一只豌豆象的博客 1642

NOI2015 题解

D1T1 程序自动分析 题目大意:给定10910^9个变量和nn个等于/不等于的关系,判断能否存在一组解满足所有关系并查集傻逼题,NOIP小孩都会做 离散化一下,然后把相等的都用并查集并起来,判断每对不等关系是不是在同一并查集中就行了代码没拷回来,懒得再写一遍了D2T2 软件包管理器 题目大意:给定一棵有根树,每个点有黑白两种颜色,初始都为白色,每次进行以下两种操作: 1.将某个点所在的子树

世界 8525

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[NOI2015] 寿司晚宴

如果两个数有相同的大质因子 P_big,那么这两个数不能一个给 G,一个给 W。初步 DP 状态为 dp[i][mask_G][mask_W],表示考虑了前 i 个寿司后,小 G 积累的质因子集合是 mask_G,小 W 积累的是 mask_W 的方案数。DP 状态只关心小质数掩码:dp[mask_G_small][mask_W_small] 表示到目前为止,考虑过的寿司(及其大质因子的分配)使得 G 的小质数集为 mask_G_small,W 的为 mask_W_small 的方案数。

qq_61336509的博客 869

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

「NOI2015」寿司晚宴 (DP)

「NOI2015」寿司晚宴 其实就是把质因子划分到两个集合 考虑 n≤30n\le30n≤30 怎么做,显然质数只有 10 个,我们用 dp[S1][S2]dp[S_1][S_2]dp[S1​][S2​] 表示两个集合的为 S1,S2S_1,S_2S1​,S2​ 时的方案数,分解每个数转移即可 考虑 n≤500n\le 500n≤500,一个数至多有一个 >n>\sqrt n>n...

FSYo 的博客 381

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【NOI2015】【寿司晚宴】【状压DP】

Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴。小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴。 在晚宴上,主办方为大家提供了 n−1 种不同的寿司,编号 1,2,3,…,n−1,其中第 i 种寿司的美味度为 i+1 (即寿司的美味度为从 2 到 n)。 现在小 G 和小 W 希望每人选一些寿司种类来品尝,他们规定一种品尝方案为不

sunshinezff的专栏 4425

[LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机

[LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原点 \((0,0)\) 出发, 在只能向←↖↑↗→五个方向中有未到达的点的方向走且在没有到达一个点的时候不能中途转弯的情况下最多能到达的点数, 并输出一种可行方案. 第二个问题是如果用若干可...

weixin_30483495的博客 176

NOI 2015 寿司晚宴

状压dp

我要吃熊猫 613

[BZOJ4197][Noi2015]寿司晚宴

4197: [Noi2015]寿司晚宴 Time Limit:10 SecMemory Limit:512 MBSubmit:412Solved:279[Submit][Status][Discuss] Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴。小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴。 在晚宴上...

weixin_33813128的博客 131

[NOI 2015] bzoj4197 寿司晚宴 [dp]

Description: nnn个数,挑出一些分成两组,可以为空,问两组中所有数都与另一组互质。 Solution: 关于质因子分类,只考虑根号下的质因子,只有888个,那么装压一下,对于大于根号的分组考虑,单独dpdpdp即可。 #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;algorithm&gt; ...

pocket_legend 239

poj 1186 分类: poj 2015-0...

似乎是NOI 2001的题目,感觉很有意思。。。 Meet in the Middle (中途相遇法) 看起来O(MN)不可做,方程移项有真相:k1∗xp11+k2∗xp22+k3∗xp33=−(k4∗xp44+k5∗xp55+k6∗xp66) 分别计算 : k1∗xp11+k2∗xp22+k3∗xp33=W 的解数fL(W) k4∗xp44+k...

aa288288的博客 103

4197: [Noi2015]寿司晚宴 思路题 状压DP

毕竟是NOI的T3,自我感觉思维量还是挺大的。。虽然代码量并不大。。我们从数据范围入手,因为我们知道一个数n的大于sqrt(n)的因数只可能含有1个或0个,而本题n<=500,所以小于sqrt(500)的质因子只可能有8个。由于我们要求的是互质,那么我们选择了一个数就代表着选择了这个数含有的质因子。我们可以根据这个进行分类。s[i].first代表>sqrt(n)的因子,如果没有默认是1,s[i].

ws_fqk 790

P1955 [NOI2015] 程序自动分析

在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。考虑一个约束满足问题的简化版本:假设x1​x2​x3​⋯代表程序中出现的变量,给定n个形如xi​xj​或xi​xj​的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。

2301_77920554的博客 407

【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数

【BZOJ4197】[Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴。小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴。 在晚宴上,主办方为大家提供了 n−1 种不同的寿司,编号 1,2,3,…,n−1,其中第 i 种寿司的美味度为 i+1 (即寿司的美味度为从 2 到 n)。 现在小 G 和小 W 希望...

weixin_30730053的博客 82

[UOJ#129][BZOJ4197][Noi2015]寿司晚宴

[UOJ#129][BZOJ4197][Noi2015]寿司晚宴 试题描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴。小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴。 在晚宴上,主办方为大家提供了 n−1 种不同的寿司,编号 1,2,3,…,n−1,其中第 i 种寿司的美味度为 i+1 (即寿司的美味度为从 2 到 n)。 现在小 G 和小 ...

weixin_30278311的博客 136
上一篇: QTREE3 分类: templates sp...
下一篇: bzoj2127 分类: bzoj templ...
aa288288
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值