首页 > 其他分享 >P5070 [Ynoi2015] 即便看不到未来

P5070 [Ynoi2015] 即便看不到未来

时间:2023-11-01 10:46:26浏览次数:35  
标签:int P5070 Ynoi2015 tp write vis 看不到 array include

题意

给定一个序列,静态区间查询区间的长度为 \(1 \to 10\) 的极长值域连续段个数。

Sol

考虑离线下来跑扫描线。枚举右端点,维护每个左端点的答案。

不难想到,\(i\) 对 \(lst[i]\) 是没有贡献的,考虑右端点为 \(i - 1\),若此时的 \(l \le lst[i]\)。\(i\) 不作贡献。

所以我们把值域上 \([s[i] - 10, s[i] + 10]\) 这 \(20\) 个点单独挑出来,从右到左排序依次计算。

考虑当前 \(i\) 对于 \(l\) 的贡献。

  • \(i\) 为某个连续值域段的左端点

  • \(i\) 为某个连续值域段的右端点

  • \(i\) 连接两个连续值域段

我们需要一个区间修改,单点查询的数据结构。这边考虑使用树状数组。

设当前枚举到的 \(l\),不难发现贡献区间即为,\(idx[l + 1] \to idx[l]\)。

对于三种情况分别分类讨论即可。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <vector>
#include <bitset>
#define pii pair <int, int>
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}

#define fi first
#define se second

const int N = 1e6 + 25;
array <int, N> s;

struct BIT {

/* int edge[N]; */
array <int, N> edge;
int lowbit(int x) {
	return x & -x;
}
void modify(int x, int y) {
	while (x) {
		edge[x] += y;
		x -= lowbit(x);
	}
	return;
}
int query(int x, int n) {
	int ans = 0;
	while (x <= n) {
		ans += edge[x];
		x += lowbit(x);
	}
	return ans;
}
BIT() : edge() {}

} T[11];

/* const auto func = [](pii a, pii b) { */
	/* return a.se < b.se; */
/* }; */

/* array <pii, N> prl; */
array <vector <pii>, N> idx;
array <int, N> lst;
bitset <N> vis;

array <array <int, 10>, N> ans;
int main() {
	int n = read(), m = read();
	for (int i = 1; i <= n; i++)
		s[i] = read();
	for (int i = 1; i <= m; i++) {
		int l = read(), r = read();
		idx[r].push_back(make_pair(l, i));
		/* prl[i].fi = l, prl[i].se = r; */
	}
	/* sort(prl.begin() + 1, prl.begin() + 1 + n, func); */
	for (int i = 1; i <= n; i++) {
		vector <int> tp;
		for (int j = max(1, s[i] - 11); j <= s[i] + 11; j++) {
			if (!lst[j] || lst[j] <= lst[s[i]]) continue;
			tp.push_back(lst[j]);
		}
		tp.push_back(i);
		tp.push_back(lst[s[i]]);
		sort(tp.begin(), tp.end(), greater <int>());
		/* if (i == 2) { */
			/* for (auto x : tp) */
				/* write(x), putchar(32); */
			/* puts("$$"); */
		/* } */
		vis[s[i]] = 1;
		/* vis[lst[s[i]]] = 1; */
		int Lp = s[i], Rp = s[i];
		/* puts("["); */
		for (int j = 0; j < (int)tp.size() - 1; j++) {
			vis[s[tp[j]]] = 1;
			/* if (i == 2) */
				/* write(s[tp[j]]), puts(""); */
			/* write(j), puts(""); */
			while (vis[Lp - 1]) Lp--;
			while (vis[Rp + 1]) Rp++;
			/* if (i == 2) */
			/* write(s[i] - Lp), putchar(32); */
			/* write(Rp - s[i]), puts(""); */
			if (1 <= s[i] - Lp && s[i] - Lp <= 10)
				T[s[i] - Lp].modify(tp[j], -1), T[s[i] - Lp].modify(tp[j + 1], 1);
			if (1 <= Rp - s[i] && Rp - s[i] <= 10)
				T[Rp - s[i]].modify(tp[j], -1), T[Rp - s[i]].modify(tp[j + 1], 1);
			if (1 <= Rp - Lp + 1 && Rp - Lp + 1 <= 10)
				T[Rp - Lp + 1].modify(tp[j], 1), T[Rp - Lp + 1].modify(tp[j + 1], -1);
		}
		/* puts("]"); */

		/* idx[prl[i].se].push_back() */
		for (int j = max(1, s[i] - 11); j <= s[i] + 11; j++)
			vis[j] = 0;
		for (auto j : idx[i])
			for (int k = 1; k <= 10; k++)
				ans[j.se][k] = T[k].query(j.fi, n);
		lst[s[i]] = i;
	}
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= 10; j++)
			write(ans[i][j] % 10);
		puts("");
	}
	return 0;
}

