P4849 寻找宝藏(模板:四维偏序)

stable_sort 保平安。

解析

dp方程显而易见,关键就是如何进行这个四维偏序的转移。

考虑三维偏序(比如拦截导弹)我们是如何做的?
先按照第一维排序,然后分治解决前一半,接下来把前一半的第一维看成0,第二维看成1,按照第二维排序后,用所有的0对1进行转移。

本题也延续这样的思想,先按照第一维排序,前一半看成0,后一半看成1,然后再对其进行一次三维偏序的转移,有所不同就是只有打上0标记的才可以加入树状数组,打上1标记的才可以接受转移。

换句话说,就是只能让0,0向1,1转移。

注意排序一定要排彻底!
stable_sort 是好东西,在常数可以接受的情况下大大降低写错的风险。
其实主要出错就是重点的时候,注意一下把cmp函数写好也不会有问题。

代码

(毕竟是模板,就贴的是不用 stable_sort 也能过的)

#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")
using namespace std;const int N=8e4+100;
const int C=205;
const int mod=998244353;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;
}
int n,m;
#define pr pair<ll,ll>
#define mkp make_pair
pr f[N];
int q[N],cnt;
void operator += (pr &a,pr b){if(a.first<b.first) a=b;else if(a.first==b.first) (a.second+=b.second)%=mod;
}
inline void add(int p,pr o){for(;p<=cnt;p+=p&-p) f[p]+=o;return;
}
inline pr ask(int p){pr res=mkp(0,1);for(;p;p-=p&-p) res+=f[p];return res;
}
inline void clear(int p){for(;p<=cnt;p+=p&-p) f[p]=mkp(0,1);
}
struct node{int x[5],v;pr dp;bool op;
}p[N];
inline void print(node o,bool op=1){printf("[(%d %d %d %d) dp=(%lld %lld) v=%d op=%d] ",o.x[1],o.x[2],o.x[3],o.x[4],o.dp.first,o.dp.second,o.v,o.op);if(op) putchar('\n');return;
}
bool cmp1 (const node &a,const node &b){if(a.op!=b.op) return a.op>b.op;if(a.x[1]!=b.x[1]) return a.x[1]<b.x[1];else if(a.x[2]!=b.x[2]) return a.x[2]<b.x[2];else if(a.x[3]!=b.x[3]) return a.x[3]<b.x[3];else if(a.x[4]!=b.x[4]) return a.x[4]<b.x[4];else return a.dp<b.dp;
}
bool cmp2 (const node &a,const node &b){if(a.x[2]!=b.x[2]) return a.x[2]<b.x[2];else if(a.x[3]!=b.x[3]) return a.x[3]<b.x[3];else if(a.x[4]!=b.x[4]) return a.x[4]<b.x[4];else if(a.x[1]!=b.x[1]) return a.x[1]<b.x[1];else return a.op>b.op;
}
bool cmp3 (const node &a,const node &b){if(a.x[3]!=b.x[3]) return a.x[3]<b.x[3];else if(a.x[4]!=b.x[4]) return a.x[4]<b.x[4];else if(a.x[1]!=b.x[1]) return a.x[1]<b.x[1];else if(a.x[2]!=b.x[2]) return a.x[2]<b.x[2];else return a.dp<b.dp;
}void solve2(int l,int r){if(l==r){//p[l].dp+=mkp(p[l].v,1);return;}int mid=(l+r)>>1;solve2(l,mid);sort(p+l,p+mid+1,cmp3);sort(p+mid+1,p+r+1,cmp3);	int pl=l;for(int i=mid+1;i<=r;i++){while(pl<=mid&&p[pl].x[3]<=p[i].x[3]){if(p[pl].op){add(p[pl].x[4],p[pl].dp);}++pl;}if(!p[i].op){pr o=ask(p[i].x[4]);o.first+=p[i].v;if(o.first!=p[i].v) p[i].dp+=o;}}for(int i=l;i<pl;i++){if(p[i].op) clear(p[i].x[4]);}//printf("    solve2: ");//for(int i=l;i<=r;i++) print(p[i],i==r);sort(p+mid+1,p+r+1,cmp2);solve2(mid+1,r);return;
}
void solve1(int l,int r){if(l==r) return;int mid=(l+r)>>1;solve1(l,mid);//sort(p+l,p+mid+1,cmp2);//sort(p+mid+1,p+r+1,cmp2);for(int i=l;i<=mid;i++) p[i].op=1;for(int i=mid+1;i<=r;i++) p[i].op=0;sort(p+l,p+r+1,cmp2);//printf("\nsolve1: ");//for(int i=l;i<=r;i++) print(p[i],i==r);solve2(l,r);sort(p+l,p+r+1,cmp1);solve1(mid+1,r);return;
}signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifn=read();m=read();for(int i=1;i<=n;i++){for(int j=1;j<=4;j++) p[i].x[j]=read();p[i].v=read();q[++cnt]=p[i].x[4];p[i].dp=mkp(p[i].v,1);}sort(q+1,q+1+cnt);cnt=unique(q+1,q+1+cnt)-q-1;for(int i=1;i<=n;i++){p[i].x[4]=lower_bound(q+1,q+1+cnt,p[i].x[4])-q;}sort(p+1,p+1+n,cmp1);solve1(1,n);pr ans=mkp(0,1);for(int i=1;i<=n;i++) ans+=p[i].dp;printf("%lld\n%lld\n",ans.first,ans.second);return 0;
}
/*
*/

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

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

