re求助
  • 板块CF1146E Hot is Cold
  • 楼主Svemit
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/12/28 12:14
  • 上次更新2023/10/24 06:20:44
查看原帖
re求助
503792
Svemit楼主2022/12/28 12:14

思路把所有数加上1e5+1,线段树维护每个数×-1的次数

#include<bits/stdc++.h>
#define PII pair<int,int>
#define PLL pair<long long,long long>
#define mkp() make_pair()
#define pbk() push_back()
#define umap unordered_map
#define uset unordered_set
#define ls (x<<1)
#define rs (x<<1|1)
#define lson l,mid,x<<1
#define rson mid+1,r,x<<1|1
#define lowbit(x) x&(-x)
#define debug() cout<<"$\n"
typedef long long ll;
const int N=2e5+5,INF=0x3f3f3f3f;
using namespace std;
int read()
{
    int f=1,x=0;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
    return f*x;
}
void write(int x)
{
  if(x<0)
  putchar('-'),x=-x;
  if(x>9) write(x/10);
  putchar(x%10+'0');
}
void print(int x)
{
	write(x);
	putchar('\n');
}
int n,m;
int a[N];
struct segment_tree
{
	int l,r,val,laz_tag;
}t[N<<2];

void push_up(int x)
{
	t[x].val=t[ls].val+t[rs].val;
}

void push_down(int x)
{
	if(!t[x].laz_tag) return;
	
	t[ls].val+=(t[ls].r-t[ls].l+1)*t[x].laz_tag;
	t[rs].val+=(t[rs].r-t[rs].l+1)*t[x].laz_tag;
	
	t[ls].laz_tag+=t[x].laz_tag;
	t[rs].laz_tag+=t[x].laz_tag;
	
	t[x].laz_tag=0;
}

void build(int l,int r,int x)
{
	t[x].l=l;
	t[x].r=r;
	if(l==r)
	{
		t[x].val=0;
		return;
	}
	int mid=l+r>>1;
	build(lson);
	build(rson);
	push_up(x);
}

void update(int nl,int nr,int k,int l,int r,int x)
{
	if(nl<=l&&r<=nr)
	{
		t[x].laz_tag+=k;
		t[x].val+=(r-l+1)*k;
		return;
	}
	push_down(x);
	int mid=l+r>>1;
	if(nl<=mid) update(nl,nr,k,lson);
	if(nr>mid) update(nl,nr,k,rson);
	push_up(x);
}

int query(int nl,int nr,int l,int r,int x)
{
	if(nl<=l&&r<=nr)
	{
		return t[x].val;
	}
	push_down(x);
	int mid=l+r>>1,res=0;
	if(nl<=mid) res+=query(nl,nr,lson);
	if(nr>mid) res+=query(nl,nr,rson);
	return res;
}
int main()
{
    n=read(),m=read();
    build(1,200001,1);
    for(int i=1;i<=n;i++)
	  a[i]=read();
	while(m--)
	{
		char op;
		cin>>op;
		int x=read();
		x=x+100001;
		if(op=='<')
		  update(1,x-1,1,1,n,1);
		else
		  update(x+1,200000+1,1,1,n,1);
	} 
	for(int i=1;i<=n;i++)
	{
		int k=query(a[i]+100001,a[i]+100001,1,n,1);
		if(k%2)
		  print(-1*a[i]);
		else
		  print(a[i]);
	}
	return 0;
}



2022/12/28 12:14
加载中...