标签:int,P5070,Ynoi2015,tp,write,vis,看不到,array,include
From: https://www.cnblogs.com/cxqghzj/p/17802484.html

相关文章

  • Ynoi2015 我回来了
    介绍个最劣解\(O(m\sqrtn+n\sqrtn+n\alpha(n)\lnn)\)做法。首先令\(b_i\getsa_i-1\),区间\([l,r]\)的答案就是:\[r-l+1+\sum\limits_{k=l}^r\text{mex}_{i=l}^r\left\lfloor\frac{b_i}{k}\right\rfloor\]考虑如何动态维护后面那个式子。我们对每一个\(k\in[1,n]\)维......
  • 不启用宏看不到数据(Excel代码集团)
    假设工作簿中有两个工作表,数据和首页ThisWorkbook中添加事件代码:PrivateSubWorkbook_BeforeClose(CancelAsBoolean)Sheets("首页").SelectSheets("数据").Visible=2ActiveWorkbook.SaveEndSub显示数据工作表的代码(放置于模块中):SubShow()Sheets("数据")......
  • windows服务启动应用程序无法看不到界面
    一、无法看到桌面的根本原因以Windows服务启动的软件通常没有用户交互界面或图标显示的根本原因,是因为服务在后台运行,与用户界面分离。在Windows操作系统中,桌面应用程序和服务在不同的会话中。每个用户登录到计算机时,系统都会为他们创建一个会话,以便他们可以与系统进行交互。......
  • 在下方任务栏处可以看到软件启动但是在笔记本屏幕上看不到软件界面
    问题:在公司笔记本连接了显示器,到家后打开代码编辑器,在任务栏显示打开了,但总是看不到界面。解决方法:用鼠标在任务栏选中打不开的软件,ALT+空格,弹出的窗口选择:最大化,即可看到正常的软件界面。 ......
  • tls1.3 可以看到client hello所有内容,还有一半的server hello,是看不到证书issuer、sub
    https://www.cloudshark.org/captures/64d433b1585a 看到tls1.3clienthello内容:SecureSocketsLayerTLSv1.3RecordLayer:HandshakeProtocol:ClientHelloContentType:Handshake(22)Version:TLS1.0(0x0301)Length:234HandshakeProtocol:ClientHelloHandshak......
  • android view上配置id, 运行后看不到
    AndroidView上配置ID,运行后看不到作为一名经验丰富的开发者,你需要教导一位刚入行的小白如何实现在AndroidView上配置ID,但在运行后看不到这些ID。下面是具体的步骤和代码示例。步骤以下是实现此功能的步骤:步骤描述1创建一个新的Android项目2在布局文件中添加一......
  • 看不到未来的世界里的爱之歌——ATRI
    “他说自己必须拯救地球——”“于是我问道。”“地球也包括我吗……?”“我守望着逐渐沉没的地球,身处无限的孤独之中……”“时间流逝吧,你是多么的残酷——提示:本篇涉及剧透且都是本人主观感受第一篇gal评测,写的时候思路也比较混乱,文笔欠佳,若有不妥之处也请不吝赐正提......
  • Teamcenter用本地胖客户端启动时,可以看到定制包的插件菜单项,但是用DEBUG启动时,看不到
    1、用本地胖客户端启动时,可以看到定制包的插件菜单项,但是用DEBUG启动时,看不到?原因:是因为DEBUG模式下,是采用JAVA1.8来运行的。但是本机的胖客户端是采用JAVA11来运行的解决办法:换成JAVA11就可以了 ......
  • 一例vmware 虚拟机造成局域网游戏魔兽争霸看不到对方
     问题:windows8/win8不能连局域网玩魔兽争霸,cs等局域网游戏,确认是连的同一台路由器,防火墙已关。 我经过检查后发现,主机使用vmware虚拟机软件,vmware虚拟机会产生VMware......
  • CAD等分点看不到怎么办?试试这招,轻松解决!
    等分即等量划分,在生活中的运用十分广泛。因此,浩辰CAD软件中提供了两种等分命令,即定距等分(MEASURE)、定数等分(DIVIDE)。有些设计师小伙伴调用CAD等分命令对图纸中的图形进行等......