当前位置: 首页 > news >正文

【学习笔记】模拟赛题解

混乱邪恶

构造题的第一步总是最难想的。

考虑 n n n是偶数的情况,否则添加一个 0 0 0

首先把数从大到小排序,然后相邻的两个数配对,记其差为 s i s_i si

注意到 n ∈ [ 2 3 m , m ] n\in [\frac{2}{3}m,m] n[32m,m],因此 ∑ s i ≤ m − n 2 < n \sum s_i\le m-\frac{n}{2}<n sim2n<n

这就很有意思了。也就是说至少存在 n 2 \frac{n}{2} 2n 1 1 1,同时注意到 s i s_i si最大值不超过 m − n m-n mn

显然 n 2 ≥ m − n \frac{n}{2}\ge m-n 2nmn。那么可以设计如下算法:

s i s_i si从大到小排序,如果当前 s u m < 0 sum<0 sum<0,那么加上 s i s_i si,如果 s u m ≥ 0 sum\ge 0 sum0那么减去 s i s_i si

当然本题还有另一种构造方案。具体是让最大值减最小值,这样每次迭代完 ∑ s i \sum s_i si不超过数的个数的两倍。最后规约到 2 2 2个数的情况即可。

代码:

我信仰什么,我便实现哪种方法。

#include<bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define pb push_back
using namespace std;
int n,m,a[1000005],id[1000005],res[1000005];
ll sum;
vector<int>v2;
struct node{
	int x,y,d;
	bool operator <(const node &a)const {
		return d>a.d;
	}
};
vector<node> v3;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	memset(res,-1,sizeof res);
	cin>>n>>m;
	for(int i=1;i<=n;i++) {
		int x;cin>>x,id[x]=i,a[x]=1;
	}
	for(int i=m;i>=1;i--) {
		if(a[i]) {
			v2.pb(i);
		}
	}
	for(int i=0;i+1<v2.size();i+=2) {
		v3.pb({v2[i],v2[i+1],v2[i]-v2[i+1]});
	}
	if(v2.size()&1) {
		v3.pb({v2.back(),0,v2.back()});
	}sort(v3.begin(),v3.end());
	for(auto &x:v3) {
		if(sum<0) sum+=x.d,res[id[x.x]]=1;
		else sum-=x.d,res[id[x.y]]=1;
	}
	if(sum==0) {
		cout<<"NP-Hard solved"<<endl;
		for(int i=1;i<=n;i++) cout<<res[i]<<' ';
	}
	else {
		cout<<"Chaotic evil";
	}
}

鸽子

sb数据结构题

类比 z k w zkw zkw线段树,可以把 l → r l\to r lr的路径提出来。

然后大力重链剖分。具体是每条重链维护两棵线段树,分别维护与这条链相邻的左子树和右子树。(若一个点的左子树不在链上则这个点维护左子树,否则这个点维护右子树)

跳轻链的过程是单点修改+单点查询,直接用数组维护即可。

注意到我维护的是两个不同的方向,所以把两个部分的答案加起来即可。

复杂度 O ( n log ⁡ 2 n ) O(n\log^2 n) O(nlog2n)

代码:

