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


思路

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

显然一开始就有的苹果可以看做第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 101010typedef 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_JUDGEfreopen("a.in","r",stdin);#endif}inline void chktime(){#ifndef ONLINE_JUDGEcout<<(clock()-t)/1000.0<<'\n';#endif}#ifdef modll 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);}#elsell 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:queryint p,d;ll w; // dfn:p,dep:d,+=wint l,r,D,id; // dfn:[l,r],dep:\geq Dint 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;
}

转载于:https://www.cnblogs.com/p-b-p-b/p/10440578.html

GDOI2018 涛涛摘苹果 [CDQ分治]相关推荐

  1. JZOJ 5699. 【gdoi2018 day1】涛涛接苹果(appletree)

    Description Input Output Sample Input 10 5 6 1 2 3 4 5 6 7 8 9 10 9 7 7 10 6 5 7 5 5 8 5 1 2 1 3 2 2 ...

  2. 试题 算法提高 陶陶摘苹果

    问题描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出n个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在已知n个苹 ...

  3. 陶陶摘苹果,苹果摘陶陶

    陶陶摘苹果,苹果摘陶陶 [出自洛谷题库]C++ 陶陶摘苹果: 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手 ...

  4. Python编程题(1)——淘淘摘苹果

    题目描述: 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10 个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个 30 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现 ...

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

    ==== €€£ WARNING ==== 这篇博文由于过于久远并没有什么干货已被废弃 新博文链接->CDQ分治&整体二分 ====                          = ...

  6. 【BZOJ-3456】城市规划 CDQ分治 + NTT

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=3456 Solution 这个问题可以考虑dp,利用补集思想 N个点的简单图总数量为$2^{ ...

  7. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  8. bzoj2961 共点圆 (CDQ分治, 凸包)

    /* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面然后cdq分治就可以了代码基本是抄的,*/#include ...

  9. 洛谷P3122 [USACO15FEB]圈住牛Fencing the Herd(计算几何+CDQ分治)

    题面 传送门 题解 题目转化一下就是所有点都在直线\(Ax+By-C=0\)的同一侧,也就可以看做所有点代入\(Ax+By-C\)之后的值符号相同,我们只要维护每一个点代入直线之后的最大值和最小值,看 ...

最新文章

  1. getitemdata中参数设置
  2. 推荐一个XNA的学习站点
  3. 你花了多久弄明白架构设计?kafka日志清理
  4. php72w redis,docker php7安装php-redis
  5. return view详解
  6. vs dll必须和exe在同一个目录_Win10系统丢失 .dll 文件的三种解决方案教程
  7. Effective Java~3. 私有Constructor 或Enum 强化单例
  8. 知道一个公司的网站地址,怎么快速获取邮箱。
  9. 超码、候选码和主码有什么区别?
  10. JavaScript - 语言进阶
  11. 智过网:2023年注册测绘师考试执业范围
  12. 解决桌面图标左下角蓝色问号问题
  13. 【类和对象】深入浅出类和对象
  14. mysql主从三个线程工作顺序_MySQL主从介绍、准备工作、配置主、配置从、测试主从同步...
  15. A.Cow Gymnastics 奶牛体操
  16. 学习黑盒优化算法CMA和RandomSearch,借助阿里达摩院MindOpt的RABBO榜单【系列2/4】
  17. 计算机网络第八版(谢希仁)答案
  18. 2013年企业信息化必备的五大软件
  19. 九九乘法表 C语言完成
  20. MySQL中Event事件的执行记录查询

热门文章

  1. android无线充电器推荐,和安卓通用的无线充电器门派推荐
  2. Windows 10配置阿里云DNS
  3. 开发板Linux手指滑动方向,移动应用滑动屏幕方向判断解决方案,JS判断手势方向...
  4. 相关模块的接口表及API
  5. iOS runtime再学习
  6. 微软常用运行库合集 202206
  7. 中国人寿如何基于容器搭建金融PaaS云平台 1
  8. A. Arena of Greed【贪心+特判】
  9. 安装时提示用户在命令行上发出了EULAS_AGREED=1,表示不接受许可协议
  10. 梅捷计算机主板价格,梅捷H81亲民主板逆袭!新到货仅售499元