[NOIP2017集训日记 2017.9-11]

前言:

这次NOIP好像考不好就退役?

所以写点日记记录生活 好过什么都没留下 给以后做点怀念

2017.9.5

This Problem Is Too Simple!

这个超好的题

只要你想到离散化 O(N2logN) 草过是没有什么毛病的

可是你要想到精益求精 所以这样做不好

其实有O(Nlog N)做法

对于每一种颜色的 影响的是以这个点为端点的一条链 然后对于询问x y可以差分出四条链

我们关键是维护一条链怎么办 发现如果这个点+1了 子树内的肯定也+1

那么就是维护一个树状数组 这个点打一个+1标记 这个子树外的第一个点打一个-1标记 然后用树状数组维护前缀和即可

好像常数还没写O(N2logN)好...

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int Maxn=500010;

struct EDGE{int x,y,next;}edge[Maxn]; int len,first[Maxn];
void ins(int x,int y){len++; edge[len].x=x; edge[len].y=y; edge[len].next=first[x]; first[x]=len;}

struct node1
{
  int t,op,x,c;
  node1(){}
  node1(int _t,int _x,int _c,int _op){t=_t; x=_x; c=_c; op=_op;}
}Q1[Maxn*4]; int Q1len=0;
struct node2
{
  int t,x,y,c;
  node2(){}
  node2(int _t,int _x,int _y,int _c){t=_t; x=_x; y=_y; c=_c;}
}Q2[Maxn*4]; int Q2len=0;

int L[Maxn],R[Maxn],id=0; int fa[Maxn][21],dep[Maxn];

void Dfs(int x,int f)
{
  L[x]=++id;
  for(int k=first[x];k!=-1;k=edge[k].next)
  {
    int y=edge[k].y; if(y==f) continue;
    fa[y][0]=x; dep[y]=dep[x]+1; Dfs(y,x);
  }R[x]=id;
}

bool Cmp1(const node1 &x,const node1 &y)
{
  if(x.c!=y.c) return x.c<y.c;
  return x.t<y.t;
}

bool Cmp2(const node2 &x,const node2 &y)
{
  if(x.c!=y.c) return x.c<y.c;
  return x.t<y.t;
}

bool Cmp3(const node2 &x,const node2 &y){return x.t<y.t;}

int N,q; int preC[Maxn],C[Maxn],Clen=0; int ans[Maxn];

int tr[Maxn]; int low_bit(int x){return x&(-x);}
void Add(int x,int c){while(x<=N){tr[x]+=c; x+=low_bit(x);}}
int Query(int x){int ans=0; while(x>=1){ans+=tr[x]; x-=low_bit(x);} return ans;}
void Del(int x){while(x<=N){tr[x]=0; x+=low_bit(x);}}

int LCA(int x,int y)
{
  if(dep[x]<dep[y]) swap(x,y);
  int deep=dep[x]-dep[y];
  for(int i=20;i>=0;i--) if(deep>=(1<<i)) deep-=(1<<i),x=fa[x][i];
  if(x==y) return x;
  for(int i=20;i>=0;i--) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
  return fa[x][0];
}

int main()
{

  scanf("%d%d",&N,&q);

  for(int i=1;i<=N;i++) scanf("%d",&preC[i]),C[++Clen]=preC[i];
  for(int i=1;i<=N;i++) Q1[++Q1len]=node1(0,i,preC[i],1);

  len=0; memset(first,-1,sizeof(first));
  for(int i=1;i<N;i++){int x,y; scanf("%d%d",&x,&y); ins(x,y); ins(y,x);}
  id=0; dep[1]=1; Dfs(1,0);

  for(int j=1;j<=20;j++) for(int i=1;i<=N;i++) fa[i][j]=fa[fa[i][j-1]][j-1];

  for(int i=1;i<=q;i++)
  {
    char ch; scanf("\n%c",&ch);
    if(ch==‘C‘)
    {
      int x,c; scanf("%d%d",&x,&c); C[++Clen]=c;
      if(c!=preC[x])
      {
        Q1[++Q1len]=node1(i,x,preC[x],-1);
        Q1[++Q1len]=node1(i,x,c,1); preC[x]=c;
      }
    }
    else
    {
      int x,y,c; scanf("%d%d%d",&x,&y,&c);
      Q2[++Q2len]=node2(i,x,y,c); C[++Clen]=c;
    }
  }

  sort(Q1+1,Q1+Q1len+1,Cmp1);
  sort(Q2+1,Q2+Q2len+1,Cmp2);
  sort(C+1,C+Clen+1);

  Clen=unique(C+1,C+Clen+1)-(C+1);
  int l1=1,l2=1,r1=0,r2=0;
  for(int i=1;i<=Clen;i++)
  {
    int x=C[i];
    while(Q1[r1+1].c==C[i] && r1<=Q1len) r1++;
    while(Q2[r2+1].c==C[i] && r2<=Q2len) r2++;

    int last=l1;
    while(l1<=r1 && l2<=r2)
    {
      if(Q1[l1].t<Q2[l2].t)
      {
        Add(R[Q1[l1].x]+1,(-1)*Q1[l1].op); Add(L[Q1[l1].x],1*Q1[l1].op);
        l1++;
      }
      else
      {
        int r=LCA(Q2[l2].x,Q2[l2].y);
        ans[Q2[l2].t]=Query(L[Q2[l2].x])+Query(L[Q2[l2].y])-Query(L[r])-Query(L[fa[r][0]]);
        l2++;
      }
    }

    while(l1<=r1) l1++;
    while(l2<=r2)
    {
      int r=LCA(Q2[l2].x,Q2[l2].y);
      ans[Q2[l2].t]=Query(L[Q2[l2].x])+Query(L[Q2[l2].y])-Query(L[r])-Query(L[fa[r][0]]);
      l2++;
    }

    while(last<=r1) Del(R[Q1[last].x]+1),Del(L[Q1[last].x]),last++;
  }

  sort(Q2+1,Q2+Q2len+1,Cmp3);
  for(int i=1;i<=Q2len;i++) printf("%d\n",ans[Q2[i].t]);
  return 0;
}

