首页 > 其他分享 >20240726【省选】模拟

20240726【省选】模拟

时间:2024-07-26 16:32:12浏览次数:16  
标签:省选 ll 查询 权线 权值 每颗 线段 模拟 20240726


破防了,什么 SCOI2024 Day1 翻版,一道题可能拿 100pts,一道题大多数人拿 10pts,还有一道不可做,队线 110/lh

T1

去他妈的煞笔构史题解,说了跟说了一样。

这个是真的不会。容易想到对二进制每一位开一颗权值线段树或者别的啥维护,然后我就不会了……

考虑将每颗权值线段树对应处理的区间设为 \([0,2^{i+1}-1]\),每次加入元素或删除元素时将其 \(\text{mod}\:\: 2^{i+1}\) 然后放到对应的权线上维护,开个 map 维护每个数的出现次数即可。

然后处理全局加操作,考虑维护一个全局的加法标记,加了之后相当于将每颗权值线段树的节点向后平移,但是我们已经设定了每颗权线的处理范围,每次平移时可能会超出处理范围,这个时候就在查询时分开查。对于要在权线上查询的区间 \([l,r]\),若 \(l\le r\) 则直接查询 \([l,r]\),否则分开查 \([l,lim]\) 和 \([0,r]\),\(lim\) 是每颗权线的处理上界。查询中 \(l=\text{get}(2^x,x),r=\text{get}(2^{x+1}-1,x)\)

还有既然我们将全局加的值看作是一个向右的平移量,那么每次查询以及加入或删除元素时都要减去这个平移量才能在原来的权值线段树区间上维护。

没了。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define in inline
#define ll long long
#define ls now<<1
#define rs now<<1|1
const ll N=1145140,M=1919810;
ll n,tag;
struct xx{
	ll sum[N],v;
	in void update(ll now,ll l,ll r,ll tar,ll k){
		sum[now]+=k;
		if(l==r) return;
		ll mid=(l+r)>>1;
		if(tar<=mid) update(ls,l,mid,tar,k);
		else update(rs,mid+1,r,tar,k);
	}
	in ll query(ll now,ll l,ll r,ll x,ll y){
		if(l>=x&&r<=y) return sum[now];
		ll mid=(l+r)>>1,ans=0;
		if(x<=mid) ans+=query(ls,l,mid,x,y);
		if(y>mid) ans+=query(rs,mid+1,r,x,y);
		return ans;
	}
	in ll que(ll l,ll r){
		if(l<=r) return query(1,0,v,l,r);
		return query(1,0,v,l,v)+query(1,0,v,0,r);
	}
}t[20];
map <ll,ll> ma;
ll get(ll x,ll mod){
	mod=1<<(mod+1);
	return (x%mod+mod)%mod;
}
int main(){
	//freopen("data.in","r",stdin);
	//freopen("Heshu.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n;
	for(int i=0;i<18;++i) t[i].v=(1<<(i+1))-1;
	for(int i=1;i<=n;++i){
		ll opt,x,w;
		cin>>opt>>x;
		if(opt==0){
			x-=tag,++ma[x];
			for(int j=0;j<18;++j) t[j].update(1,0,t[j].v,get(x,j),1);
		}
		if(opt==1){
			x-=tag,w=ma[x],ma[x]=0;
			for(int j=0;j<18;++j) t[j].update(1,0,t[j].v,get(x,j),-w);
		}
		if(opt==2) tag+=x;
		if(opt==3){
			ll l=get((1<<x)-tag,x),r=get((1<<(x+1))-1-tag,x);
			cout<<t[x].que(l,r)<<'\n';
		}
	}
	return 0;
}

T2

数论,会你妈

T3

有标号无向连通图计数,会你妈

标签:省选,ll,查询,权线,权值,每颗,线段,模拟,20240726
From: https://www.cnblogs.com/heshuwan/p/18325640

