绍兴一中模拟赛3.19——时光流转

6 篇文章 1 订阅
4 篇文章 0 订阅

Description

Solution

离线以后点分
对于每个点,都用这个点的祖先把这个点的子树更新一遍,
考虑到操作时间早的才能更新晚的和题目中说的“路径上边权都大于等于 v a l val val”,
那就用树状数组做一下二维偏序就行了

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(register int i=(a);i<=(b);++i)
#define dep(i,a,b) for(register int i=(b);i>=(a);--i)
inline char gc(){
	static char buf[100000],*p1=buf,*p2=buf;
	return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int rd(){
	int x=0,fl=1;char ch=gc();
	for(;ch<48||ch>57;ch=gc())if(ch=='-')fl=-1;
	for(;48<=ch&&ch<=57;ch=gc())x=(x<<3)+(x<<1)+(ch^48);
	return x*fl;
}
char pbuf[100000],*pp=pbuf;
inline void pc(char ch){if(pp==pbuf+100000)fwrite(pbuf,1,100000,stdout),pp=pbuf;*pp++=ch;}
inline void wri(ll x){
	static char st[19];
	int tp=0;
	if(x<0)pc(45),x=-x;
	if(!x)pc(48);
	while(x)st[tp++]=x%10|48,x/=10;
	while(tp)pc(st[--tp]);
}
inline void wln(ll x){wri(x),pc(10);}
inline void flush(){fwrite(pbuf,1,pp-pbuf,stdout);}
const int N=100002;
struct node{
	int x,y,v;
	node(){}
	node(int x_,int y_,int v_){x=x_,y=y_,v=v_;}
	bool operator <(node a)const{return x<a.x;}
}A[N],B[N];
struct kk{
	int to,ne,w;
}e[N<<1];
int dep[N],h[N],tot,tot1,tot2,op[N],x,y,z,u,sz[N],n,m,mx[N],rt,st[N];
ll t[N],ans[N];
bool vis[N];
vector<node>md[N];
vector<int>q[N],V;
void add(int x,int y,int z){e[++tot]=(kk){y,h[x],z},h[x]=tot;}
void clear(int x){
	for (;x<=m;x+=x&-x) t[x]=0;
}
void add(int x,int y){
	for (;x<=m;x+=x&-x) t[x]+=y;
}
ll query(int x){
	ll s=0;
	for (;x;x^=x&-x) s+=t[x];
	return s;
}
void getrt(int u,int fa){
	V.push_back(u);
	sz[u]=1,mx[u]=0;
	for (int i=h[u],v;i;i=e[i].ne)
		if (!vis[v=e[i].to] && v!=fa) getrt(v,u),sz[u]+=sz[v],mx[u]=max(mx[u],sz[v]);
}
void init(int u,int fa){
	for (int i=h[u],v;i;i=e[i].ne)
		if ((v=e[i].to)!=fa) dep[v]=dep[u]+1,init(v,u);
}
void dfs1(int u,int w){
	for (int i=0;i<md[u].size();i++)
		if (md[u][i].x<=w) A[++tot1]=md[u][i];
	for (int i=h[u],v;i;i=e[i].ne)
		if (!vis[v=e[i].to] && dep[v]<dep[u]) dfs1(v,min(w,e[i].w));
}
void dfs2(int u,int fa,int w){
	for (int i=0;i<q[u].size();i++) B[++tot2]=node(w,q[u][i],0);
	for (int i=h[u],v;i;i=e[i].ne)
		if (!vis[v=e[i].to] && v!=fa && dep[v]>dep[u]) dfs2(v,u,min(w,e[i].w));
}
void solve(int u){
	tot1=tot2=0;
	dfs1(u,1e9);
	dfs2(u,0,1e9);
	sort(A+1,A+tot1+1);
	sort(B+1,B+tot2+1);
	int j=1;
	rep(i,1,tot2){
		for (;j<=tot1 && A[j].x<=B[i].x;j++) add(A[j].y,A[j].v);
		ans[B[i].y]+=query(B[i].y);
	}
	rep(j,1,tot1) clear(A[j].y);
}
void work(int u){
	V.clear();
	getrt(u,0);
	rt=0;
	if (!V.size()) return;
	for (int i=0;i<V.size();i++){
		int v=V[i];
		mx[v]=max(mx[v],sz[u]-sz[v]);
		if (mx[v]<mx[rt]) rt=v;
	}
	u=rt;
	solve(u),vis[u]=1;
	for (int i=h[u],v;i;i=e[i].ne)
		if (!vis[v=e[i].to]) work(v);
}
int main(){
	n=rd(),m=rd();
	rep(i,1,n) st[i]=rd();
	rep(i,1,n-1) x=rd(),y=rd(),z=rd(),add(x,y,z),add(y,x,z);
	rep(i,1,m){
		op[i]=rd();
		if (op[i]==2){
			x=rd(),y=rd(),u=rd();//x是chg,y是val
			md[u].push_back(node(y,i,x));
		}else{
			x=rd();
			ans[i]=st[x];
			q[x].push_back(i);
		}
	}
	dep[0]=-1,init(1,0);
	mx[0]=1e9;
	work(1);
	rep(i,1,m)
		if (op[i]==1) wln(ans[i]);
	flush();
}
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值