BZOJ3236:[AHOI2013]作业——题解

2023-10-24 07:59

本文主要是介绍BZOJ3236:[AHOI2013]作业——题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://www.lydsy.com/JudgeOnline/problem.php?id=3236 

第一种做法:

建两棵主席树分别处理两个问题。

第一个问题水,第二个问题参考SPOJ3267/DQUERY:D-query

但是代码量巨大,显然不能写。

第二种做法:

参考:https://blog.csdn.net/clover_hxy/article/details/56288794

对询问离线莫队,然后莫队里面套值域分块。

……值域分块还是很好写的就不讲了。

可以看出代码量巨短。

(emmm果然数据结构学傻了想的第一种做法敲了十分钟果断弃了查题解。)

(莫队还是太菜了要多练。)

#include<stack>
#include<queue>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e5+5;
const int M=1e6+5;
inline int read(){int x=0,w=1;char ch=0;while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*w;
}
struct data{int pos,l,r,a,b;
}q[M];
int a[N],cnt[N],ans[M][2],v[N],num[N],s,n,m;
inline int bel(int x){return (x-1)/s+1;}
inline bool cmp(data a,data b){return bel(a.l)==bel(b.l)?a.r<b.r:a.l<b.l;
}
inline void add(int k){if(!cnt[k])v[bel(k)]++;cnt[k]++;num[bel(k)]++;
}
inline void del(int k){cnt[k]--;num[bel(k)]--;if(!cnt[k])v[bel(k)]--;
}
void query(int pos,int l,int r){if(bel(l)==bel(r)){for(int i=l;i<=r;i++){if(cnt[i])ans[pos][1]++,ans[pos][0]+=cnt[i];}return;}for(int i=l;i<=bel(l)*s;i++)if(cnt[i])ans[pos][1]++,ans[pos][0]+=cnt[i];for(int i=(bel(r)-1)*s+1;i<=r;i++)if(cnt[i])ans[pos][1]++,ans[pos][0]+=cnt[i];for(int i=bel(l)+1;i<=bel(r)-1;i++)ans[pos][1]+=v[i],ans[pos][0]+=num[i];
}
int main(){n=read(),m=read();s=sqrt(n);for(int i=1;i<=n;i++)a[i]=read();for(int i=1;i<=m;i++){q[i].pos=i,q[i].l=read(),q[i].r=read();q[i].a=read(),q[i].b=read();}sort(q+1,q+m+1,cmp);int ql=1,qr=0;for(int i=1;i<=m;i++){while(ql<q[i].l)del(a[ql++]);while(ql>q[i].l)add(a[--ql]);while(qr<q[i].r)add(a[++qr]);while(qr>q[i].r)del(a[qr--]);query(q[i].pos,q[i].a,q[i].b);}for(int i=1;i<=m;i++){printf("%d %d\n",ans[i][0],ans[i][1]);}return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8707641.html

这篇关于BZOJ3236:[AHOI2013]作业——题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/273811

相关文章

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

P2858 [USACO06FEB] Treats for the Cows G/S 题解

P2858 题意 给一个数组。每天把最左或者最右的东西卖掉,第 i i i个东西,第 d a y day day天卖出的价格是 a [ i ] ∗ d a y a[i]*day a[i]∗day。 记忆化搜索 void dfs(int l,int r,int day,ll sum){if(v[l][r]>=sum)return;v[l][r]=sum;if(l>r)//这就是dp答案{

Java高级Day38-网络编程作业

112.网络编程作业 //1.使用字符流的方式,编写一个客户端程序和服务器端程序//2.客户端发送"name",服务器端接收到后,返回"我是nova"//3.客户端发送"hobby",服务器端接收到后,返回"编写java程序"//4.不是这两个问题,回复"你说啥呢"​​===============//客户端//===============public class SocketT

【C++题解】1272. 郭远摘苹果

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》 问题:1272. 郭远摘苹果 类型:二维数组 题目描述: 郭远有一天走到了一片苹果林,里面每颗树上都结有不同数目的苹果,郭远身上只能拿同一棵树上的苹果,他每到一棵果树前都会把自己身上的苹果扔掉并摘下他所在树上的苹果并带走(假设郭远会走过每一棵苹果树),问在郭远摘苹果的整个过程中,他身上携带的最多苹果数与最小苹果数的差是多少?