[IOI2008] Fish 鱼
https://www.luogu.org/recordnew/lists?uid=56840
题解
首先可以发现我们对于每种颜色的鱼,长一点的能够覆盖的方案已定完全包含短一点的方案。
所以我们可以只对每种颜色最长的鱼计算贡献。
然后有一个\(naive\)的想法,我们从按照最长的鱼的长度小到大枚举每种颜色,然后算出那条最长的鱼能够包含的方案。
这样会算重。
那么我们还有一个\(naive\)的想法,我们可以在枚举的时候,只维护出比在a这种颜色前面的颜色的所有方案。
这样会算少。
考虑在什么情况吗,没有被算到。
对于两种颜色\(a,b\),我们本该在枚举a的时候枚举(a,b)这种集合,结果由于排序所以没有枚举到,但在枚举b的时候因为长度原因没有够到a。
所以我们在枚举a的时候,当我们没有拿走能够拿走的所有a的时候可以按照上面的方法做,但是如果a的全部拿走了,我们需要把所有颜色b算出来,这些b可以拿到的颜色个数是和a一样的。
这样的话,a的数量是now+1的,枚举到b是最多枚举到now,所以不会算重。
我也不知道我在写啥
代码
#include<bits/stdc++.h>
#define N 500009
using namespace std;
typedef long long ll;
int n,k,mod,cnt[N];
int id[N],pos[N],ct[N];
int now[N],nxt[N];
int mx[N],_mx[N];
ll ans;
inline ll rd(){ll x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x;
}
inline void MOD(ll &x){x=x>=mod?x-mod:x;}
inline bool cmp(int a,int b){return mx[a]<mx[b];}
struct node{int len,co;inline bool operator <(const node &b)const{return len<b.len;}
}a[N];
struct segment{int tr[N<<2];void upd(int cnt,int l,int r,int x){if(l==r){tr[cnt]++;return;}int mid=(l+r)>>1;if(mid>=x)upd(cnt<<1,l,mid,x);else upd(cnt<<1|1,mid+1,r,x);tr[cnt]=1ll*tr[cnt<<1]*tr[cnt<<1|1]%mod;}void build(int cnt,int l,int r){tr[cnt]=1;if(l==r)return;int mid=(l+r)>>1;build(cnt<<1,l,mid);build(cnt<<1|1,mid+1,r);}ll query(int cnt,int l,int r,int L,int R){if(L>R)return 1;if(l>=L&&r<=R)return tr[cnt];int mid=(l+r)>>1;if(mid>=L&&mid<R)return query(cnt<<1,l,mid,L,R)*query(cnt<<1|1,mid+1,r,L,R)%mod;if(mid>=L)return query(cnt<<1,l,mid,L,R);if(mid<R)return query(cnt<<1|1,mid+1,r,L,R);}inline void init(int n){build(1,1,n);}
}T;
inline int efs(int num,int l,int r){int ans=l;while(l<=r){int mid=(l+r)>>1;if(_mx[mid]<num)ans=mid,l=mid+1;else r=mid-1;}return ans;
}
int main(){n=rd();k=rd();mod=rd();for(int i=1;i<=n;++i){a[i].len=rd();a[i].co=rd();mx[a[i].co]=max(mx[a[i].co],a[i].len);}sort(a+1,a+n+1);for(int i=1;i<=k;++i)id[i]=i;sort(id+1,id+k+1,cmp);for(int i=1;i<=k;++i)pos[id[i]]=i,_mx[i]=mx[id[i]];for(int i=n;i>=1;--i){a[i].co=pos[a[i].co];cnt[a[i].co]++;nxt[i]=now[a[i].co];now[a[i].co]=i;}T.init(k); int p=1;for(int i=1;i<=n;++i){cnt[a[i].co]--;while(a[p].len*2<=a[i].len)now[a[p].co]=nxt[now[a[p].co]],T.upd(1,1,k,a[p].co),ct[a[p].co]++,p++;if(!cnt[a[i].co]){int ps=efs(a[now[a[i].co]].len*2,a[i].co,k);ll x=T.query(1,1,k,1,a[i].co-1);MOD(ans+=x*ct[a[i].co]%mod);MOD(ans+=x*T.query(1,1,k,a[i].co+1,ps)%mod);}}cout<<ans;return 0;
}
转载于:https://www.cnblogs.com/ZH-comld/p/11142943.html
[IOI2008] Fish 鱼相关推荐
- 黑马程序员-10.一位老农带着猫、狗、鱼过河
------ Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 题目是10. 一位老农带着猫.狗.鱼过河,河边有一条船,每次老农只能带一只动物过河.当老农不和 ...
- 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
import java.util.ArrayList; import java.util.List; import java.util.Random;/*** 一位老农带着猫.狗.鱼过河,河边有一条船 ...
- python大众点评网应该涉及哪些参考文献及其出版社_python小练习(052):爬取大众点评网美食版块+数据库储存+大数据分析(二)...
输出的结果: (1, '花隐日式怀石料理(上海五角场店)', '/shop/37765452', '五星商户', '日本菜', '五角场/大学区', '淞沪路8号百联又一城7楼', 331, 91, ...
- C++多态的实现原理
1. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数. 2. 存在虚函数的类都有一个一维的虚函数表叫做虚表.类的对象有一个指向虚表开始的虚指针.虚表是和类对应的,虚表指针是和对象 ...
- 使用内部类隐藏实现细节
内部类的重要价值在于其隐藏实现细节的能力,做法是将内部类访问属性设置为private,并且内部类实现了一个接口或者继承了一个类.然后由外围类建立方法以生成这些内部类的实例,而这些方法的返回类型必须是父 ...
- 《Android 应用案例开发大全(第二版)》——2.6节绘制相关类
本节书摘来自异步社区<Android 应用案例开发大全(第二版)>一书中的第2章,第2.6节绘制相关类 ,作者 吴亚峰 , 于复兴 , 杜化美,更多章节内容可以访问云栖社区"异步 ...
- bread是可数还是不可数_不可数名词用法详解,小小名词大作用,英语想打好基础必学的词性...
在上一篇文章中我和大家分析了初中英语的可数名词的用法,这里和大家再详细的分析一下不可数名词的用法,因为这个理解起来比可数名词稍微难一些,因为涉及到谓语动词的用法,还有的是把可数名词和不可数名词放在一起 ...
- 德州扑克里的专业术语你知道几个?
干货!干货!不知道德州扑克这几个词的意思还敢说你会玩德州? 德州扑克里的专业术语你知道几个? 德州扑克全称德克萨斯扑克,是一种玩家对玩家的公共牌类游戏,考验玩家的运气.技术与耐心.德州扑克的规则虽然简 ...
- [转载] Java之继承
参考链接: Java多重继承 Java之继承 继承是面向对象程序的一个基本特征,通过继承可以实现父子关系,以及代码的复用.通过继承实现的类称为子类,被继承的类称为父类,所有直接或间接被继承的类都称为父 ...
最新文章
- Hibernate Annotation 学习
- python教程书籍推荐-推荐几本对于Python初学者比较好的书籍(内含PDF)
- autocad.net中ResultBuffer相关的常量值
- ubuntu安装python下载包_Ubuntu安装Python的包管理工具Pip
- #3120. 「CTS2019 | CTSC2019」珍珠
- 机器视觉:百万像素工业镜头
- Github 是如何用 Github 撰写 Github 文档的
- 字符串当id用 转换成json对象
- 转:imageNamed和dataWithContentsOfFile的区别
- html中label中的for属性
- teablue数据分析_Bluetea蓝茶的品牌该如何分析,你知道吗
- Centos-RedHat 添加路由
- 测试用rtmp直播源
- Arcgis desktop 9.3的破解方法(转载GIS帝国)
- PowerDesigner(数据库建模工具) 使用教程
- 新浪微博批量删除功能
- 2017.12.5对内网,外网的理解
- SDN跟网络虚拟化的完美结合
- 谷仓的安保【DFS】
- HIVE --- Metastore