#include<bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define pb push_back
using namespace std;
int n,m,rt,num,rk[400005];
int ls[400005],rs[400005];
int dfn[400005],siz[400005],son[400005],num2;
int vs[400005],tp[400005],dep[400005],fa[400005];
ll s[1600020];
struct sgt{
	ll t[1600020],tag[1600020],siz[1600020];
	void add(int p,ll x) {
		t[p]+=siz[p]*x,tag[p]+=x;
	}
	void pushdown(int p) {
		if(tag[p]) add(p<<1,tag[p]),add(p<<1|1,tag[p]),tag[p]=0;
	}
	void ins(int p,int l,int r,int x,int y) {
		siz[p]+=y;if(l==r) return;
		int mid=l+r>>1;x<=mid?ins(p<<1,l,mid,x,y):ins(p<<1|1,mid+1,r,x,y); 
	}
	void upd(int p,int l,int r,int ql,int qr,ll x) {
		if(ql>qr) return;
		if(ql<=l&&r<=qr) {
			add(p,x);
			return;
		}int mid=l+r>>1;pushdown(p);
		if(ql<=mid) upd(p<<1,l,mid,ql,qr,x);
		if(mid<qr) upd(p<<1|1,mid+1,r,ql,qr,x);
		t[p]=t[p<<1]+t[p<<1|1];
	}
	ll qry(int p,int l,int r,int ql,int qr) {
		if(ql>qr) return 0;
		if(ql<=l&&r<=qr) return t[p];
		int mid=l+r>>1;pushdown(p);
		if(qr<=mid) return qry(p<<1,l,mid,ql,qr);
		if(mid<ql) return qry(p<<1|1,mid+1,r,ql,qr);
		return qry(p<<1,l,mid,ql,qr)+qry(p<<1|1,mid+1,r,ql,qr); 
	}
}T[2];
void upd(int x,ll d) {
    s[x]+=d*siz[son[x]];
}
void dfs(int u,int topf) {
	fa[u]=topf,dep[u]=dep[topf]+1;
	if(!ls[u]) {
		siz[u]=1,rk[++num]=u;
		return;
	}dfs(ls[u],u),dfs(rs[u],u);siz[u]+=siz[ls[u]]+siz[rs[u]];
	son[u]=(siz[ls[u]]>siz[rs[u]])?ls[u]:rs[u];
}
void dfs2(int u,int topf) {
	dfn[u]=++num2,tp[u]=topf;
	if(!ls[u]) return;
	if(ls[u]==son[u]) dfs2(ls[u],topf),dfs2(rs[u],rs[u]),T[1].ins(1,1,n,dfn[u],siz[rs[u]]);
	else dfs2(rs[u],topf),dfs2(ls[u],ls[u]),T[0].ins(1,1,n,dfn[u],siz[ls[u]]);
}
void modify(int x,int y,ll d) {
	int fx=tp[x],fy=tp[y];
	while(fx!=fy) {
		if(dep[fx]>dep[fy]) {
			T[1].upd(1,1,n,dfn[fx],dfn[x]-1,d),x=fa[fx];
			if(tp[x]!=tp[y]&&rs[x]==son[x]) {
				upd(x,d);
			}
		}
		else {
			T[0].upd(1,1,n,dfn[fy],dfn[y]-1,d),y=fa[fy];
			if(tp[x]!=tp[y]&&ls[y]==son[y]) {
				upd(y,d);
			}
		}fx=tp[x],fy=tp[y];
	}
	if(dep[x]>dep[y]) {
		T[1].upd(1,1,n,dfn[y]+1,dfn[x]-1,d);
	}
	else {
		T[0].upd(1,1,n,dfn[x]+1,dfn[y]-1,d);
	}
}
ll qry(int x,int y) {
	int fx=tp[x],fy=tp[y];ll res=0;
	while(fx!=fy) {
		if(dep[fx]>dep[fy]) {
			res+=T[1].qry(1,1,n,dfn[fx],dfn[x]-1),x=fa[fx];
			if(tp[x]!=tp[y]&&rs[x]==son[x]) {
				res+=s[x];
			}
		}
		else {
			res+=T[0].qry(1,1,n,dfn[fy],dfn[y]-1),y=fa[fy];
			if(tp[x]!=tp[y]&&ls[y]==son[y]) {
				res+=s[y];
			}
		}fx=tp[x],fy=tp[y];
	}
	if(dep[x]>dep[y]) {
		res+=T[1].qry(1,1,n,dfn[y]+ 1,dfn[x]-1);
	}
	else {
		res+=T[0].qry(1,1,n,dfn[x]+1,dfn[y]-1);
	}
	return res;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;memset(vs,-1,sizeof vs);
	for(int i=1;i<n;i++) {
		cin>>ls[n+i]>>rs[n+i];
		vs[ls[n+i]]=0,vs[rs[n+i]]=1;
	}for(int i=n+1;i<2*n;i++) {
		if(vs[i]==-1) rt=i;
	}n=2*n-1;int x=++n,y=++n,z=++n,w=++n;ls[x]=rt,rs[x]=y,ls[z]=w,rs[z]=x;dfs(z,0),dfs2(z,z);
	for(int i=1;i<=m;i++) {
		int op,l,r,d;
		cin>>op>>l>>r;
		if(op==1) {
			cin>>d;
			modify(rk[l],rk[r+2],d);
		}
		else {
			cout<<qry(rk[l],rk[r+2])<<endl;
	    }
	}
}

相关文章:

  • node.js 使用教程-3.gulp-file-include 详细教程
  • 【可视化大屏教程】用Python开发智慧城市数据分析大屏
  • 【云原生 | 从零开始学Kubernetes】二十三、Kubernetes控制器Statefulset
  • git三板斧--Linux
  • 内存分配.
  • 谷粒商城超详细笔记+踩坑(2)——分布式组件、前端基础(回顾知识点)
  • 为 TiDB 客户端服务端间通信开启加密传输
  • C语言函数解决问题:1.求二进制中不同位的个数;2.交换二进制的奇数位和偶数位;3.使用指针打印数组内容
  • PyQT5入门案例(一)工资统计系统
  • Life:歌曲学习之教一个不会唱歌的人学会唱出《情非得已》、《海阔天空》、《红日》、《老男孩》等歌曲
  • 24.STM32的IO口扩展PCF8574
  • 论文阅读_知识蒸馏_TinyBERT
  • 测试4年,4门语言在手,我拿到了年包50W+的offer
  • Xorm 使用手册,增删改查之查
  • 怎样调试微信小程序
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • C++入门教程(10):for 语句
  • ES6 学习笔记(一)let,const和解构赋值
  • java取消线程实例
  • js对象的深浅拷贝
  • Mocha测试初探
  • nginx 配置多 域名 + 多 https
  • Vue2.x学习三:事件处理生命周期钩子
  • 测试如何在敏捷团队中工作?
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 力扣(LeetCode)21
  • 深入 Nginx 之配置篇
  • 携程小程序初体验
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • #includecmath
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1)Android开发优化---------UI优化
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (剑指Offer)面试题34:丑数
  • (九)c52学习之旅-定时器
  • (转)项目管理杂谈-我所期望的新人
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .equals()到底是什么意思?
  • .net 7 上传文件踩坑
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net 发送邮件
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • /etc/sudoers (root权限管理)