首页 > 其他分享 >P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III

P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III

时间:2024-10-20 12:31:38浏览次数:7  
标签:Ynoi2019 return P5048 int LL ans include III define

Sol

蒲公英题意基本相同,但是注意到空间限制 62.5MB,显然不能用蒲公英的做法。

考虑先把整块的答案算出来,然后把小块的部分补上去,显然大块可以预处理,小块可以直接暴力查询是否越界。

代码很简单。

Code

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <bitset>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <cassert>
#include <chrono>
#include <random>
#define x first
#define y second
#define pb push_back
#define eb emplace_back
#define pf push_front
#define desktop "C:\\Users\\MPC\\Desktop\\"
#define IOS ios :: sync_with_stdio (false),cin.tie (0),cout.tie (0)
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair <int,int> PII;
const int dx[] = {1,0,-1,0},dy[] = {0,-1,0,1};
template <typename T1,typename T2> bool tomax (T1 &x,T2 y) {
    if (y > x) return x = y,true;
    return false;
}
template <typename T1,typename T2> bool tomin (T1 &x,T2 y) {
    if (y < x) return x = y,true;
    return false;
}
LL power (LL a,LL b,LL p) {
    LL ans = 1;
    while (b) {
        if (b & 1) ans = ans * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return ans;
}
int fastio = (IOS,0);
#define endl '\n'
#define puts(s) cout << s << endl
const int N = 500010,M = 1010;
int n,m;
int L[M],R[M],pos[N];
int a[N];
vector <int> v[N];
int posv[N];
int res[M][M];
int cnt[N];
int main () {
	cin >> n >> m;
	int len = sqrt (n);
	for (int i = 1;i <= len;i++) L[i] = (i - 1) * len + 1,R[i] = i * len;
	R[len] = n;
	for (int i = 1;i <= len;i++) {
		for (int j = L[i];j <= R[i];j++) pos[j] = i;
	}
	for (int i = 1;i <= n;i++) cin >> a[i],v[a[i]].pb (i),posv[i] = v[a[i]].size () - 1;
	for (int i = 1;i <= len;i++) {
		for (int j = 1;j < N;j++) cnt[j] = 0;
		for (int j = i;j <= len;j++) {
			res[i][j] = res[i][j - 1];
			for (int k = L[j];k <= R[j];k++) tomax (res[i][j],++cnt[a[k]]);
		}
	}
	for (int i = 1;i < N;i++) cnt[i] = 0;
	int lastans = 0;
	while (m--) {
		int l,r;
		cin >> l >> r;
		l ^= lastans,r ^= lastans;
		int p = pos[l],q = pos[r];
		if (p == q) {
			int ans = 0;
			for (int i = l;i <= r;i++) tomax (ans,++cnt[a[i]]);
			for (int i = l;i <= r;i++) cnt[a[i]] = 0;
			cout << (lastans = ans) << endl;
			continue;
		}
		int ans = res[p + 1][q - 1];
		for (int i = l;i <= R[p];i++) {
			int t = posv[i];
			while (t + ans < v[a[i]].size () && v[a[i]][t + ans] <= r) ans++;
		}
		for (int i = L[q];i <= r;i++) {
			int t = posv[i];
			while (t - ans >= 0 && v[a[i]][t - ans] >= l) ans++;
		}
		cout << (lastans = ans) << endl;
	}
	return 0;
}

标签:Ynoi2019,return,P5048,int,LL,ans,include,III,define
From: https://www.cnblogs.com/incra/p/18487125

相关文章

  • 题解:[YNOI2019] 游戏
    ProblemLink[YNOI2019]游戏题外话第一眼,由乃?不打不打。第二眼,欸noi三个字母怎么是大写(才发现是云南省选)。题意题意简洁,不再赘述。Solution一眼看出概率dp,但如何似乎没思路?开始公式做题:设置状态+推转移式。\(Q1\):怎么设置状态?首先,思考一个问题:第\(k\)个人该怎么“......
  • 【做题记录】ds合集 Part III
    ds合集的Part3,此合集包含贪心问题。贪心问题CF30E题目链接考虑对一个\(a'\)找到其对于的\(a\),肯定是越前越优,那么拿\(S\)的反串做个kmp即可得到每个\(a\)的第一次出现位置。然后就是在区间中找最长的奇回文串,manacher预处理,然后二分半径\(len\),看看\([l+len-1,......
  • 代码随想录算法训练营 | 121.买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股
    121.买卖股票的最佳时机题目链接:121.买卖股票的最佳时机文档讲解︰代码随想录(programmercarl.com)视频讲解︰买卖股票的最佳时机日期:2024-10-14想法:经常有用0和1表示相反状态,dp[i][0]表示第i天持有股票时身上最多的钱,比如第一天股票5元,持有了,身上的钱就为dp[0][0]=-5,第二天股......
  • leecode 数据库: 534. 游戏玩法分析 III
    表:Activity+--------------+---------+|ColumnName|Type|+--------------+---------+|player_id|int||device_id|int||event_date|date||games_played|int|+--------------+---------+(player_id,event_date)是此表的......
  • 代码随想录算法训练营 | 198.打家劫舍,213.打家劫舍II,337.打家劫舍III
    198.打家劫舍题目链接:198.打家劫舍文档讲解︰代码随想录(programmercarl.com)视频讲解︰打家劫舍日期:2024-10-13想法:dp[i]到第i个房子时能偷的最多的钱;递推公式:是上上一栋房子的dp[i-2]加上这栋房子的钱nums[i]大还是上一家邻居偷的钱dp[i-1]的大;初始化因为有i-2;所以初始化......
  • LaTeX 教學系列 (III):基本設定
    LaTeX教學系列(II):第一份LaTeX文件裡面,我們提到了如何建立第一份文件,並且根據不同的文件類別使用章節標題。文章目錄TeX世界的巴別塔LaTeX的裝備:套件買裝備:安裝與使用套件說明書:CTANLaTeX百變怪:設定文字設定字體大小設定字體系列設定字型設定中文LaTeX的服裝:......
  • 题解:P9939 [USACO21OPEN] Acowdemia III B
    考虑贪心。遍历每只奶牛:如果它最多与一头奶牛相邻,那么什么都不会发生。如果它与两头以上的奶牛相邻,那么它与两侧的两头奶牛相邻。将答案递增\(1\)。否则,如果正好有两头相邻的奶牛,我们就把它们配对。也就是说,将这对奶牛插入一组。代码:#include<bits/stdc++.h>usingname......
  • Can you answer these queries III(单点修改线段树)
    因为洛谷出现UE在acwing提交,输入格式略有修改#include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefvector<string>VS;typedefvector<int>......
  • PARTIII-Oracle事务管理-事务
    10.事务10.1.事务简介10.1.1.示例事务:账户借记和贷记10.1.2.事务的结构10.1.3.语句级原子性10.1.4.系统变更号(SCNs)10.2.事务控制概述10.2.1.事务名称10.2.2.活跃事务10.2.3.保存点10.2.4.事务回滚10.2.5.事务提交10.3.自治事务10.4.分布式事务10.4.1.......
  • leetcode刷题day22|回溯算法Part01( 77. 组合 、216. 组合总和 III、17.电话号码的字母
    前言:回溯是递归的副产品,只要有递归就会有回溯,回溯函数也就是递归函数。回溯是暴力穷举解法,效率并不高。但一些问题只能使用回溯来解决。回溯法,一般可以解决如下几种问题:组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一......