【IPSC2015】【BZOJ4154】Generating Synergy

原创 2016年04月24日 08:46:59

Description

给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色
Input

第一行一个数T,表示数据组数
接下来每组数据的第一行三个数n,c,q表示结点个数,颜色数和操作数
接下来一行n-1个数描述2..n的父节点
接下来q行每行三个数a,l,c
若c为0,表示询问a的颜色
否则将距离a不超过l的a的子节点染成c
Output

设当前是第i个操作,y_i为本次询问的答案(若本次操作是一个修改则y_i为0),令z_i=i*y_i,请输出z_1+z_2+…+z_q模10^9+7
Sample Input

1

4 3 7

1 2 2

3 0 0

2 1 3

3 0 0

1 0 2

2 0 0

4 1 1

4 0 0
Sample Output

32
HINT

第1,3,5,7的询问的答案分别为1,3,3,1,所以答案为 1*1+2*0+3*3+4*0+5*3+6*0+7*1=32.

数据范围:

对于100%的数据T<=6,n,m,c<=10^5,

1<=a<=n,0<=l<=n,0<=c<=c

Source

考虑用dfs序和深度分别当成两维坐标
然后打打颜色标记就行了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Dnum 2
#define MAXN 100010
#define GET (ch>='0'&&ch<='9')
#define P 1000000007
using namespace std;
inline void in(int &x)
{
    char ch=getchar();x=0;
    while (!GET)    ch=getchar();
    while (GET) x=x*10+ch-'0',ch=getchar();
}
int ans;
int T,n,c,q,top,root,dfn,tp;
bool cmp_d;
int In[MAXN],Out[MAXN],deep[MAXN],sta[MAXN],id[MAXN];
struct edge {   int to; edge *next; }e[MAXN],*prev[MAXN];
inline void insert(int u,int v) {   e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top];  }
struct KDtree
{
    int ch[2],d[Dnum],minn[Dnum],maxn[Dnum],tim,col,f,flag;
    inline void init()  {   for (int i=0;i<Dnum;++i)    minn[i]=maxn[i]=d[i];   }
    inline bool operator < (const KDtree& a)const   {   return d[cmp_d]<a.d[cmp_d]; }
}tree[MAXN];
inline void push_up(int rt)
{
    id[tree[rt].flag]=rt;tree[rt].flag=0;tree[rt].col=1;
    for (int i=0,x=0;i<2;++i)
        if ((x=tree[rt].ch[i]))
        {
            for (int j=0;j<Dnum;++j)
                tree[rt].minn[j]=min(tree[rt].minn[j],tree[x].minn[j]),
                tree[rt].maxn[j]=max(tree[rt].maxn[j],tree[x].maxn[j]);
        }
}
inline void push_down(int rt)
{
    int tmp=0;
    if ((tmp=tree[rt].flag))
    {
        for (int i=0,x=0;i<2;++i)   if ((x=tree[rt].ch[i])) tree[x].col=tree[x].flag=tmp;
        tree[rt].flag=0;
    }
}
int rebuild(int l=1,int r=n,bool d=0,int f=0)
{
    cmp_d=d;int mid=(l+r)>>1;nth_element(tree+l,tree+mid,tree+r+1);
    tree[mid].init();tree[mid].f=f;
    if (l!=mid) tree[mid].ch[0]=rebuild(l,mid-1,d^1,mid);
    if (r!=mid) tree[mid].ch[1]=rebuild(mid+1,r,d^1,mid);
    return push_up(mid),mid;
}
int col,x1,x2,y1,y2;
void modify(int rt=root)
{
    if (tree[rt].minn[0]>x2||tree[rt].maxn[0]<x1||tree[rt].maxn[1]<y1||tree[rt].minn[1]>y2) return;
    if (tree[rt].minn[0]>=x1&&tree[rt].maxn[0]<=x2&&tree[rt].minn[1]>=y1&&tree[rt].maxn[1]<=y2) {   tree[rt].col=tree[rt].flag=c;return;    }
    push_down(rt);
    if (tree[rt].d[0]>=x1&&tree[rt].d[0]<=x2&&tree[rt].d[1]>=y1&&tree[rt].d[1]<=y2) tree[rt].col=c;
    for (int i=0,x=0;i<2;++i)   if ((x=tree[rt].ch[i])) modify(x);
}
inline int query(int rt)
{
    for (int i=rt;tree[i].f;i=tree[i].f)    sta[++tp]=tree[i].f;
    while (tp)  push_down(sta[tp--]);return tree[rt].col;
}
void dfs(int x)
{
    tree[x].flag=x;In[x]=tree[x].d[0]=++dfn;tree[x].d[1]=deep[x];
    for (edge *i=prev[x];i;i=i->next)   deep[i->to]=deep[x]+1,dfs(i->to);
    Out[x]=dfn;
}
inline void clear()
{
    for (int i=1;i<=n;i++)  for (int j=0;j<2;++j)   tree[i].ch[j]=0;
}
int main()
{
    for (in(T);T;T--)
    {
        in(n);in(c);in(q);int u,v;dfn=top=0;
        memset(prev+1,0,sizeof(edge*)*(n+1));clear();
        for (int i=2;i<=n;i++)  in(u),insert(u,i);
        dfs(1);root=rebuild();ans=0;
        for (int i=1;i<=q;i++)
        {
            in(u);in(v);in(c);
            if (c)  x1=In[u],x2=Out[u],y1=deep[u],y2=deep[u]+v,modify();
            else    ans=(1ll*query(id[u])*i+ans)%P;
        }
        printf("%d\n",ans);
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux Min装机--开机启动synergy

对于有两台PC(一台WIN一台LINUX)的用户来说, synergy是一个很好用的软件,它可以让你两台机器共用一个键盘和一个鼠标。 WIN里设置synergy自动启动很简单,但ubuntu里就会...
  • imzhujun
  • imzhujun
  • 2015年06月24日 17:32
  • 1166

关于synergy个人使用感受(两台机器一个键盘鼠标)

上次申请了一台机器,准备弄hadoop,两台机器两个键盘,占地方而且麻烦,呵呵,找到了解决方案,Synergy&xp&ubuntu 这里还需要注意的是两个要装同样的版本,开始我安装的时候xp...
  • ShiZhixin
  • ShiZhixin
  • 2013年04月16日 13:09
  • 6505

Synergy安装及使用方法

preface: 先前是需要在两部电脑之间互传文件,现在是需要直接从windows复制东西到ubuntu中,网上搜了下神器synergy可破。 卤主硬件条件为:一个ubuntu系统的32为电脑和wi...
  • u010454729
  • u010454729
  • 2015年07月01日 11:14
  • 6196

[synergy] 使用教程· 多台电脑共享键盘和鼠标

1·简介 synergy是个开源的软件,有三个版本 mac / linux / windows,要想实现共享鼠标键盘,必须在所有机器上都安装这个软件,并进行相应的配置,有一台唯一的主机作为服务器端,其...
  • eightwhells
  • eightwhells
  • 2015年10月28日 21:17
  • 34994

使用synergy实现键鼠共享

前序:        软件下载地址:http://symless.com/download/free/(官网)       教程地址:http://www.iplaysoft.com/syne...
  • jianlong727
  • jianlong727
  • 2017年01月03日 16:41
  • 1194

使用VS2015编译Synergyd历程,解决Synergd.exe占用CPU高的问题

Synergy简介 功能: 同一局域网中多台机器共享一套键盘鼠标,支持Windows、Linux、MAC设备,鼠标键盘物理连接的机器做服务器端,其他机器做客户端程序,在服务器端对各台机器进...
  • strongerzhi
  • strongerzhi
  • 2016年07月07日 15:56
  • 1238

synergy的安装使用

synergy 的介绍介绍就不说了,相信搜这个名字的肯定都了解了 如果想看更详细的介绍 https://github.com/symless/synergy/wiki 里面有详细的介绍 如果...
  • li740207611
  • li740207611
  • 2016年03月23日 10:33
  • 748

Synergy 多系统共享鼠标键盘 Windows 和 Mac 完全配置教程

公司终于配上了双主机双系统双屏幕,编码是爽了,但是桌上的键盘有多了一套,有没有什么软件能够在不同的电脑之间共享键盘和鼠标呢?后来发下了Synergy这款软件.不仅免费而且开源(支持下). 让办公桌...
  • wangtingshuai
  • wangtingshuai
  • 2014年01月02日 17:42
  • 11897

synergy一个鼠标控制多个电脑,synergy怎么用?synergy配置教程

synergy怎么用呢?synergy可以让你从一个单一的键盘和鼠标控制它们,具体synergy配置方法,我们一起来学习一下。 阅读这篇文章的网友还查看了 鼠标哪个牌子好 2014游戏鼠标排行榜...
  • mp624183768
  • mp624183768
  • 2017年11月03日 19:15
  • 376

synergy 使用教程· 多台电脑共享键盘和鼠标

synergy是个开源的软件,有三个版本 mac / linux / windows,要想实现共享鼠标键盘,必须在所有机器上都安装这个软件(服务端和客户端是同一个软件,只是配置时选项不同),并进行相应...
  • liuxiao723846
  • liuxiao723846
  • 2015年12月31日 15:53
  • 2232
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【IPSC2015】【BZOJ4154】Generating Synergy
举报原因:
原因补充:

(最多只允许输入30个字)