首页 > 其他分享 >3.16 模拟赛 T2 记录

3.16 模拟赛 T2 记录

时间:2024-03-16 16:55:23浏览次数:26  
标签:GCC 标记 T2 ll tr 3.16 区间 now 模拟

早上打的一场模拟赛,场上没想出来,下来看题解感觉还挺板的?

操作比较复杂,考虑线段树,把 \(n\) 变为 \(2^k\),这样就可以和树状数组操作的区间 \([i-lowbit(i)+1,i]\) 一一对应,因为此时线段树的每一层的每一段区间都一定是 \(2\) 的整数倍。

维护两个标记一个是区间加标记,一个树状数组的标记。

然后修改的时候下来到一个包含的区间,可以提前预处理贡献打上标记。

再对于一个相交的区间,如果他是一个树状数组区间,就打一个区间加的标记,相当于把这一段的操作加上。

然后好像就没有了。唯一注意 \(n\) 要变成 \(2^k\),所以空间不能开刚好。

`

#include <bits/stdc++.h>

#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2")
#pragma GCC optimize("no-stack-protector")

using namespace std;

typedef long long ll;

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 21], *p1 = buf, *p2 = buf;
inline int read() {
    char c = getchar();
    int x = 0,f=1;
    while(!isdigit(c)){
    	if(c=='-') f=-1;
    	c=getchar();
    }
    for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
    return x*f;
}
inline void write(ll x){
    if(x<0){
    	putchar('-');
		x=-x;
	}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}


const int maxn=3e6+5;
ll tr[maxn<<2],tag[maxn<<2],lz[maxn<<2];
ll val[maxn<<2];

inline int lowbit(int x){
	return x&(-x);
}
inline bool check(int l,int r){
	if(r-lowbit(r)+1==l) return 1;
	return 0;
}

void pushdown(int now,int l,int r){
	int mid=(l+r)>>1;
	if(tag[now]){
		tr[now<<1]+=tag[now]*val[now<<1];
		tr[now<<1|1]+=tag[now]*val[now<<1|1];
		if(check(l,mid)) lz[now<<1]+=tag[now];
		if(check(mid+1,r)) lz[now<<1|1]+=tag[now];
		// printf("%lld %lld %lld : %lld %lld\n",l,mid,r,tag[now]*val[now<<1],tag[now]*val[now<<1|1]);
		tag[now<<1]+=tag[now];
		tag[now<<1|1]+=tag[now];
		tag[now]=0;
	}
	if(lz[now]){
		tr[now<<1]+=1ll*(mid-l+1)*lz[now];
		tr[now<<1|1]+=1ll*(r-mid)*lz[now];
		lz[now<<1]+=lz[now];
		lz[now<<1|1]+=lz[now];
		lz[now]=0;
	}
}
void build(int now,int l,int r){
	tr[now]=tag[now]=lz[now]=val[now]=0;
	if(check(l,r)) val[now]=(r-l+1);
	if(l==r) return;
	int mid=(l+r)>>1;
	build(now<<1,l,mid);
	build(now<<1|1,mid+1,r);
	val[now]+=val[now<<1]+val[now<<1|1];
	// printf("%lld %lld %lld : %lld\n",now,l,r,val[now]);
}
void pushup(int now){
	tr[now]=tr[now<<1]+tr[now<<1|1];
}
void update(int now,int l,int r,int ql,int qr,int x){
	if(ql<=l&&qr>=r){
		tr[now]+=1ll*x*val[now];
		tag[now]+=x;
		if(check(l,r)) lz[now]+=x;
		// printf("jj%d %lld : %lld\n",l,r,x*val[now]);
		return;
	}
	if(r<=qr&&check(l,r)){
		tr[now]+=1ll*(r-l+1)*x;
		lz[now]+=x;
		// printf("pp%d %lld : %lld\n",l,r,x*(r-l+1));
	}
	pushdown(now,l,r);
	int mid=(l+r)>>1;
	if(ql<=mid) update(now<<1,l,mid,ql,qr,x);
	if(qr>mid) update(now<<1|1,mid+1,r,ql,qr,x);
	pushup(now);
}
ll query(int now,int l,int r,int ql,int qr){
	if(ql<=l&&qr>=r) return tr[now];
	int mid=(l+r)>>1;
	ll res=0;
	pushdown(now,l,r);
	if(ql<=mid) res+=query(now<<1,l,mid,ql,qr);
	if(qr>mid) res+=query(now<<1|1,mid+1,r,ql,qr);
	return res;
}

int main(){
	
	int n=read(),q=read();
	
	int tn=__lg(n);
	if((1<<tn)<n) tn++;
	
	n=(1<<tn);
	
	// printf("kk%d\n",n);
	
	build(1,1,n);
	
	while(q--){
		int op=read(),l=read(),r=read(),x;
		if(op==1){
			x=read();
			update(1,1,n,l,r,x);
		}else{
			write(query(1,1,n,l,r));
			puts("");
		}
	}
	
	return 0;
}`

