YbtOJ#791-子集最值【三维偏序】

正题

题目链接:http://www.ybtoj.com.cn/contest/123/problem/1


题目大意

给出333个长度为nnn的排列A,B,CA,B,CA,B,C。然后一个下标集合SSS的三元组是
(max{Ai},max{Bi},max{Ci})(i∈S)(max\{A_i\},max\{B_i\},max\{C_i\})(i\in S)(max{Ai},max{Bi},max{Ci})(iS)

求所有下标集合不同的三元组数量
1≤n≤1051\leq n\leq 10^51n105


解题思路

所有下标集合的三元组都能用一个∣S∣≤3|S|\leq 3S3的集合代替,所以我们只考虑∣S∣≤3|S|\leq 3S3的就好了。

∣S∣=1|S|=1S=1的个数就是nnn,直接累加即可。

∣S∣=2|S|=2S=2的话,那就代表某个下标霸占了两个最大值,而另一个一定是另一个下标的,如果是a,ba,ba,b最大,那么我们就要找满足ai>aj,bi>aj,ci<cja_i> a_j,b_i> a_j,c_i< c_jai>aj,bi>aj,ci<cj的方案,用三维偏序就好了。

然后a,ca,ca,cb,cb,cb,c的情况也都要做

∣S∣=3|S|=3S=3的话很麻烦,考虑容斥,总方案(n3)\binom n 3(3n)减去有一个下标是至少两个的最大值。
同样和上面,先考虑a,ba,ba,b,假设下标iii满足ai>aj,bi>bja_i>a_j,b_i>b_jai>aj,bi>bj的情况有kkk种,那么就好有(k2)\binom{k}{2}(2k)种情况使得iii占据了至少两个最大值。
同理a,ca,ca,cb,cb,cb,c也要做,这是二维偏序,直接树状数组就好了。

但是发现对于iii占据了三个最大值的情况我们统计了三次,需要加回多余的两次,那么统计ai>aj,bi>bj,ci>cja_i>a_j,b_i>b_j,c_i>c_jai>aj,bi>bj,ci>cj的个数kkk,然后加回k(k−1)k(k-1)k(k1)的方案就好了,这个也要三维偏序

代码里三维偏序用的是CDQCDQCDQ分治+树状数组

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define lowbit(x) (x&-x)
using namespace std;
const ll N=1e5+10;
struct node{ll a,b,c;
}w[N],a[N],b[N];
ll n,ans,sum,t[N],g[N];
void Change(ll x,ll val){while(x<=n){t[x]+=val;x+=lowbit(x);}return;
}
ll Ask(ll x){ll ans=0;while(x){ans+=t[x];x-=lowbit(x);}return ans;
}
void Merge(ll l,ll mid,ll r){ll p=l,q=mid+1;for(ll i=1;i<=r-l+1;i++){if(p<=mid&&w[p].b<=w[q].b||q>r)b[i]=w[p],p++;else b[i]=w[q],q++;}for(ll i=1;i<=r-l+1;i++)w[l+i-1]=b[i];return;
}
void CDQ(ll l,ll r,bool op){if(l==r)return;ll mid=(l+r)>>1;CDQ(l,mid,op);CDQ(mid+1,r,op);ll p=l,tmp;for(ll i=mid+1;i<=r;i++){while(p<=mid&&w[p].b<w[i].b)Change(w[p].c,1),p++;sum+=(tmp=Ask(w[i].c));g[w[i].a]+=(op?tmp:0);}for(ll i=l;i<p;i++)Change(w[i].c,-1);Merge(l,mid,r);return;
}
bool cmp(node x,node y)
{return x.a<y.a;}
void solve(){sort(w+1,w+1+n,cmp);for(ll i=1;i<=n;i++){ll tmp=Ask(w[i].b);ans-=tmp*(tmp-1)/2;Change(w[i].b,1);}memset(t,0,sizeof(t));return;
}
signed main()
{freopen("subset.in","r",stdin);freopen("subset.out","w",stdout);scanf("%lld",&n);ans=n;for(ll i=1;i<=n;i++)scanf("%lld",&a[i].a);for(ll i=1;i<=n;i++)scanf("%lld",&a[i].b);for(ll i=1;i<=n;i++)scanf("%lld",&a[i].c);for(ll i=1;i<=n;i++)w[i].a=a[i].a,w[i].b=a[i].b,w[i].c=n-a[i].c+1;sort(w+1,w+1+n,cmp);CDQ(1,n,0);for(ll i=1;i<=n;i++)w[i].a=a[i].a,w[i].b=a[i].c,w[i].c=n-a[i].b+1;sort(w+1,w+1+n,cmp);CDQ(1,n,0);for(ll i=1;i<=n;i++)w[i].a=a[i].b,w[i].b=a[i].c,w[i].c=n-a[i].a+1;sort(w+1,w+1+n,cmp);CDQ(1,n,0);ans+=sum;ans+=n*(n-1)*(n-2)/6;for(ll i=1;i<=n;i++)w[i].a=a[i].a,w[i].b=a[i].b;solve();for(ll i=1;i<=n;i++)w[i].a=a[i].b,w[i].b=a[i].c;solve();for(ll i=1;i<=n;i++)w[i].a=a[i].a,w[i].b=a[i].c;solve();for(ll i=1;i<=n;i++)w[i].a=a[i].a,w[i].b=a[i].b,w[i].c=a[i].c;sort(w+1,w+1+n,cmp);CDQ(1,n,1);for(ll i=1;i<=n;i++)ans+=g[i]*(g[i]-1);printf("%lld\n",ans);
}

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

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