时间: 2024-12-28 11:54:56

[NOIP2017集训日记 2017.9-11]的相关文章

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl

2017年11月11日软考网络工程师案例分析真题及答案解析

[徐朋出品,必属精品]软考徐朋老师全网最先发布2017年11月11日软考网络工程师案例分析真题及答案解析,是全网最清新版本.详细讲解了2017年11月11日最新开考的软考网络工程师案例分析真题及答案.课件中对每一道真题都进行了详细的解析讲解,考后几周是学员记忆答案的最关键时间点,第一时间发布真题及答案帮助广大考生准确评估自己的考试结果及对未来参加考试的学员展示最新的考试趋势等.下载地址:http://down.51cto.com/data/2340424

2017年11月11日软考网络规划设计师案例分析真题及答案解析

[徐朋出品,必属精品]软考徐朋老师全网最先发布2017年11月11日软考网络规划设计师案例分析真题及答案解析,是全网最清新版本.详细讲解了2017年11月11日最新开考的软考网络规划设计师案例分析真题及答案.课件中对每一道真题都进行了详细的解析讲解,考后几周是学员记忆答案的最关键时间点,第一时间发布真题及答案帮助广大考生准确评估自己的考试结果及对未来参加考试的学员展示最新的考试趋势等.下载地址:http://down.51cto.com/data/2340406

2017年11月GitHub上最热门的Java项目出炉

2017年11月GitHub上最热门的Java项目出炉~ 一起来看看这些项目你使用过哪些呢? 1分布式 RPC 服务框架 dubbohttps://github.com/alibaba/dubbo Star 13970 本月上涨1666 ?wx_fmt=jpeg&wxfrom=5&wx_lazy=1 Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成.主要核心部件:Remoting: 网络通

Gartner: 2017年11大信息安全技术(解读版)

在2017年6月份举办的第23届Gartner安全与风险管理峰会上,Gartner的Fellow--Neil McDonald发布了2017年度的11个最新最酷的信息安全技术,比往年的10大技术多了一项. 以往都是通过互联网了解Gartner的各种信息和报告.这次,本人有幸亲临现场,参加峰会,自然有更多的感悟.参加峰会期间,获得的信息量实在太大,直到现在,虽然已经过去了2个多月,依然没有消化完. 回到主题,以往我都是聚焦于每年选出来的10大信息安全技术本身,但对这些技术是如何被Gartner选出

2017年11月3日 VS三大类&amp;数组&amp;VS&amp;集合&amp;泛型集合

三大类 共分为两个大类: 基本数据型&引用类型 基本数据型---值类型---整型---常用的整型: Int , 长整型:  Long, 小整型: byle, 中整型 short --浮点型 -- 小浮点: float , 中浮点: double 大浮点: declaml --布尔型 -- bool(对错类型) -- ture||false --字符型 -- char(单一字符) 引用类型 -- 字符串 -- string -- 时间日期 -- DateTime 数组 // 必须规定类型,必须规定

集训日记

今天早上脑子不太清醒,突然想到之前教练说的脑子不清醒就该颓博客啊,于是打算开一个日记 记录一下集训期间发生的东西,作为回忆或笑料都好 20190727: 啊-集训开始快10天了才想起来要写日记 早上看着化奥的冲出去跑操莫名开心-导致自己现在还没有睡醒(什么因果关系) 待会要考达哥的题了,滚粗感十分强烈(尽管还没看到题) 总是希望能考好一点,然而次次事与愿违 希望这次能心想事成吧- 我待曙色沾霜,才知南柯一场 原文地址:https://www.cnblogs.com/mikufun-hzoi-cp

2017.3.11[codevs1937]【NOI2010】能量采集

题解:https://www.zybuluo.com/jesseliu612/note/668669 1 #include<cmath> 2 #include<queue> 3 #include<cstdio> 4 #include<vector> 5 #include<cstdlib> 6 #include<cstring> 7 #include<iostream> 8 #include<algorithm>

2017.08.11 Python网络爬虫实战之Beautiful Soup爬虫

1.与Scrapy不同的是Beautiful Soup并不是一个框架,而是一个模块:与Scrapy相比,bs4中间多了一道解析的过程(Scrapy是URL返回什么数据,程序就接受什么数据进行过滤),bs4则在接收数据和进行过滤之间多了一个解析的过程,根据解析器的不同,最终处理的数据也有所不同,加上这一步骤的优点是可以根据输入数据的不同进行针对性的解析:同一选择lxml解析器: 2.安装Beautiful Soup环境:pip install beautifulsoup4 3.Beautiful