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 鱼相关推荐

  1. 黑马程序员-10.一位老农带着猫、狗、鱼过河

    ------ Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 题目是10. 一位老农带着猫.狗.鱼过河,河边有一条船,每次老农只能带一只动物过河.当老农不和 ...

  2. 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。

    import java.util.ArrayList; import java.util.List; import java.util.Random;/*** 一位老农带着猫.狗.鱼过河,河边有一条船 ...

  3. python大众点评网应该涉及哪些参考文献及其出版社_python小练习(052):爬取大众点评网美食版块+数据库储存+大数据分析(二)...

    输出的结果: (1, '花隐日式怀石料理(上海五角场店)', '/shop/37765452', '五星商户', '日本菜', '五角场/大学区', '淞沪路8号百联又一城7楼', 331, 91, ...

  4. C++多态的实现原理

    1. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数. 2. 存在虚函数的类都有一个一维的虚函数表叫做虚表.类的对象有一个指向虚表开始的虚指针.虚表是和类对应的,虚表指针是和对象 ...

  5. 使用内部类隐藏实现细节

    内部类的重要价值在于其隐藏实现细节的能力,做法是将内部类访问属性设置为private,并且内部类实现了一个接口或者继承了一个类.然后由外围类建立方法以生成这些内部类的实例,而这些方法的返回类型必须是父 ...

  6. 《Android 应用案例开发大全(第二版)》——2.6节绘制相关类

    本节书摘来自异步社区<Android 应用案例开发大全(第二版)>一书中的第2章,第2.6节绘制相关类 ,作者 吴亚峰 , 于复兴 , 杜化美,更多章节内容可以访问云栖社区"异步 ...

  7. bread是可数还是不可数_不可数名词用法详解,小小名词大作用,英语想打好基础必学的词性...

    在上一篇文章中我和大家分析了初中英语的可数名词的用法,这里和大家再详细的分析一下不可数名词的用法,因为这个理解起来比可数名词稍微难一些,因为涉及到谓语动词的用法,还有的是把可数名词和不可数名词放在一起 ...

  8. 德州扑克里的专业术语你知道几个?

    干货!干货!不知道德州扑克这几个词的意思还敢说你会玩德州? 德州扑克里的专业术语你知道几个? 德州扑克全称德克萨斯扑克,是一种玩家对玩家的公共牌类游戏,考验玩家的运气.技术与耐心.德州扑克的规则虽然简 ...

  9. [转载] Java之继承

    参考链接: Java多重继承 Java之继承 继承是面向对象程序的一个基本特征,通过继承可以实现父子关系,以及代码的复用.通过继承实现的类称为子类,被继承的类称为父类,所有直接或间接被继承的类都称为父 ...

最新文章

  1. Hibernate Annotation 学习
  2. python教程书籍推荐-推荐几本对于Python初学者比较好的书籍(内含PDF)
  3. autocad.net中ResultBuffer相关的常量值
  4. ubuntu安装python下载包_Ubuntu安装Python的包管理工具Pip
  5. #3120. 「CTS2019 | CTSC2019」珍珠
  6. 机器视觉:百万像素工业镜头
  7. Github 是如何用 Github 撰写 Github 文档的
  8. 字符串当id用 转换成json对象
  9. 转:imageNamed和dataWithContentsOfFile的区别
  10. html中label中的for属性
  11. teablue数据分析_Bluetea蓝茶的品牌该如何分析,你知道吗
  12. Centos-RedHat 添加路由
  13. 测试用rtmp直播源
  14. Arcgis desktop 9.3的破解方法(转载GIS帝国)
  15. PowerDesigner(数据库建模工具) 使用教程
  16. 新浪微博批量删除功能
  17. 2017.12.5对内网,外网的理解
  18. SDN跟网络虚拟化的完美结合
  19. 谷仓的安保【DFS】
  20. HIVE --- Metastore

热门文章

  1. Cisco产品线一览
  2. 通过docker-compose构建ghost博客(一)
  3. 50个查询系列-第二个查询
  4. [C#学习]多线程编程——多线程基础
  5. 开源应用架构之​Selenium WebDriver讲解
  6. 让Sandcastle为你的类库生成类似于MSDN的帮助文档
  7. 为 Jupyter Notebook指定虚拟环境的 Python 解释器
  8. Vivado不同版本打开IP核锁定的解决办法
  9. 深入剖析微软Office Word主控文档利与弊
  10. 自然语言处理 的 一些环境和包