相关文章

【主席树】更为厉害(P3899)

正题 P3899 题目大意 给你一棵树&#xff0c;对于每次询问&#xff0c;给出x,k&#xff0c;问你有多少个三元组(y,z)满足x,y,z不同&#xff0c;x,y之间的距离小于k&#xff0c;且x,y都是z的祖先 解题思路 若y的深度小于x&#xff0c;那么一定在x到根节点的路径上&#xff0c…

人工智能——图像分析第二期练习

又和同学肝了半个上午&#xff08;主要是一二节有课&#xff09;&#xff0c;完成了天气图像识别的第二期练习 一开始几个题不难&#xff0c;挺简单的&#xff0c;到后面出现HOG特征拟合svm模型&#xff0c;HOG提取特征&#xff0c;又是现学内容 HOG特征的维数用cv2.HOGDescrip…

C# 中使用面向切面编程(AOP)中实践代码整洁

1. 前言最近在看《架构整洁之道》一书&#xff0c;书中反复提到了面向对象编程的 SOLID 原则&#xff08;在作者的前一本书《代码整洁之道》也是被大力阐释&#xff09;&#xff0c;而面向切面编程&#xff08;Aop&#xff09;作为面向对象编程的有力补充&#xff0c;对实践整洁…

AtCoder Beginner Contest 183 总结

本来懒得写了&#xff0c;不过第一次AK还是记录一下吧 A - ReLU ABC的签到题就是友好 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #inc…

【数论】ZAP-Queries(P3455)

正题 P3455 题目大意 有T组询问&#xff0c;每组询问给出n,m,c&#xff0c;求∑i1n∑j1m[(i,j)c]\sum_{i1}^{n}\sum_{j1}^{m}[(i,j)c]i1∑n​j1∑m​[(i,j)c] 解题思路 可以先对n,m除c这样就使得求出的数都有c的因子&#xff0c;得到式子如下 ∑i1n∑j1m[(i,j)1]∑i1n∑j1m∑…

AT4518-[AGC032C]Three Circuits【欧拉回路】

正题 题目链接:https://www.luogu.com.cn/problem/AT4518 题目大意 给出nnn个点mmm条边的一张简单无向联通图&#xff0c;求能否把它分成三个可重复点的环。 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 相当于你要去掉图上的两个环后依旧有欧拉回路 首先原本肯定得…

ABB (2020牛客国庆集训派对day1)

ABB 题意&#xff1a; 长度为n的字符串&#xff0c;问最少添加多少字符可以使其构成回文字符串 题解&#xff1a; 最长回文字符串我的第一反应是manacher马拉车算法&#xff0c;那我们直接马拉车找到已有最长回文串&#xff0c;然后总长度减去不就是答案吗&#xff1f;非也…

微软对开发者献真爱,全面支持开源,加速研发云升级

全球首秀&#xff1a;支持 Java 和 Python 的 Visual Studio Live Share 协作服务与 IntelliCode 人工智能辅助编程&#xff0c;适用于物联网和智能边缘的自动机器学习能力&#xff08;Auto ML&#xff09;&#xff1b;Visual Studio App Center 提供一站式跨平台移动应用开发体…

Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)

今天看不下去数电vp一场div2&#xff0c;搞A搞了很长时间&#xff0c;导致后面没有时间写&#xff0c;不过今天补题的时候全是独立补出来的没有看题解 vp3题&#xff0c;补3题 A - Kids Seating 最开始想的是与质数有关&#xff0c;乱七八糟搞了半天&#xff0c;结果最后回头…

【数论】GCD(P2568)

