首页 > 其他分享 >【做题记录】SHOI 2012 魔法树

【做题记录】SHOI 2012 魔法树

时间:2023-05-19 23:15:33浏览次数:54  
标签:ch fw read 魔法 int qrw SHOI define 2012

有两个操作:

  1. 将 \(u\) 到 \(v\) 路径增加 \(k\)
  2. 询问 \(u\) 节点的子树和

显然,我们可以用树链剖分+线段树来做。

代码:

#include<cstdlib>
#include<cstdio>
#include<cctype>
#include<algorithm>
typedef long long LL;
typedef unsigned long long ULL;
namespace FastIo{
    typedef __uint128_t ULLL;
    static char buf[100000],*p1=buf,*p2=buf,fw[100000],*pw=fw;
    #define gc p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++
    inline void pc(const char &ch){
        if(pw-fw==100000)fwrite(fw,1,100000,stdout),pw=fw;
        *pw++=ch;
    }
    #define fsh fwrite(fw,1,pw-fw,stdout),pw=fw
    struct FastMod{
        FastMod(ULL b):b(b),m(ULL((ULLL(1)<<64)/b)){}
        ULL reduce(ULL a){
            ULL q=(ULL)((ULLL(m)*a)>>64);
            ULL r=a-q*b;
            return r>=b?r-b:r;
        }
        ULL b,m;
    }HPOP(10);
    struct QIO{
        char ch;
        int st[40];
        inline void read(int &x){
            x=0,ch=gc;
            while(!isdigit(ch))ch=gc;
            while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=gc;}
        }
        inline char read(){
        	ch=gc;
        	while(ch<'A'||ch>'Z')ch=gc;
        	return ch;
		}
        template<class T>inline void write(T a){
            do{st[++st[0]]=HPOP.reduce(a);a/=10;}while(a);
            while(st[0])pc(st[st[0]--]^48);
            pc('\n');
        }
    }qrw;
}
using namespace FastIo;
#define NUMBER1 100000
#define P(A) A=-~A
#define fione_i(begin,end) for(register int i=begin;i<=end;P(i))
#define tt(u) for(register int i=head[u];i;i=e[i].next)
#define ls(rt) rt<<1
#define rs(rt) rt<<1|1
#define mid (l+r>>1)
#define lson l,mid,ls(rt)
#define rson mid+1,r,rs(rt)
#define sz (r-l+1)
using std::swap;
struct EDGE{int next,to;}e[(NUMBER1<<1)+5];
int head[NUMBER1+5],n,cnt(0),tot(0),size[NUMBER1+5],top[NUMBER1+5],depth[NUMBER1+5],son[NUMBER1+5],fa[NUMBER1+5],id[NUMBER1+5];
inline void add(const int &u,const int &v){e[++tot].next=head[u];head[u]=tot,e[tot].to=v;}
struct Segment{//线段树
	LL tree[(NUMBER1<<2)+5],lazy[(NUMBER1<<2)+5];
	inline void push_up(const int &rt){tree[rt]=tree[ls(rt)]+tree[rs(rt)];}
	inline void change(int l,int r,int rt,LL date){tree[rt]+=date*sz,lazy[rt]+=date;}
	inline void push_down(int l,int r,int rt){
		change(lson,lazy[rt]);change(rson,lazy[rt]);
		lazy[rt]=0;
	}
	void intervaland(int l,int r,int rt,int x,int y,LL date){
		if(x<=l&&r<=y)return tree[rt]+=date*sz,lazy[rt]+=date,void();
		push_down(l,r,rt);
		if(x<=mid)intervaland(lson,x,y,date);
		if(mid<y)intervaland(rson,x,y,date);
		push_up(rt);
	}
	LL intervalsum(int l,int r,int rt,int x,int y){
		if(x<=l&&r<=y)return tree[rt];
		push_down(l,r,rt);
		LL res(0);
		if(x<=mid)res+=intervalsum(lson,x,y);
		if(mid<y)res+=intervalsum(rson,x,y);
		return res;
	}
}seg;
void dfs1(int u,int fath,int deep){//树链剖分
	size[u]=1,fa[u]=fath,depth[u]=deep;
	int ms(-1);
	tt(u){
		if(e[i].to==fath)continue;
		dfs1(e[i].to,u,deep+1);
		size[u]+=size[e[i].to];
		if(size[e[i].to]>ms)ms=size[e[i].to],son[u]=e[i].to;
	}
}
void dfs2(int u,int tf){
	id[u]=++cnt,top[u]=tf;
	if(!son[u])return;
	dfs2(son[u],tf);
	tt(u){
		if(e[i].to==fa[u]||e[i].to==son[u])continue;
		dfs2(e[i].to,e[i].to);
	}
}
inline void treeand(int x,int y,LL date){//路径和加k
	while(top[x]!=top[y]){
		if(depth[top[x]]<depth[top[y]])swap(x,y);
		seg.intervaland(1,n,1,id[top[x]],id[x],date);
		x=fa[top[x]];
	}
	if(depth[x]>depth[y])swap(x,y);
	seg.intervaland(1,n,1,id[x],id[y],date);
}
signed main(){
    char a;
	int q,x,y,k;
    qrw.read(n);
    fione_i(2,n){
    	qrw.read(x);
    	qrw.read(y);
    	P(x),P(y);
    	add(x,y);add(y,x);
	}
	dfs1(1,0,1);
	dfs2(1,1);
	qrw.read(q);
	while(q--){
		a=qrw.read();
		qrw.read(x);
		P(x);
		if(a=='A'){
			qrw.read(y);
			P(y);
			qrw.read(k);
			treeand(x,y,k);
		}else qrw.write(seg.intervalsum(1,n,1,id[x],id[x]+size[x]-1));
	}
	fsh;
    exit(0);
    return 0;
}

