hihocoder 1145 : 幻想乡的日常

#1145 : 幻想乡的日常

时间限制:20000ms

单点时限:1000ms

内存限制:256MB

描述

幻想乡一共有n处居所,编号从1到n。这些居所被n-1条边连起来,形成了一个树形的结构。

每处居所都居住着一个小精灵。每天小精灵们都会选出一个区间[l,r],居所编号在这个区间内的小精灵一起来完成一项任务。

特别的,居所相邻的(有边相连的)两个小精灵会自发的组成一队,并且如果a和b相邻b和c相邻,那么a和c也在同一队里面。每天的任务完成之后,队伍就会解散;第二天再根据新的区间组成新的队伍。

给出每天小精灵们选出的区间,你知道每天组成的队伍数量吗?

输入

第一行两个数n和Q(1 <= n, Q <= 100000),表示居所的数目和组队的天数。

接下来n-1行,每行两个数a和b,表示居所a和b之间有一条边。

接下来Q行,每行两个数l和r,满足1<=l<=r<=n,为该天小精灵选出的区间。

输出

输出Q行,每行一个整数表示该天队伍的数量。

样例输入
3 1
1 2
2 3
1 3
样例输出
1
/**
          题意:在一个去见内,求有多少子区间;
          做法:树状数组 + 离散化
**/
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <queue>
#define maxn 110000
using namespace std;
int sum[maxn];
int mmap[maxn];
int n,m;
int num;
int head[maxn];
struct Line
{
    int l;
    int r;
    int id;
} line[maxn];
int  cmp(Line a,Line b)
{
    return a.r < b.r;
}
struct Node
{
    int val;
    int next;
} node[maxn*2];
void init()
{
    num = 0;
    memset(head,-1,sizeof(head));
}
void addedge(int u,int v)
{
    node[num].val = v;
    node[num].next = head[u];
    head[u] = num++;
}
int lowbit(int x)
{
    return x&(-x);
}
void add(int u,int v)
{
    for(int i=u; i<=n; i += lowbit(i))
    {
        sum[i] += v;
    }
}
int getsum(int u)
{
    int sumweight = 0;
    while(u)
    {
        sumweight += sum[u];
        u -= lowbit(u);
    }
    return sumweight;
}
int main()
{
//#ifndef ONLINE_JUDGE
//    freopen("in.txt","r",stdin);
//#endif // ONLINE_JUDGE
    while(~scanf("%d %d",&n,&m))
    {
        int u,v;
        init();
        for(int i=1; i<n; i++)
        {
            scanf("%d %d",&u,&v);
            addedge(u,v);
            addedge(v,u);
        }
        for(int i=1; i<=m; i++)
        {
            scanf("%d %d",&line[i].l,&line[i].r);
            line[i].id = i;
        }
        int ix =1,ans = 0;
        memset(mmap,0,sizeof(mmap));
        sort(line+1,line+m+1,cmp);
        memset(sum,0,sizeof(sum));
        for(int i=1; i<=n; i++)
        {
            for(int j=head[i]; j+1; j=node[j].next)
            {
                int w = node[j].val;
                if(w < i)
                {
                    add(w,1);
                }
            }
            while(i == line[ix].r &&  ix <= m)
            {
                mmap[line[ix].id] = line[ix].r - line[ix].l + 1 - (getsum(line[ix].r) - getsum(line[ix].l -1));
                ix ++;
            }
        }
        for(int i=1; i<=m; i++)
        {
            printf("%d\n",mmap[i]);
        }
    }
    return 0;
}

时间: 2024-10-12 22:49:29

hihocoder 1145 : 幻想乡的日常的相关文章

hiho#1145 : 幻想乡的日常

描述 幻想乡一共有n处居所,编号从1到n.这些居所被n-1条边连起来,形成了一个树形的结构. 每处居所都居住着一个小精灵.每天小精灵们都会选出一个区间[l,r],居所编号在这个区间内的小精灵一起来完成一项任务. 特别的,居所相邻的(有边相连的)两个小精灵会自发的组成一队,并且如果a和b相邻b和c相邻,那么a和c也在同一队里面.每天的任务完成之后,队伍就会解散:第二天再根据新的区间组成新的队伍. 给出每天小精灵们选出的区间,你知道每天组成的队伍数量吗? 输入 第一行两个数n和Q(1 <= n, Q

hihoCoder 挑战赛10 #1145 : 幻想乡的日常

思路: TLE了,其他思路还没想出来.假设居所是一棵树,对于给定的一个区间[l, r] ,其中有r-l+1个节点,那么最大可能出现的队伍数就是r-l+1.而数有n-1条边,如果一条边(x,y)满足l<=x<=r 且 l<=y<=r ,那么这条边就在区间[l, r]内,而这两个节点就必须是同一个队伍的,那么最大可能出现的队伍数就是r-l+1-1了.也就是说,对于n-1条边,如果有n条边存在于区间[l, r]内,那么这一天的队伍数量就是r-l+1-n.  复杂度:对于每个区间,只需要检

红色的幻想乡

题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在某一个地区上,向东南西北四个方向各发出一条无限长的红雾,可以影响到整行/整列,但不会影响到她所站的那个地区.如果两阵红雾碰撞,则会因为密度过大而沉降消失.灵梦察觉到了这次异变,决定去解决它.但在解决之前,灵梦想要了解一片范围红雾的密度.可以简述为两种操

[Zjoi2015]诸神眷顾的幻想乡

[Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1537  Solved: 892 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修建了n-1条

[luogu P3801] 红色的幻想乡 [线段树][树状数组]

题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在某一个地区上,向东南西北四个方向各发出一条无限长的红雾,可以影响到整行/整列,但不会影响到她所站的那个地区.如果两阵红雾碰撞,则会因为密度过大而沉降消失.灵梦察觉到了这次异变,决定去解决它.但在解决之前,灵梦想要了解一片范围红雾的密度.可以简述为两种操

【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机

[BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修建了n-1条边将它们连通起来.也就是说,这n块空地形成了一个树的结构. 有n个粉丝们来到了太阳花田上.为了表达对幽香生日的祝

BZOJ 4596: [Shoi2016]黑暗前的幻想乡

4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 408  Solved: 232[Submit][Status][Discuss] Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪平等,幻想乡多元化等等,对于幻想乡 目前面临的种种大问题却给不出合适的解

BZOJ 3926: [Zjoi20150]诸神眷顾的幻想乡

3926: [Zjoi20150]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 438  Solved: 273 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修

字符串(广义后缀自动机):BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡

3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 843  Solved: 510[Submit][Status][Discuss] Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n