cf1076E Vasya and a Tree (线段树)

我的做法:

给询问按$deep[v]+d$排序,每次做到某一深度的时候,先给这个深度所有点的值清0,然后直接改v的子树

官方做法比较妙妙:

dfs,进入v的时候给$[deep[v],deep[v]+d]+=x$,出来的时候再减回来

日常忘开longlong,这回事变量开了输出没开

  1 #pragma GCC optimize(3)
  2 #include<bits/stdc++.h>
  3 #define pa pair<ll,ll>
  4 #define CLR(a,x) memset(a,x,sizeof(a))
  5 using namespace std;
  6 typedef long long ll;
  7 const int maxn=3e5+10;
  8 
  9 inline char gc(){
 10     return getchar();
 11     static const int maxs=1<<16;static char buf[maxs],*p1=buf,*p2=buf;
 12     return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxs,stdin),p1==p2)?EOF:*p1++;
 13 }
 14 inline ll rd(){
 15     ll x=0;char c=gc();bool neg=0;
 16     while(c<'0'||c>'9'){if(c=='-') neg=1;c=gc();}
 17     while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=gc();
 18     return neg?(~x+1):x;
 19 }
 20 
 21 struct Q{
 22     int p,d,x;
 23 };
 24 int N,M,mdep,eg[maxn*2][2],egh[maxn],ect;
 25 int dfn[maxn][2],tot,dep[maxn];
 26 vector<int> poi[maxn];
 27 vector<Q> que[maxn];
 28 ll v[maxn<<2],laz[maxn<<2];
 29 
 30 
 31 inline void adeg(int a,int b){
 32     eg[++ect][0]=b,eg[ect][1]=egh[a],egh[a]=ect;
 33 }
 34 
 35 inline void dfs(int x,int f){
 36     dfn[x][0]=++tot;mdep=max(mdep,dep[x]);
 37     poi[dep[x]].push_back(x);
 38     for(int i=egh[x];i;i=eg[i][1]){
 39         int b=eg[i][0];if(b==f) continue;
 40         dep[b]=dep[x]+1;dfs(b,x);
 41     }
 42     dfn[x][1]=tot;
 43 }
 44 
 45 inline void pushdown(int p){
 46     if(!laz[p]) return;
 47     int a=p<<1,b=p<<1|1;
 48     laz[a]+=laz[p],v[a]+=laz[p];
 49     laz[b]+=laz[p],v[b]+=laz[p];
 50     laz[p]=0;
 51 }
 52 
 53 inline void add(int p,int l,int r,int x,int y,int z){
 54     if(x<=l&&r<=y){
 55         v[p]+=z,laz[p]+=z;
 56     }else{
 57         int m=l+r>>1;
 58         pushdown(p);
 59         if(x<=m) add(p<<1,l,m,x,y,z);
 60         if(y>=m+1) add(p<<1|1,m+1,r,x,y,z);
 61     }
 62 }
 63 
 64 inline void change(int p,int l,int r,int x,int y){
 65     if(l==r) v[p]=y;
 66     else{
 67         int m=l+r>>1;pushdown(p);
 68         if(x<=m) change(p<<1,l,m,x,y);
 69         else change(p<<1|1,m+1,r,x,y);
 70     }
 71 }
 72 
 73 ll ans[maxn];
 74 inline void query(int p,int l,int r){
 75     if(l==r) ans[l]=v[p];
 76     else{
 77         pushdown(p);
 78         int m=l+r>>1;
 79         query(p<<1,l,m);query(p<<1|1,m+1,r);
 80     }
 81 }
 82 
 83 int main(){
 84     //freopen("","r",stdin);
 85     int i,j,k;
 86     N=rd();
 87     for(i=1;i<N;i++){
 88         int a=rd(),b=rd();
 89         adeg(a,b);adeg(b,a);
 90     }M=rd();
 91     dep[1]=1;dfs(1,0);
 92     for(i=1;i<=M;i++){
 93         Q q;
 94         q.p=rd(),q.d=rd(),q.x=rd();
 95         que[min(dep[q.p]+q.d,mdep)].push_back(q);
 96     }
 97     for(i=1;i<=mdep;i++){
 98         for(j=0;j<poi[i].size();j++) change(1,1,N,dfn[poi[i][j]][0],0);
 99         for(j=0;j<que[i].size();j++){
100             int p=que[i][j].p;
101             add(1,1,N,dfn[p][0],dfn[p][1],que[i][j].x);
102         }
103     }
104     query(1,1,N);
105     for(i=1;i<=N;i++)
106         printf("%I64d ",ans[dfn[i][0]]);
107     return 0;
108 }

 

转载于:https://www.cnblogs.com/Ressed/p/9967271.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值