首页 > 其他分享 >活动 做题记录

活动 做题记录

时间:2022-10-02 20:44:17浏览次数:48  
标签:p2 p1 记录 int MAX 活动 buf id

小清新数据结构题

题意

是个人能看懂

思路

考虑维护一颗权值线段树。在这颗线段树上,我们把满足度越高的排在越前面,即编号越小。

这可以通过对于原数组排序实现。

接着,我们对于每一次询问,在线段树上二分即可。

对于没一次修改,把它拆成两次操作。接着把它们按照时间排序即可。直接对对应点进行单点修改即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
static char buf[1000000],*p1=buf,*p2=buf;
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
inline int read(){int x=0,f=1;char c=getchar();while(c<'0' || c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+c-48;c=getchar();}return x*f;}
inline void write(int x){static char buf[20];static int len=-1;if(x<0)putchar('-'),x=-x;do buf[++len]=x%10,x/=10;while(x);while(len>=0)putchar(buf[len--]+48);}

const int MAX = 4*500005;

struct node{
	int val, id;
	bool operator <	(const node & a) const{
		if(val != a.val)	return val > a.val;
		return id < a.id;
	} 
};

node a[MAX];

int s[MAX], sum[MAX];

void pushup(int x){
	s[x] = s[x<<1] ^ s[x<<1|1];
	sum[x] = sum[x<<1] + sum[x<<1|1];
}

void add(int l, int r, int pos, int pls, int x, int fuck){
	if(l == r){
		s[x] = pls * fuck;
		sum[x] = fuck;
		return ;
	}
	int mid = (l+r)>>1;
	if(pos <= mid)	add(l, mid, pos, pls, x<<1, fuck);
	else add(mid+1, r, pos, pls, x<<1|1, fuck);
	pushup(x);
}

int query(int l, int r, int pos, int x){
	if(l == r)	return s[x];	
	int mid = (l+r)>>1;	
	if(pos <= sum[x<<1])	return query(l, mid, pos, x<<1);
	else return s[x<<1] ^ query(mid+1, r, pos - sum[x<<1], x<<1|1);
}

struct event{
	int x, fl;
	int id;
	bool operator < (const event &a) const {
		if(a.x != x)	return x < a.x;
		return id < a.id;
	}
};
event p[4*MAX];
signed main(){
	int m = read(), n = read();
	for(int i = 1; i <= n; i++)	a[i].val = read(), a[i].id = i;
	sort(a+1, a+n+1);
	int cnt = 0;
	for(int i = 1; i <= n; i++){
		p[++cnt].x = read(), p[cnt].fl = 1;
		p[++cnt].x = read()+1, p[cnt].fl = 0;
	}
	for(int i = 1; i <= n; i++){
		p[a[i].id*2-1].id = i;
		p[a[i].id*2].id = i;
	}
	sort(p+1, p+cnt+1);
	int now = 1;
	for(int i = 1; i <= m; i++){
		while(p[now].x == i){
			add(1, n, p[now].id, a[p[now].id].id, 1, p[now].fl);
			now++;
		}
		int k = read();
		write(query(1, n, k, 1));
		puts("");
	}
	return 0;
}

标签:p2,p1,记录,int,MAX,活动,buf,id
From: https://www.cnblogs.com/WRuperD/p/16749412.html

相关文章

  • 中缀表达式转后缀、前缀记录
    波兰表示法与逆波兰表示法它们都是对表达式的记法,因此也被称为前缀记法、后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操......
  • 记录一次vue模块安装路由失败
      仔细思考了一下应该是版本不匹配,我的vue版本是2.9.6但是我的router版本是  命令:cnpminstallvue-router@+版本号--save-dev实例:cnpminstallvue-router@......
  • [挑战记录]AKIOI
    \(20220607~\mathcal{AK}\times7\)\(20220929~\mathcal{AK}\times13\)\(20221002~\mathcal{AK}\times20\)......
  • [挑战记录]儒略历
    两年前就差点切掉,现在终于切了没什么好说的,就是用计算器进行手算年份#include<cstdio>#include<cstring>#include<string>#defineWRWinterRain#defineintlonglo......
  • 学习记录13标准的JavaBean类
    标准的JavaBean类类名需要见名知意成员变量使用private修饰提供至少两个构造方法无参构造方法带全部参数的构造方法成员方法提供每一个成员变量对应的setXxx()......
  • AutoDL安装记录
    (可以不配置自己的基础环境即只使用安装pytorch版本的一个步骤,但是PyTorch中torch、torchvision、torchaudio、CUDA 版本的关系必须对应,否则gpu不运行。) 点击终端输......
  • 【博学谷学习记录】超强总结,用心分享|Java基础分享-Redis基础简介
    1.1Redis简介1.2Redis资料1.2.1初步教程1.2.2其他教程2.1做为数据库与之比较2.2做为高速缓存与之比较2.3做为消息队列与之比较一、Redis基础知识1.1Redis......
  • 【博学谷学习记录】超强总结,用心分享|Linux修改文件权限方法总结
    一、介绍linux中“一切皆文件”。每个文件都设定了针对不同用户的访问权限。文件权限主要针对以下三种对象:属主:拥有者属组:所属的组其他人:不属于上述两类二、文件权限......
  • 命但如通知,但客户终每条记录能件,转换成
    命但如通知,但客户终每条记录能件,转换成F潞}命但如通知,但客户终每条记录能件,转换成m命但如通知,但客户终每条记录能件,转换成http://ds.163.com/article/63371fb8880c710001935......
  • ROS-MoveIt学习记录
    教程古月居:7ROS理论与实践_.Moveit!机械臂控制_视频_哔哩哔哩_bilibili对应源码:Whiffe/arm-of-robot-using-Moveit-in-ros-gazebo-rviz(github.com)问题ImportErr......