首页 > 其他分享 >P5200 [USACO19JAN]Sleepy Cow Sorting G 题解

P5200 [USACO19JAN]Sleepy Cow Sorting G 题解

时间:2023-03-14 19:35:50浏览次数:48  
标签:P5200 Sorting val int 题解 tr long define

前言:教练要求写的,于是过来补发题解。

题目传送门

分析

容易发现后缀如果是上升的那么就不用动,让前面的通过移动插进来就可以了,第一个答案就是 \(n\) 减去最长上升后缀的长度。
那应该怎么输出答案呢?
处理出最长的后缀后,考虑前 \(k\) 个数字。这个数字应该先移动到第 \(k + 1\) 位来,在根据大小关系插入后面的序列中,容易发现是 \(k - i\) 加上目前加进去的数中比他小的个数,再把这个数插入这个位置。
插入,查询比这个数小的个数,怎么弄呢?
平衡树万岁!!!看到数据范围只到\(10^5\),写一颗值域线段树(写完发现好像树状数组简单的多)就行了。

ACcode

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long long ull;
const int N = 1e5 + 5, INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;

int n;
int a[N];
vector<int> v;
struct segment_tree
{
	int l, r, val;
	#define l(x) tr[x].l
	#define r(x) tr[x].r
	#define val(x) tr[x].val
}tr[N << 2];
void pushup(int x)
{
	val(x) = val(x << 1) + val(x << 1 | 1);
}
void build(int l, int r, int x)
{
	l(x) = l, r(x) = r;
	if(l == r)
	{
		val(x) = 0;
		return;
	}
	int mid = l + r >> 1;
	build(l, mid, x << 1);
	build(mid + 1, r, x << 1 | 1);
	pushup(x);
}
void update(int x, int id, int v)
{
	if(l(x) == id && r(x) == id)
	{
		val(x) += v;
		return;
	}
	int mid = l(x) + r(x) >> 1;
	if(id <= mid) update(x << 1, id, v);
	else update(x << 1 | 1, id, v);
	pushup(x);
}

int query(int l, int r, int x)
{
	if(l <= l(x) && r(x) <= r) return val(x);
	int mid = l(x) + r(x) >> 1, res = 0;
	if(l <= mid) res += query(l, r, x << 1);
	if(r > mid) res += query(l, r, x << 1 | 1);
	return res;
}

int main()              //主函数
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n;
	for(int i = 1;i <= n; i++) cin >> a[i];
	build(1, n, 1);
	int k = n;
	while(a[k - 1] < a[k]) k --; 
	k --;
	for(int i = k + 1;i <= n;i ++) update(1, a[i], 1);
	for(int i = 1;i <= k;i ++)
	{
		v.push_back(k - i + query(1, a[i], 1));
		update(1, a[i], 1);
	}
	cout << k << '\n';
	for(int i = 0;i < k;i ++) cout << v[i] << ' ';
    return 0;
}

标签:P5200,Sorting,val,int,题解,tr,long,define
From: https://www.cnblogs.com/Svemit/p/17216009.html

相关文章

  • CF1788D Moving Dots 题解
    可能更好的阅读体验题目传送门题目翻译题目解析考虑怎样才能产生贡献,显然对于留下的相邻的\(l,r\),需要让\(l\)向右,\(r\)向左即可产生\(1\)的贡献。接下来就是考......
  • [整理]NOIP2021 题解
    T1秒了,直接写一个线性筛一样的东西即可。constintN=10000010;intT,x;boolok[N];intnxt[N];ilvoidInit(){for(inti=1;i<N;i++){if(ok[i])continue;......
  • 【题解】P6071 『MdOI R1』Treequery
    题目描述给定一棵\(n\)个点的无根树,边有边权。令\(E(x,y)\)表示树上\(x,y\)之间的简单路径上的所有边的集合,特别地,当\(x=y\)时,\(E(x,y)=\varnothing\)。你需......
  • docker安装笔记及常见问题解决
    1.yum安装gcc相关环境yum-yinstallgccyum-yinstallgcc-c++2.卸载旧版本(非必要)yumremovedocker\docker-client\docker-client-latest\doc......
  • 由于找不到 visa32.dll问题解决办法
    由于找不到visa32.dll,无法继续执行代码。重新安装程序可能会解决此问题。 金山官网下载https://www.ijinshan.com/filerepair/visa32.dll.shtml由于找不到NiViSv32.d......
  • 【题解】[HEOI2013]Segment(李超树)
    [HEOI2013]Segment题目分析:是李超线段树的板子题,在这里就稍微提一嘴李超线段树吧。其实李超线段树就是用来解决插入线段,查询\(x=k\)时纵坐标的最大值的。对于李超线......
  • P7728 旧神归来 题解
    日常生活:写多项式——写多项式题解——颓——写多项式——写多项式题解——颓——……最近真的降智。大水题切不动。#查询gtm1514精神状态题解好像挺清新的。首先我......
  • [转]mysql问题解决SELECT list is not in GROUP BY clause and contains nonaggregate
    原文地址:mysql问题解决SELECTlistisnotinGROUPBYclauseandcontainsnonaggregatedcolumn-慕尘-博客园(cnblogs.com)今天在Ubuntu下的部署项目,发现一些好......
  • 【Pytorch】RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED 问题解决
    问题起因:在运行论文代码时出现了RuntimeError:cuDNNerror:CUDNN_STATUS_NOT_INITIALIZED报错。 解决方法:如果不是cuda、cudnn配置的问题,那有可能是电脑的线......
  • 【磁盘空间不足问题解决】Docker 日志清理、
    问题描述:1、系统无法访问,提示“无法访问此网站”2、启动Docker镜像提示错误信息,如下:“Errorresponsefromdaemon:Cannotrestartcontainer7f812bfba45f:write/v......