相关文章

  • 20240726模拟赛订正题笔记
    (T1)lnsyoj2212刷数组考场上切掉了,所以来说说考场上的做法。首先看数据范围,线段树并不能拿满分,所以考虑在数组上操作。如何处理区间覆盖:记录一下区间覆盖的数,然后记录第几次覆盖,单点修改或增加时查看次数被覆盖了几次,若与正常覆盖次数不符,则将此数设为新的覆盖数。考场代码如下......
  • Unity 模拟足球网的物理效果
    以下是模拟出足球网的效果,花光了好多细胞写出来的,满满的干货只需要把脚本挂载在足球网对象身上即可,代码比较通用,可以用在其他网格也可以的,只需要调节参数即可,主页也写了足球发射的脚本,搭配这个足球网的效果,可以模拟出足球踢进网时的物理效果usingUnityEngine;usingSystem......
  • 暑假集训CSP提高模拟8
    暑假集训CSP提高模拟8\(T1\)P155.基础的生成函数练习题(gf)\(100pts\)原题:[ABC093C]SameIntegers设通过操作\(a,b,c\)所能达到的最小整数为\(x\)。观察到对同两个数进行操作\(2\)等价于分别对这两个数各进行操作\(1\),在\(a,b,c\)达到\(x\)的过程中优先......
  • 模拟算法概览
    前言LeetCode上的模拟算法题目主要考察通过直接模拟问题的实际操作和过程来解决问题。这类题目通常不需要高级的数据结构或复杂的算法,而是通过仔细的逻辑和清晰的步骤逐步解决。适合解决的问题模拟算法适合用来解决那些逻辑明确、步骤清晰且可以逐步执行的问题。这类题型通......
  • Ryujinx(Switch模拟器) v1.1.1361 汉化版
    Ryujinx是一款免费、开源的NintendoSwitch模拟器,它可以在电脑上模拟NintendoSwitch游戏机的运行环境,让玩家们能够在PC上畅玩Switch游戏。Ryujinx支持大部分NintendoSwitch游戏,包括TheLegendofZelda:BreathoftheWild、SuperMarioOdyssey等知名游戏,而且还......
  • 【题解】「CSP模拟赛」雨天 rain
    雨天rain考场上打了一个动态开点线段树,但是被卡空间了......
  • 基于GD32的矩阵按键usb-hid设备,详细教程,完全模拟的电脑数字键盘的所有功能,包括长按、
    本文采用的是基于GD32F350的一个4×5的矩阵键盘键盘板。矩阵键盘的电路原理图大致如下,由四个列引脚和五个行引脚来检测判断按键的按下。本文四个列引脚分别是PA15PB8PB9PC13,五个行引脚分别是PB10PB11PB12PB13PB14。typedefstruct{uint32_tGPIO_Group;......
  • 暑假集训CSP提高模拟7
    这个T1的\(n^{3}\)的SPJ效率还是太慢了,膜拜SPJ大神学长,还会画画A.Permutations&Primes这题感觉挺水的但是感觉有不是那么水,主要还是因为我赛时没想出正解,在打的表里找了一组好看的规律,打上了然后就过了.对偶数来说,我的规律正好是正解的特化,但是对奇数来说,我的规律就......
  • 「模拟赛」暑期集训CSP提高模拟6(7.23)
    \(140pts,Rank23\)题目列表A.花间叔祖B.合并rC.回收波特D.斗篷花间叔祖\(98pts\)题意:给定一个数组,选择一个大于等于2的模数,然后把数组中的数变成\(mod\)该模数后的数。只能操作一次,问操作后最少有几种不同的数。赛事分析:开始5分钟想到了算\(a_i\)中所有......
  • 盖世计划-0724-B班模拟 C. 游戏 (game)
    首先,Alice先去\(n\)个商店中购买物品。其中第\(i\)个商店售卖编号为\(i\)的物品,且每个物品的售价为\(a_i\)。Alice的总花费不能超过\(k\)。接着,Bob再去另外\(m\)个商店中购买物品。其中第\(i\)个商店售卖编号为\(n+i\)的物品,且每个物品的售价为\(1\)。Bob的......