首页 > 其他分享 >区间开关灯模型

区间开关灯模型

时间:2024-03-28 21:29:06浏览次数:16  
标签:return idx int res 模型 开关 区间 const mod

P3870 [TJOI2009] 开关

先看一道经典的区间开关灯问题的模型,维护一个lz 每次异或操作就好了

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
const int N = 1e5+10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a*b/gcd(a,b);}
int qmi(int a,int b,int mod){int res=1;while(b){if(b&1)res=res*a%mod;b>>=1;a=a*a%mod;}return res;}


int n,q,m;

// int e[N],ne[N],w[N],h[N],idx;
// void add(int a,int b,int c){
	// e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx++;
// }



struct Segment{
	int l,r;
	int lz;
	int s;
}tr[N<<2];

void pushup(int u){
	tr[u].s = tr[u<<1].s + tr[u<<1|1].s;
}

void pushdown(int u){
	if(tr[u].lz){
		tr[u<<1].lz^=1;
		tr[u<<1|1].lz^=1;
		tr[u<<1].s = tr[u<<1].r-tr[u<<1].l+1-tr[u<<1].s;
		tr[u<<1|1].s = tr[u<<1|1].r-tr[u<<1|1].l+1-tr[u<<1|1].s;
		tr[u].lz = 0;
	}
}

void build(int u,int l,int r){
	tr[u] = {l,r,0,0};
	if(l==r)return;
	int mid = (l+r)/2;
	build(u<<1,l,mid),build(u<<1|1,mid+1,r);
	pushup(u);
}

void modify(int u,int l,int r){
	if(l<=tr[u].l&&tr[u].r<=r){
		tr[u].lz^=1;
		tr[u].s = tr[u].r-tr[u].l+1-tr[u].s;
		return;
	}
	
	pushdown(u);
	
	int mid = (tr[u].l+tr[u].r)/2;
	if(l<=mid)modify(u<<1,l,r);
	if(r>mid)modify(u<<1|1,l,r);
	pushup(u);
}


int query(int u,int l,int r){
	if(l<=tr[u].l&&tr[u].r<=r){
		return tr[u].s;
	}
	
	pushdown(u);
	int res = 0;
	int mid = (tr[u].l+tr[u].r)/2;
	if(l<=mid)res+=query(u<<1,l,r);
	if(r>mid)res+=query(u<<1|1,l,r);
	return res;
	
}






void solve()
{
	cin>>n>>q;
	build(1,1,n);
	
	while(q--){
		int op,l,r;cin>>op>>l>>r;
		if(!op)modify(1,l,r);
		else cout<<query(1,l,r)<<"\n";
	}

}

signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _;
	//cin>>_;
	_ = 1;
	while(_--)solve();
	return 0;
}

E. Danil and a Part-time Job

再看一道这个问题的树上版本

结合一下dfn序处理区间问题就好了

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
const int N = 2e5+10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a*b/gcd(a,b);}
int qmi(int a,int b,int mod){int res=1;while(b){if(b&1)res=res*a%mod;b>>=1;a=a*a%mod;}return res;}


int n,q,m;

// int e[N],ne[N],w[N],h[N],idx;
// void add(int a,int b,int c){
	// e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx++;
// }
int cost[N];
int dfn[N],in[N],out[N],times;
vector<int>g[N];

struct Segment{
	int l,r;
	int lz;
	int s;
}tr[N<<2];


void dfs(int u){
	in[u] = ++times;
	dfn[times] = u;
	for(int &t:g[u])dfs(t);
	out[u] = times;
}


void pushup(int u){
	tr[u].s = tr[u<<1].s + tr[u<<1|1].s;
}

void pushdown(int u){
	if(tr[u].lz){
		tr[u<<1].lz^=1;
		tr[u<<1|1].lz^=1;
		tr[u<<1].s = tr[u<<1].r-tr[u<<1].l+1-tr[u<<1].s;
		tr[u<<1|1].s = tr[u<<1|1].r-tr[u<<1|1].l+1-tr[u<<1|1].s;
		tr[u].lz = 0;
	}
}

void build(int u,int l,int r){
	tr[u] = {l,r};
	if(l==r){
		tr[u].lz = 0;
		tr[u].s = cost[dfn[l]];
		return;
	}
	int mid = (l+r)/2;
	build(u<<1,l,mid),build(u<<1|1,mid+1,r);
	pushup(u);
}

void modify(int u,int l,int r){
	if(l<=tr[u].l&&tr[u].r<=r){
		tr[u].lz^=1;
		tr[u].s = tr[u].r-tr[u].l+1-tr[u].s;
		return;
	}
	
	pushdown(u);
	
	int mid = (tr[u].l+tr[u].r)/2;
	if(l<=mid)modify(u<<1,l,r);
	if(r>mid)modify(u<<1|1,l,r);
	pushup(u);
}


int query(int u,int l,int r){
	if(l<=tr[u].l&&tr[u].r<=r){
		return tr[u].s;
	}
	
	pushdown(u);
	int res = 0;
	int mid = (tr[u].l+tr[u].r)/2;
	if(l<=mid)res+=query(u<<1,l,r);
	if(r>mid)res+=query(u<<1|1,l,r);
	return res;
	
}