相关文章

AcWing 220. 最大公约数

AcWing 220. 最大公约数 题意&#xff1a; 题解&#xff1a; 题目就变成了AcWing 201. 可见的点 当然有微调&#xff0c;因为可见的点里面是从0开始&#xff0c;本题从1开始&#xff0c;所以本题中phi[1]认为是0 AcWing 201. 可见的点的题解 代码&#xff1a; #include<b…

2021 CSP-S 游记

2021CSP-S游记 从国庆过后就开始停课&#xff0c;确实面对的压力和挑战很大。 这段时间真的就是完全没有去想文化课那边的事。 越接近考试时间&#xff0c;模拟赛就越密集&#xff0c;最近大家都在互测。 蛮清楚自己的水平的&#xff0c;而且偶尔还是能考得不错&#xff0c…

欧拉函数(简单介绍+例题)

Acwing视频讲解 欧拉函数&#xff1a;正整数n&#xff0c;欧拉函数是小于n的正整数中与n互质的数的数目 Np1a1 * p1a2 * p1a3 * …* p1ak 如果pj是i的最小质因子 红色区域一样 经推导得&#xff1a;phi[i * pj] phi[i] * pj 如果pj不是i的最小质因子 经推导&#xff1a;phi[…

P5303 [GXOI/GZOI2019]逼死强迫症(斐波拉契、矩阵乘法)

解析 非常妙的一个题&#xff0c;感受到了斐波拉契优美的归纳性质。 首先&#xff0c;不难发现只要两个1*1的位置固定&#xff0c;中间的摆法就固定了&#xff0c;而两边的方案都是经典的斐波拉契数列&#xff08;设为 fif_ifi​&#xff09;。 那么枚举中间的间隔再枚举左边…

程序员过关斩将--你的面向接口编程一定对吗?

菜菜哥&#xff0c;出大事啦怎么了&#xff0c;你和男票分手了&#xff1f;很正常&#xff0c;谁让你男票是产经经理呢不是啦&#xff0c;是我做的一个小游戏&#xff0c;需求又变了&#xff0c;程序我快改不动了说来让我欢乐一下&#xff1f;菜菜哥&#xff0c;咱两还能不能好…

[2021 CSP-S提高组] 题解(廊桥分配+括号序列+回文+交通规划)

2021 CSP-S 题解廊桥分配括号序列回文交通规划配合&#x1f449;CSP-S游记 食用更佳哦~ 【雷】&#xff1a;只是在民间数据过了&#xff0c;不保证一定正确。仅供参考&#xff01;&#xff01;&#xff01; 【雷】&#xff1a;只是在民间数据过了&#xff0c;不保证一定正确。…

P1247 取火柴游戏

P1247 取火柴游戏 题意&#xff1a; 有n堆火柴&#xff0c;两个人轮流操作&#xff0c;每次只能在从一堆中取若干火柴&#xff0c;拿走最后一根火柴的为胜者&#xff0c;给你一个状态&#xff0c;问先手是赢是输 题解&#xff1a; 很经典的nim博弈&#xff0c;结论大家应该…

Codeforces:779(div2)

前言 solve 4 rnk247 占了罚时的便宜。 CF不占罚时便宜就会被罚时占便宜 感觉这场似乎都是性质题&#xff0c;一眼看出性质就秒了&#xff0c;看不出就很难做出来了。 C似乎卡了很多人。但我做起来还好。 D2做不出来有些懊恼。 E是妙题。 题目 A 水题&#xff0c;保证male…

我们为什么要搞长沙.NET技术社区(4)