标签:GCC,标记,T2,ll,tr,3.16,区间,now,模拟
From: https://www.cnblogs.com/activeO/p/18077267

相关文章

  • 字符串函数与内存函数的使用和模拟实现
    前言:字符函数与内存函数的优劣:字符函数如果处理字符相关的数据的话,用起来比较方便。相较于字符串函数,内存函数可以处理除字符外的其他类型的数据。目录1.字符串函数1.1strcpy1.2strcmp1.3strcat 1.4strncpy  strncmp strncat2.内存函数2.1memcpy 2.2......
  • 3.16
    关于今天早起由于换新的作息,提前半个小时起床,导致我太困根本没醒,\(7:50\)宿管给我喊醒这件事……不是为啥我上课还困啊?上午第五节课,超课表的写了个“公自(A)”,于是\(HZOI2024\)初中全体集结来机房。还有\(3.14\)模拟赛,是真没人过来告诉我一声啊,\(14:30\)看到有个进行中,十......
  • springboot235基于SpringBoot的房屋交易平台的设计与实现
          本科毕业设计论文题目:房屋交易平台设计与实现系   别:XX系(全称)专    业:软件工程班   级:软件工程15201学生姓名:学生学号:指导教师:导师1       导师2摘  要信息数据从传统到当代,是一直在变革当中,突如其......
  • springboot233大学生就业需求分析系统
          本科毕业设计论文题目:大学生就业需求分析系统设计与实现系   别:XX系(全称)专    业:软件工程班   级:软件工程15201学生姓名:学生学号:指导教师:导师1       导师2摘  要信息数据从传统到当代,是一直在变革......
  • 13.【初三奥赛模拟测试2】
    估计也打不了多少\(qwq\)\(\Huge终于不垫底了。qwq\)初三奥赛模拟测试2T1南题解一道概率期望。一般都是从\(n\)开始递推到\(0\)。假设我们现在有\(i\)种枪,那么期望次数\[\largef_i=f_{i+1}+\fracn{n-i}\]因为当前有\(i\)种可能买到已经买过的枪,\(n-i\)......
  • ret2text(system($0))
    system($0)介绍在正常的编程或系统使用中,system($0) 本身并不会直接导致获取任何权限。$0 是一个特殊的shell变量,它代表当前脚本或程序的名字。在C语言中,如果你使用 system() 函数来执行一个shell命令,那么传递给 system() 的字符串会被当作shell命令来执行。如......
  • 《模拟电子技术》第一章:半导体器件
    旨在记录个人学习过程,督促自己学习。基于课堂讲解+课本+网络资源的模拟电子技术笔记课本是西安电子科技大学大学出版社出版,江晓安,付少峰,杨振江著请关注我哈哈,后期我还会更新计算题以及电路仿真,并适当地补充国外教材中的内容第一章半导体器件1.1半导体基础知识1.1.1本征......
  • 初三奥赛模拟测试2
    前言比赛链接——南昌起义。这辈子第一次\(rk~1\)。\(T1:\)概率期望,本来没学过,现学的(蓝书没看懂,还是网上的博客好理解),然后发现毕竟\(T1\)没那么难,知道概率期望是啥还是能做的。\(T2:\)本来看\(T1\)概率期望想先开\(T2\)的,但是发现不会就去学概率期望了,后来发......
  • LY1168 [ 20230325 CQYC省选模拟赛 T3 ] 游戏
    题意给定\(n\)个区间\(l_i,r_i,k_i\)。\(k_i\)表示解锁当前点当且仅当\(l_i\tor_i\)的区间内至少有\(k_i\)个点被解锁。问一共能解锁多少点。Sol直接暴力跑是\(n^2\)的。不难想到优化建图,复杂度:\(O(nk\log)\)这样明显是过不去的。集中注意力。注意到操......
  • 考研模拟面试-题目【攻略】
    考研模拟面试-题目【攻略】前言版权推荐考研模拟面试-题目前面的问题通用问题专业题数据结构计算机网络操作系统数据库网络安全手写题数据结构操作系统计算机网络代码题基础代码题其他代码题后面的问题补充题目最后前言2023-10-1912:00:57以下内容源自《考研模......