void solve()
{
	cin>>n;
	for(int i=2;i<=n;++i){int fa;cin>>fa;g[fa].push_back(i);}
	dfs(1);
	for(int i=1;i<=n;i++)cin>>cost[i];
	build(1,1,n);
	cin>>q;

	while(q--){
		string op;cin>>op;
		int id;cin>>id;
		if(op=="get")cout<<query(1,in[id],out[id])<<"\n";
		else modify(1,in[id],out[id]);
	}
	
	
	
	
	

}

signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _;
	//cin>>_;
	_ = 1;
	while(_--)solve();
	return 0;
}

标签:return,idx,int,res,模型,开关,区间,const,mod
From: https://blog.csdn.net/m0_60921016/article/details/137115706

相关文章

  • 必备知识点 模型层ORM
    模型层ORM1.Django连接MySQL数据库1.1配置mysql参数#MySQL配置项DATABASES={'default':{#ENGINE:默认的引擎mysql'ENGINE':'django.db.backends.mysql',#HOST:主机地址127.0.0.1/localhost"HOST"......
  • 开源模型应用落地-qwen1.5-7b-chat-LoRA微调(二)
     一、前言        预训练模型提供的是通用能力,对于某些特定领域的问题可能不够擅长,通过微调可以让模型更适应这些特定领域的需求,让它更擅长解决具体的问题。    本篇是开源模型应用落地-qwen-7b-chat-LoRA微调(一)进阶篇,学习通义千问最新1.5系列模型的微调方......
  • 2024天府杯全国大学生数学建模A题思路+模型+代码+论文
    2024天府杯数学建模竞赛A题思路模型代码:3.28第一时间更新,更新见文末名片A题:科研绩效分配方案设计与优化问题背景:科学研究领域的绩效评定有着较大的共性和行业典型特点,在高校科研人员日常管理工作中也是一项较复杂的研究性、政策性工作。科技部、教育部、......
  • 机器学习——模型评估与选择
    1、经验误差与过拟合  学习器在训练集上的误差称为“训练误差”或“经验误差”,在新样本上的误差称为“泛化误差”,显然,我们希望得到泛化误差小的学习器。为了达到这个目的,应该从训练样本中尽可能学出适用于所有潜在样本的“普遍规律”,这样才能在遇到新样本时做出正确的判......
  • MIS607网络安全评估威胁模型
    主题代码和标题MIS607网络安全评估威胁模型报告个人/团体个人长度1500字(+/-10%)学习成果通过成功证明的学科学习成果以下任务包括:b)探索和阐明网络趋势、威胁和保持安全在网络空间,加上保护个人和公司数据。c)分析与组织数据网络相关的问题和安全性,向他们推荐实用的解决方案决议......
  • R语言中的Nelson-Siegel模型在汇率预测的应用|附代码数据
    原文链接:http://tecdat.cn/?p=11680这篇文章的目的是指导读者逐步使用R编程语言实现Nelson-Siegel模型的步骤。您可能已经知道,估计利率期限结构是任何资产定价的关键,因此对投资者和政策制定者起着重要的作用 ( 点击文末“阅读原文”获取完整代码数据 )。想法是使一条连续曲线适......
  • MATLAB用GARCH-EVT-Copula模型VaR预测分析股票投资组合
    全文链接:http://tecdat.cn/?p=30426原文出处:拓端数据部落公众号对VaR计算方法的改进,以更好的度量开放式基金的风险。本文把基金所持股票看成是一个投资组合,引入Copula来描述多只股票间的非线性相关性,构建多元GARCH-EVT-Copula模型来度量开放式基金的风险,并与其他VaR估计方法的预......
  • 0518--台球俱乐部会员网之“NABCD模型”
    一、NABCDNeed(需求):目标用户可能需要一个方便的平台来获取关于台球俱乐部的信息,包括比赛安排、会员活动、教学资源等。这意味着网站需要提供清晰明了的信息架构,让用户能够快速找到所需信息,并且信息更新要及时。用户可能需要与其他会员进行交流和互动,分享经验、技巧,建立社交关系......
  • 知识图谱推理算法综述(下):基于语义的匹配模型
    背景知识图谱系统的建设需要工程和算法的紧密配合,在工程层面,去年蚂蚁集团联合OpenKG开放知识图谱社区,共同发布了工业级知识图谱语义标准OpenSPG并开源;算法层面,蚂蚁从知识融合,知识推理,图谱应用等维度不断推进。OpenSPGGitHub,欢迎大家Star关注~:https://github.com/Ope......
  • Flask python 开发篇:模型(model)Flask-SQLAlchemy的使用
    Flask-SQLAlchemy实现模型一、为什么使用模型?二、Flask-SQLAlchemy的引入三、使用Flask-SQLAlchemy构建模型文件3.1、安装扩展3.2、配置3.3、实战使用3.4、与蓝图相结合使用一、为什么使用模型?上一篇分享了蓝图的使用,也说蓝图相当于了php中控制器+路由的使用,那根......