标签:ch,fw,read,魔法,int,qrw,SHOI,define,2012
From: https://www.cnblogs.com/SHOJYS/p/17416525.html

相关文章

  • 20201226马瑞婕Exp7-网络欺诈防范
    目录一、实验过程1简单应用SET工具建立冒名网站2ettercapDNSspoof2.1配置kali网卡2.2对DNS缓存表进行修改2.3配置欺骗DNS2.3.1开启ettercap2.3.2监听网卡12.3.3扫描子网3引导特定访问到冒名网站二、问题回答2.1通常在什么场景下容易受到DNSspoof攻击2.2在日常生活工......
  • Windows Server 2012 域控搭建
     0x01准备1、设置固定ip地址  2、修改计算机名  3、立即重新启动 0x02安装AD1、管理--添加角色和功能2、添加角色和功能向导,直接点击下一步 3、添加角色和功能向导,基于角色或基于功能的安装,下一步。 4、从服务器池中选择服务器,下一步。 5、选择“ActiveDirecyoty域服......
  • 自动操作魔法师
    产品下载(won-soft.   ......
  • 【SHOI 2006】有色图
    题意假设有一张\(n\)阶完全图,每条边有一个颜色,那么叫它有色图。定义两个有色图本质相同,当且仅当存在一种点的置换,使得置换以后两张图每条边颜色对应相同。计数若颜色有\(m\)种,有多少本质不同的\(n\)阶有色图。数据范围:\(1\len\le53,1\lem\le1000\)。题解Polya定理......
  • 漏洞分析丨CVE-2012-1873
    一、漏洞简述cve-2012-1873同样是一个著名的堆溢出漏洞,他是IE6-8中MSHTL.dll中的CTableLayout::CalculateMinMax函数里,程序在执行时会以HTML代码中的元素span属性作为循环控制次数向堆中写入数据。第一次会优先根据span申请堆空间,当我们增大span的值后,却不会改变堆空间大小,这样就......
  • 简述2012版SQL SERVER备份还原到2008R2版SQL SERVER的方法(转载)
    转载:http://wfsj.weifang.gov.cn/sy/sjjl/201905/t20190531_5370608.html 目前审计机关数据分析通用的数据库为SQLSERVER2008R2版本。被审计单位相关业务系统的后台数据库主要是ORACLE、SQLSERVER 。审计人员需要将不同类型或者不同SQLSERVER版本的数据库转化到SQLSERVER......
  • Solution Set - “请背诵每条魔法的禁忌”
    目录0.「HAOI2018」「洛谷P4494」反色游戏1.「JSOI2010」「洛谷P6029」旅行2.「CTSC2017」「洛谷P3774」最长上升子序列⭐3.「CTSC2018」「洛谷P4566」青蕈领主⭐4.「CTSC2008」「洛谷P4528」图腾5.「SDOI2017」「洛谷P3779」龙与地下城6.「JSOI2018」「洛谷P4558......
  • MISRA C 2012标准学习与理解
    目录总览指示(Directives)实现编译和构建需求可追踪性代码设计规则(Rules)标准C环境未使用代码(Unusedcode)注释(Comments)字符集和词汇约定(Charactersetsandlexicalconventions)标识符类型(types)Literalsandconstants声明和定义(Declarationsanddefinitions)初始化(Initialization)......
  • NC20545 [HEOI2012]采花
    题目链接题目题目描述萧芸斓是Z国的公主,平时的一大爱好是采花。今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花。花园足够大,容纳了\(n\)朵花,花有\(c\)种颜色(用整数\(1-c\)表示),且花是排成一排的,以便于公主采花。公主每次采花后会统计采到的花的颜色数,颜色数......
  • 20201230张国强实验三
    免杀原理1.基础问题回答杀软是如何检测出恶意代码的?基于特征码的静态扫描技术在文件中寻找特定的十六进制字符串,如果找到,就可判定文件感染了某种病毒。启发式杀毒技术病毒要达到感染和破坏的目的,通常的行为都会有一定的行为和特征,所以可以通过分析相关的病毒指令,判......