传送门我会让你知道哪里有题面吗(逃


思路

显然不能模拟苹果下掉的过程,考虑计算每个苹果对询问的贡献。

显然一开始就有的苹果可以看做第0天变出来的,于是只需要考虑变出来的苹果了。

设当前询问节点\(x\),时间为\(t_1\)天早上。

设考虑的苹果一开始在\(t_2\)晚上从\(y\)节点上变了出来。

那么造成贡献的条件就是

  1. \[t_2<t_1
    \]

  2. \[dfn_x\leq dfn_y \leq low_x
    \]

  3. \[dep_y+t_2\geq dep_x +t_1-1
    \]

显然这是个三维偏序,裸上CDQ分治即可。

注意同一天早晚的区别,按时间sort时要小心。


代码

#include<bits/stdc++.h>
clock_t t=clock();
namespace my_std{
using namespace std;
#define pii pair<int,int>
#define fir first
#define sec second
#define MP make_pair
#define rep(i,x,y) for (int i=(x);i<=(y);i++)
#define drep(i,x,y) for (int i=(x);i>=(y);i--)
#define go(x) for (int i=head[x];i;i=edge[i].nxt)
#define templ template<typename T>
#define sz 101010
typedef long long ll;
typedef double db;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
templ inline T rnd(T l,T r) {return uniform_int_distribution<T>(l,r)(rng);}
templ inline bool chkmax(T &x,T y){return x<y?x=y,1:0;}
templ inline bool chkmin(T &x,T y){return x>y?x=y,1:0;}
templ inline void read(T& t)
{
t=0;char f=0,ch=getchar();double d=0.1;
while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();
if(ch=='.'){ch=getchar();while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();}
t=(f?-t:t);
}
template<typename T,typename... Args>inline void read(T& t,Args&... args){read(t); read(args...);}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
inline void print(register int x)
{
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
void file()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
}
inline void chktime()
{
#ifndef ONLINE_JUDGE
cout<<(clock()-t)/1000.0<<'\n';
#endif
}
#ifdef mod
ll ksm(ll x,int y){ll ret=1;for (;y;y>>=1,x=x*x%mod) if (y&1) ret=ret*x%mod;return ret;}
ll inv(ll x){return ksm(x,mod-2);}
#else
ll ksm(ll x,int y){ll ret=1;for (;y;y>>=1,x=x*x) if (y&1) ret=ret*x;return ret;}
#endif
// inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
}
using namespace my_std; int n,m,Q,M;
ll a[sz];
struct hh{int t,nxt;}edge[sz<<1];
int head[sz],ecnt;
void make_edge(int f,int t)
{
edge[++ecnt]=(hh){t,head[f]};
head[f]=ecnt;
edge[++ecnt]=(hh){f,head[t]};
head[t]=ecnt;
} int dfn[sz],low[sz],dep[sz],T;
void dfs(int x,int fa)
{
dfn[x]=++T;dep[x]=dep[fa]+1;
go(x) if(edge[i].t!=fa) dfs(edge[i].t,x);
low[x]=T;
} struct hhh
{
int type; // 0:modify,1:query
int p,d;ll w; // dfn:p,dep:d,+=w
int l,r,D,id; // dfn:[l,r],dep:\geq D
int ti; // time
}q[sz<<2];
inline bool cmp(const hhh &x,const hhh &y)
{
if (x.type!=y.type) return x.type;
if (x.type==0) return x.d>y.d;
return x.D>y.D;
}
inline bool cmpt(const hhh &x,const hhh &y)
{
if (x.type==y.type) return x.ti<y.ti;
else if (x.type) return x.ti<=y.ti;
return x.ti<y.ti;
}
ll ans[sz]; ll tr[sz];
void add(int x,ll w){while (x<=n) tr[x]+=w,x+=(x&(-x));}
ll query(int x){ll ret=0;while (x) ret+=tr[x],x-=(x&(-x));return ret;} void solve(int l,int r)
{
if (l==r) return;
int mid=(l+r)>>1;
solve(l,mid);solve(mid+1,r);
int p=l;
rep(i,mid+1,r) if (q[i].type)
{
while (p<=mid)
{
if (q[p].type) ++p;
else if (q[p].d>=q[i].D) add(q[p].p,q[p].w),++p;
else break;
}
ans[q[i].id]+=query(q[i].r)-query(q[i].l-1);
}
rep(i,l,p-1) if (!q[i].type) add(q[i].p,-q[i].w);
sort(q+l,q+r+1,cmp);
} int main()
{
file();
read(n,m,Q);
rep(i,1,n) read(a[i]);
int x,y,z;
rep(i,1,n-1) read(x,y),make_edge(x,y);
dfs(1,0);
rep(i,1,n) q[++M]=(hhh){0,dfn[i],dep[i],a[i],0,0,0,0,0};
while (m--) read(x,y,z),q[++M]=(hhh){0,dfn[y],dep[y]+x,z,0,0,0,0,x};
rep(i,1,Q) read(z,x),q[++M]=(hhh){1,0,0,0,dfn[x],low[x],dep[x]+z-1,i,z};
sort(q+1,q+M+1,cmpt);
solve(1,M);
rep(i,1,Q) printf("%lld\n",ans[i]);
return 0;
}

GDOI2018 涛涛摘苹果 [CDQ分治]的更多相关文章

  1. [学习笔记] CDQ分治 从感性理解到彻底晕菜

    最近学了一种叫做CDQ分治的东西...用于离线处理一系列操作与查询似乎跑得很快233 CDQ的名称似乎源于金牌选手陈丹琦 概述: 对于一坨操作和询问,分成两半,单独处理左半边和处理左半边对于右半边的影 ...

  2. 【教程】简易CDQ分治教程&学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

  3. BZOJ 2683 简单题 ——CDQ分治

    [题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...

  4. HDU5618 & CDQ分治

    Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...

  5. 初识CDQ分治

    [BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 200 ...

  6. HDU5322 Hope(DP + CDQ分治 + NTT)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...

  7. BZOJ4170 极光(CDQ分治 或 树套树)

    传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...

  8. BZOJ2683 简单题(CDQ分治)

    传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...

  9. BNUOJ 51279[组队活动 Large](cdq分治+FFT)

    传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...

随机推荐

  1. weui hd bd ft

    weui样式看到hd ,bd, ft hd 是header的缩写 bd 是body的缩写 ft 是footer的缩写

  2. SQL Server 2016 附加数据库提示创建文件失败如何解决

    1.右键Microsoft SQL Server Management Studio2.以管理员方式运行

  3. ASP.NET Web API 2 消息处理管道

    Ø  前言 ASP.NET 的应用程序都会有自己的消息处理管道和生命周期,比如:ASP.NET Web 应用程序(Web Form).ASP.NET MVC,还有本文将讨论的 ASP.NET Web ...

  4. 第26月第30天 srt

    1. ffmpeg -i 0.mp4 -vf subtitles=0.srt 1.mp4 https://jingyan.baidu.com/article/c45ad29c73cef2051653e ...

  5. Dan版本的nnet2

    除了chain,nnet1, nnet2, nnet3训练时调整转移模型,chain模型使用类似与MMI的训练准则 Dan's setup does not uses pre-training. Da ...

  6. python 生成器的GeneratorExit异常

    转载自:https://blog.csdn.net/hedan2013/article/details/72810653 当一个生成器对象被销毁时,会抛出一个GeneratorExit异常.请看下面的 ...

  7. php编程 之 php基础一

    1,语法 PHP 脚本在服务器上执行,然后将纯 HTML 结果发送回浏览器.PHP 文件通常包含 HTML 标签和一些 PHP 脚本代码 比如下面这个:这是一个简单的 PHP 文件实例,它可以向浏览器 ...

  8. 【Math for ML】矩阵分解(Matrix Decompositions) (下)

    [Math for ML]矩阵分解(Matrix Decompositions) (上) I. 奇异值分解(Singular Value Decomposition) 1. 定义 Singular V ...

  9. 为共享服务器配置Oracle数据库

    参考资料 https://docs.oracle.com/cd/E11882_01/server.112/e25494/manproc.htm#ADMIN00502

  10. glCleatDepth

    opengl里面的深度缓存  在现实生活中,一个实心物体挡在另外一个实心物体的前面, 后面的那个物体有部分会被遮盖掉 那么opengl里面如何模拟这个情况呢? 每个物体的每个像素都有一个深度缓存的值( ...