我们为什么要搞长沙.NET技术社区&#xff08;4&#xff09;邹溪源&#xff0c;2019年3月7日Ps:文中的.NET 包括且不限定于传统.NET Framework技术和.NET Core技术。1. 楔子昨天&#xff08;2019年3月6日&#xff09;晚餐时间&#xff0c;有幸得到长沙技术圈资深.NET开发者出生…

P1290 欧几里德的游戏

P1290 欧几里德的游戏 题意&#xff1a; 给定两个正整数 M 和 N&#xff0c;从 Stan 开始&#xff0c;从其中较大的一个数&#xff0c;减去较小的数的正整数倍&#xff0c;当然&#xff0c;得到的数不能小于 0。然后是 Ollie进行同样的操作&#xff0c;直到一个人得到0&#…

【无码专区3】乘法表的解密破译

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 problem 给定一个 qqq 进制的乘法表&#xff0c;每个字符代表着 0∼p−10\sim p-10∼p−1 不同的数字。 求每个字符代表的数字。保证有解。 \timesABCDACDBBDCBABBBBBBBBBCDCBBDBBCDBABBBCBD i.e. CD\text{C…

CF1553H XOR and Distance (Trie)

解析 有的时候&#xff0c;看起来是暴力的东西再稍微想想性质就是正解了。 本题有两种做法&#xff0c;一种使用了trie树&#xff0c;一种没有。但本质是一样的&#xff0c;只是trie树把我们的所求显性的表达了出来。 考虑trie树暴力怎么做。 对于一个特定的 xxx 走到一个结…

C#机器学习之判断日报是否合格

原文作者&#xff1a;心莱科技肖鑫简单来说机器学习的核心步骤在于“获取学习数据&#xff1b;选择机器算法&#xff1b;定型模型&#xff1b;评估模型&#xff0c;预测模型结果”&#xff0c;下面本人就以判断日报内容是否合格为例为大家简单的阐述一下C#的机器学习。第一步&a…

【无码专区4】幸运数字4(折半搜索+计数+结论)

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…

P1288 取数游戏II

P1288 取数游戏II 题意&#xff1a; 一个环&#xff0c;由边权&#xff0c;硬币一开始在一个点上&#xff0c;两个人轮流操作&#xff0c;每次操作向左或右移动&#xff0c;每次移动必须将边权减少到非负整数&#xff0c;如果原本是0则不能走&#xff0c;当不能走动时&#x…

CF1616F Tricolor Triangles(构造、高斯消元)

解析 关键性质&#xff1a;三元环合法等价于边权和模3等于0。 还有一个常识&#xff1a;三元环的级别是O(mm)O(m\sqrt m)O(mm​)。 证明&#xff1a; 三个点度数都大于 m\sqrt mm​ 的点不超过Cm3mmC_{\sqrt m}^3m\sqrt mCm​3​mm​ 个。 如果含有度数小于m\sqrt mm​ 的点&am…

SignalR2结合ujtopo实现拓扑图动态变化

上一篇文章基于jTopo的拓扑图设计工具库ujtopo&#xff0c;介绍了拓扑设计工具&#xff0c;这一篇我们使用SignalR2结合ujtopo实现拓扑图的动态变化。仅仅作为演示&#xff0c;之前的文章SignalR2简易数据看板演示&#xff0c;用一个小的示例演示了SignalR作为数据看板的用法&a…

树的同构模板题(法1.最小表示法+法2.树哈希)

树的同构problemsolutioncodesolutioncodeproblem 模板题 solution Ⅰ. 最小表示法 将树转化为 0/10/10/1 括号序列&#xff1a;从根开始 dfs\text{dfs}dfs&#xff0c;000 就往下遍历一个儿子&#xff0c;111 就返回&#xff0c;构成一个 2n2\times n2n 的括号序列。 显然…

CF917B MADMAX

CF917B MADMAX 题意&#xff1a; Alice和Bob有一个n个点m条边的DAG&#xff0c;每条边上有一个小写英文字母表示权值&#xff0c;Alice和Bob每人有一个棋子&#xff0c;每个人放在一个节点上&#xff08;可以放在同一个节点上&#xff09;。 第一轮Alice可以沿一条边把棋子移…

CF1534F:Falling Sand(tarjan、贪心、dp)

解析 本题做的过程大概是&#xff1a;到了正解门口决定回头&#xff0c;绕了地球一圈最后从另一边走到正解了… 我的分析&#xff1a; 首先 easy version 很简单&#xff0c;如果从一列最大值可以走到另一列最大值&#xff0c;那么后者就没用了。缩完点所有的零度点就是答案。…