P6774 [NOI2020] 时代的眼泪(分块)

前言

看到题目名:别骂了别骂了

一道很中规中矩的YNOI吧。
卡在整块对整块的贡献上了。
这也确实算是本题最不好做的部分了。

前置知识:Yuno loves sqrt technology I

解析

区间逆序对加强版?很难不想到两道 YLST。
然而多了两维限制,二离似乎没啥前途了。
考虑分块在线做法。

设询问区间为 [l,r][l,r][l,r],值域区间为 [bot,top][bot,top][bot,top]
还是老套路,把贡献分成散块内部、整块内部、散块对散块、整块对整块、散块对整块五部分,以及在同一块内的情况。

散块内部:.…这咋做啊这时难免会有上树状数组的冲动。但是稍加思考可以发现,每个块内的值只有 O(n)O(\sqrt n)O(n) 个,所以不妨直接预处理出每个数在块内的排名以及每个块内排名的前缀和,然后直接差分查一查就行了。
散块对散块:老套路,归并排序即可。
整块对整块:一个比较直观的思路是容斥一下,求出 [1,top][1,top][1,top] 的答案,再减去 [1,bot−1][1,bot-1][1,bot1] 的答案,再减掉 [1,bot−1][1,bot-1][1,bot1] 的数对 [bot,top][bot,top][bot,top] 产生的贡献。
最后减掉的贡献用前缀和搞一搞容易解决,那么如何求出整块之间值域形如 [1,x][1,x][1,x] 的答案呢?(我就卡在这里勒
答案形如 ∑b∑a<bans(a,b,1,x)\sum_{b}\sum_{a<b} ans(a,b,1,x)ba<bans(a,b,1,x),考虑转化为对所有 bbb 求出所有 ∑a<bans(a,b,1,x)\sum_{a<b} ans(a,b,1,x)a<bans(a,b,1,x) 然后求和。
那么这个的形式似乎就非常好搞了,就是枚举 bbb 块内所有处于 [1,x][1,x][1,x] 的元素再在前面查顺序对那么预处理一下就行了。
散块对整块:枚举散块元素,前缀和即可。

同一块内:使用和散块内部类似的方法前缀和即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("ok\n")inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
bool mem1;const int N=1e5+100;
const int inf=1e9+100;
const bool Flag=0;
const int mod=1e9+7;const int B=405;//number of block
const int S=405;//size of blockint n,m;
int pos[N],a[N],b[N],rk[N];
int st[B],ed[B],bel[N],w,len[B];
int sum[B][N],pre[N][S],val[B][S],pl[B][S];
int f[B][B][S],s[B][S][S];
int lb[B][N];
int u[S],v[S],n1,n2;
void init(){w=sqrt(n);for(int i=1;i<=n;i++) bel[i]=(i+w-1)/w;for(int k=1;k<=bel[n];k++){st[k]=(k-1)*w+1;ed[k]=min(n,k*w);len[k]=ed[k]-st[k]+1;sort(b+st[k],b+ed[k]+1);for(int i=st[k];i<=ed[k];i++){int suf=i==ed[k]?n+1:b[i+1];for(int j=b[i];j<suf;j++){lb[k][j]=i-st[k]+1;}}for(int i=st[k];i<=ed[k];i++) rk[pos[b[i]]]=i-st[k]+1;for(int i=1;i<=n;i++) sum[k][i]=sum[k-1][i];for(int i=st[k];i<=ed[k];i++){sum[k][a[i]]++;if(i!=st[k]){for(int j=1;j<=len[k];j++) pre[i][j]=pre[i-1][j];}pre[i][rk[i]]++;pl[k][rk[i]]=i;val[k][rk[i]]=a[i];}    }for(int i=1;i<=n;i++){for(int j=1;j<=len[bel[i]];j++) pre[i][j]+=pre[i][j-1];}for(int k=1;k<=bel[n];k++){for(int a=1;a<=len[k];a++){for(int b=a+1;b<=len[k];b++){int p=pl[k][b];s[k][a][b]=s[k][a][b-1]+(pre[p][b-1]-pre[p][a-1]);}}}for(int k=1;k<=bel[n];k++){for(int i=1;i<=n;i++) sum[k][i]+=sum[k][i-1];}for(int i=1;i<=bel[n];i++){for(int j=1;j<i;j++){for(int k=1;k<=len[i];k++){f[i][j][k]=sum[j][b[st[i]+k-1]]+f[i][j][k-1];}}}return;
}
void work(int l,int r,int bot,int top){if(l>r||bot>top){puts("0");return;}int x=bel[l],y=bel[r];if(x==y){ll res(0);for(int i=l;i<=r;i++){if(a[i]>=bot&&a[i]<=top){res+=(pre[i][rk[i]-1]-(l==st[x]?0:pre[l-1][rk[i]-1]))-(pre[i][lb[x][bot-1]]-(l==st[x]?0:pre[l-1][lb[x][bot-1]]));}}printf("%lld\n",res);return;}ll res(0);for(int i=x+1;i<y;i++){res+=s[i][lb[i][bot-1]+1][lb[i][top]];}for(int i=l;i<=ed[x];i++){if(a[i]>=bot&&a[i]<=top){res+=(pre[i][rk[i]-1]-(l==st[x]?0:pre[l-1][rk[i]-1]))-(pre[i][lb[x][bot-1]]-(l==st[x]?0:pre[l-1][lb[x][bot-1]]));}}for(int i=st[y];i<=r;i++){if(a[i]>=bot&&a[i]<=top){res+=pre[i][rk[i]-1]-pre[i][lb[y][bot-1]];}}int pp=st[x],cnt(0);for(int i=st[y];i<=ed[y];i++){while(pp<=ed[x]&&b[pp]<b[i]){cnt+=(pos[b[pp]]>=l&&b[pp]>=bot&&b[pp]<=top);++pp;}if(pos[b[i]]<=r&&b[i]>=bot&&b[i]<=top) res+=cnt;}for(int i=l;i<=ed[x];i++){if(a[i]>=bot&&a[i]<=top) res+=(sum[y-1][top]-sum[x][top])-(sum[y-1][a[i]]-sum[x][a[i]]);}for(int i=st[y];i<=r;i++){if(a[i]>=bot&&a[i]<=top) res+=(sum[y-1][a[i]]-sum[x][a[i]])-(sum[y-1][bot-1]-sum[x][bot-1]);}for(int k=x+1;k<y;k++){if(lb[k][bot-1]<lb[k][top]){res+=(f[k][k-1][lb[k][top]]-f[k][x][lb[k][top]])-(f[k][k-1][lb[k][bot-1]]-f[k][x][lb[k][bot-1]]);res-=1ll*(lb[k][top]-lb[k][bot-1])*(sum[k-1][bot-1]-sum[x][bot-1]);}}printf("%lld\n",res);
}bool mem2;
signed main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifdebug("mem=%.4lf\n",abs(&mem2-&mem1)/1024./1024);n=read();m=read();for(int i=1;i<=n;i++){b[i]=a[i]=read();pos[a[i]]=i;}init();for(int i=1;i<=m;i++){int l=read(),r=read(),bot=read(),top=read();work(l,r,bot,top);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NOIP2021] 数列(计数dp)

solution f[i][j][k][num][p]:2pf[i][j][k][num][p]:2^pf[i][j][k][num][p]:2p 选择了 iii 个&#xff0c;前 p−1p-1p−1 位 (202p−1)(2^0~2^{p-1})(20 2p−1) 已经选了jjj个&#xff0c;低位向高位进位上来 kkk&#xff0c;前 ppp 位已经确定有 numnumnum 个位置为 111&…

Xor sum HDU - 6955

Xor sum HDU - 6955 题意&#xff1a; 给定一个长度为n的整数序列&#xff0c;求其XOR和不小于k的最短连续子序列。 如果有多个相同长度的连续子序列&#xff0c;则打印具有最小左端点的连续子序列。 如果没有连续的子序列开关XOR总和不小于k&#xff0c;只需打印“-1”。 …

模板:子序列自动机(字符串)

所谓子序列自动机&#xff0c;就是根据子序列建立的自动机。 &#xff08;逃&#xff09; 前言 小清新算法。 解析 和其他自动机类似的&#xff0c;我们希望子序列自动机能且只能接受原串的所有子序列。 考虑一个问题&#xff1a;给你一个串 T&#xff0c;如何判断它是否是…

Docker最全教程之Go实战,墙裂推荐(十九)

前言与其他语言相比&#xff0c;Go非常值得推荐和学习&#xff0c;真香&#xff01;为什么&#xff1f;主要是可以直接编译成机器代码&#xff08;性能优越&#xff0c;体积非常小&#xff0c;可达10来M&#xff0c;见实践教程图片&#xff09;而且设计良好&#xff0c;上手门槛…

[BZOJ3093][Fdu校赛2012] A Famous Game(不等概率)

problem BOZJ3093 solution 逆概率公式&#xff0c;即贝叶斯(Bayes)公式&#xff1a; 假设 B1,B2,...,BnB_1,B_2,...,B_nB1​,B2​,...,Bn​ 是 Ω\OmegaΩ 的一个分割&#xff0c;P(A)>0P(A)>0P(A)>0&#xff0c;则有 P(Bk∣A)P(ABk)P(A)P(Bk)P(A∣Bk)∑i1nP(Bi)…

Mod, Or and Everything HDU - 6950

Mod, Or and Everything HDU - 6950 题意&#xff1a; 给你一个n,问(n%1) or (n%2) or … or (n %n)的值 题解&#xff1a; 无论n为奇偶&#xff0c;定义m(n-1)/2&#xff0c; 我们发现n mod i<m&#xff0c;而当i<m时&#xff0c;有n mod (n-i) i ,于是就有n mod i …

你注意到 .Net Framework 和 .Net Core 中使用 Session 的区别了吗?

在测试一个例子时发现的问题&#xff0c;这个示例实现的功能是刷新页面也能保持表格锁定列的状态&#xff0c;先看下页面的完成效果&#xff1a;测试中发现&#xff0c;几乎相同的代码&#xff1a;在 FineUIMvc&#xff08;Net Framework&#xff09;下没有问题&#xff1a;htt…

模板:拉格朗日乘子法(数学)

所谓拉格朗日乘子法&#xff0c;就是拉格朗日发明的乘子法。 &#xff08;逃&#xff09; 前言 曾经&#xff0c;我被它爆杀&#xff1b;如今&#xff0c;不同的日子&#xff0c;同样的题目&#xff0c;我却不再是曾经的我了。 因为我写模拟退火了。 也不能老是这么混着&…

[UOJ299][CTSC2017] 游戏

【CTSC2017】游戏 problem UOJ299 solution 定义 Xi:X_i:Xi​: 当前已知条件第 iii 局的状态 1/01/01/0&#xff08;胜/败&#xff09;。 将 XiCiX_iC_iXi​Ci​ 记为事件 AiA_iAi​。 假设现在已知条件共有 sss 个&#xff0c;即&#xff1a;第 k1∼sk_{1\sim s}k1∼s​…

Alice and Bob

Alice and Bob 题意&#xff1a; 两人博弈&#xff0c;每次一个人从一堆中拿k个&#xff0c;同时从另一堆拿k * s(s>0)个&#xff0c;问谁先不能拿 10000组数据,N<5000 题解&#xff1a; (x,y)表示第一堆石头数量为x&#xff0c;第二堆为y 如果(x,y)是必败状态&#…

一键发布部署vs插件[AntDeploy]开源了

deploy to remote server by one button click功能支持docker一键部署(支持netcore)支持iis一键部署(支持netcore和framework)(支持增量发布)(支持一键回滚)(支持点火)支持windows服务一键部署(支持netcore和framework)(支持增量发布)(支持一键回滚) 使用插件前我要发布一个net…

CF1257F Make Them Similar(meet in the middle,模拟退火)

前言 sto 退火大师_slb orz sto 正解大师_KHIN orz 只有我啥也不会&#xff0c;哈哈。 有趣的是&#xff0c;两种方法我都想到了一部分&#xff0c;然后都寄掉了。 这有趣个锤子。 解析 Sol1 考虑枚举最终的popcount&#xff0c;然后限制就变成了一个类似于高斯消元的形式…

Find 3-friendly Integers

Find 3-friendly Integers 题意&#xff1a; 定义一个自然数是精妙的&#xff0c;如果他存在一个字串(允许前导0)是3的倍数 问L到R中精妙的数的个数 题解&#xff1a; 数位dp可以做(但我不会。。。) 用结论来做&#xff0c;当n>100时(即为3位数时)必然是精妙的数&#x…

【学习笔记】平等博弈及常见的公平博弈类型

文章目录平等博弈nim堆SG定理nim和常见的公平博弈模型bash博弈nim博弈nim-k博弈wythoff博弈扩展wythoff博弈fibonacci博弈阶梯博弈green hackenbushMisre Nim博弈Every-SGnim积翻棋子游戏游戏的积&#xff0c;tartan定理平等博弈 G{L∣R},LRG\{L|R\},LRG{L∣R},LR&#xff0c;所…

Excel催化剂开源第31波-pdf相关功能实现及类库介绍

在Excel催化剂刚推出的pdf相关功能中&#xff0c;反馈很热烈&#xff0c;不止是用户层面好多人喜欢&#xff0c;也听到在.NET开发群里有询问pdf在winform上展现的功能诉求&#xff0c;一段时间没写开源篇&#xff0c;生怕大家以为Excel催化剂太小气了&#xff0c;不再开发了&am…

CF1526D Kill Anton(暴力)

前言 我的证明&#xff1a;这似乎非常对啊。 。。。 解析 直观感受&#xff1a;字母交错出现非常愚蠢。 然后就猜对了 为什么&#xff1f; 考虑两个相同但不相邻的字符 Ti,TjT_i,T_jTi​,Tj​&#xff0c;对应位置为 pi,pjp_i,p_jpi​,pj​。 夹在中间的字符 kkk 无非三种可…

Minimum spanning tree HDU - 6954

Minimum spanning tree HDU - 6954 题意&#xff1a; 给定n-1个点&#xff0c;编号从2到n&#xff0c;两点a和b之间的边权重为lcm&#xff08;a&#xff0c;b&#xff09;。请找出它们形成的最小生成树。 2<n<10000000 题解&#xff1a; 这题一看就眼熟。。。这不是去…

[小技巧]ASP.NET Core中如何预压缩静态文件

原文地址&#xff1a;Pre-compressed static files with ASP.NET Core作者&#xff1a;Gunnar Peipman译者&#xff1a;Lamond Lu译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10552131.html示例代码&#xff1a;https://github.com/lamondlu/CompressedStaticFileSample…

CF1494F Delete The Edges(欧拉回路)

前言 走远了走远了… 一直在想翻转一条链的奇偶性怎么做&#xff0c;但没有意识到最后一定是个菊花。 解析 一状态就是走一个欧拉回路&#xff0c;合法性更容易刻画&#xff0c;所以考虑反过来想&#xff0c;如何用状态二的走法删去一些边&#xff0c;使得剩下的图存在欧拉路…

【学习笔记】简单的连通性状压DP——插头DP(不学以为是天书)

文章目录哈希链表插头DP概念括号表示法 / 最小表示法例题洛谷插头dp板题CITYParkIITonys TourEfficient Tree[CQOI2015]标识设计哈希链表 众所周知&#xff0c;哈希是有冲突的可能性的&#xff0c;而且在状态数越多&#xff0c;冲突的概率就越高。目前掌握的处理方案有多哈希&…