正题 P2568 题目大意 求满足1≤x,y≤n1\leq x,y\leq n1≤x,y≤n且gcd(x,y)primegcd(x,y)primegcd(x,y)prime的数对(x,y)(x,y)(x,y)的个数 解题思路 题目即求 ∑i1n∑j1n[gcd(i,j)prime]\sum_{i1}^n\sum_{j1}^n[gcd(i,j)prime]i1∑n​j1∑n​[gcd(i,j)prime] 可以考虑先枚举…

AT4502-[AGC029C]Lexicographic constraints【二分,栈】

正题 题目链接:https://www.luogu.com.cn/problem/AT4502 题目大意 给出nnn个长度SSS&#xff0c;求一个最小mmm表示用大小为mmm的字符集构造出nnn个符合对应长度的字符串使得字符串按照给出顺序从小到大。 1≤n≤2105,1≤Si≤1091\leq n\leq 2\times 10^5,1\leq S_i\leq 10^…

2020牛客国庆集训派对day1 C. Bob in Wonderland

Bob in Wonderland 题意&#xff1a; 一棵树&#xff0c;问最少移动多少次边可以使其变成一个链&#xff1f; 移动是指&#xff1a;从原位置拆下并连到新位置&#xff0c;这样算一次 题解&#xff1a; 错误思路 我一开始在想既然求最少移动次数&#xff0c;那我们就尽可能…

Ocelot简易教程(七)之配置文件数据库存储插件源码解析

上篇文章Ocelot简易教程&#xff08;六&#xff09;之重写配置文件存储方式并优化响应数据 给大家分享了如何集成我写的一个Ocelot扩展插件把Ocelot的配置存储到数据库中。并没有对实现原理进行相应的阐述。今天抽空把实现的原理给大家说道说道。明白原理后&#xff0c;大家就可…

【数论】YY的GCD(P2257)

正题 P2257 题目大意 给你T组询问&#xff0c;每组询问给出n,m&#xff0c;让你求 1≤x≤n,1≤y≤m1\leq x\leq n,1\leq y\leq m1≤x≤n,1≤y≤m 且 gcd(x,y)primegcd(x,y)primegcd(x,y)prime 的方案数 解题思路 根据题意&#xff0c;有 ∑i1n∑j1m[gcd(i,j)prime]\sum_{i1}…

ASP.NET Core 2调用Azure云上的PowerBI报表展示

在开发企业应用中&#xff0c;报表功能是当之无愧的重头戏&#xff0c;如何将数据通过合适的报表呈现出来成为每个项目人员必需面临的问题。而找到一款合适的报表往往都需要考率价格、开发、风格、支撑等因素。那么&#xff0c;我在这里给大家介绍一款由微软提供的可视化报表工…

2020牛客国庆集训派对day1 Zeldain Garden

Zeldain Garden 题意&#xff1a; 问[L,R]内所有数的因子的数量和 题解&#xff1a; 如果传统暴力做肯定不行 我们来找找规律&#xff1a; 数字&#xff1a; 因子数目 1~n的因子数和 1 1 1 2 2 321/ 3 2 5311 4 3 84211 5 2 1052111 6 4 14 7 2 16 8…

CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】

正题 题目链接:https://www.luogu.com.cn/problem/CF585E 题目大意 给出一个大小为nnn的可重集TTT&#xff0c;求有多少个它的非空子集SSS和元素xxx满足 x∉S,gcd{S}>1,gcd(S,x)1x\notin S,gcd\{S\}>1,gcd(S,x)1x∈/​S,gcd{S}>1,gcd(S,x)1 1≤n≤51051\leq n\leq 5…

ABC182——F - Valid payments Editorial

F - Valid payments Editorial 大佬题解 看了述题解我才刚理解题目意思。 Here, both Lunlun and the clerk used the minimum number of coins needed to represent those amounts of money. 这句话意味着任何数都能用a1…ana_1\dots a_na1​…an​这些面值的货币唯一表示 并…

【数论】GCD SUM(P2398)

正题 P2398 题目大意 给出n&#xff0c;求∑i1n∑j1ngcd(i,j)\sum_{i1}^n\sum_{j1}^ngcd(i,j)i1∑n​j1∑n​gcd(i,j) 解题思路 考虑先枚举gcd&#xff0c;那么有 ∑d1nd∑i1n/d∑j1n/d[gcd(i,j)1]\sum_{d1}^nd\sum_{i1}^{n/d}\sum_{j1}^{n/d}[gcd(i,j)1]d1∑n​di1∑n/d​j…

AT4519-[AGC032D]Rotation Sort【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT4519 题目大意 给出一个长度为nnn的排列&#xff0c;每次可以选择一个区间&#xff0c;然后花费AAA的代价向左旋转&#xff08;最左边的丢到最右边&#xff09;或者花费BBB的代价向右旋转。 排升序序的最小花费。 1≤n≤50…