可以把每头牛看作一个位置,有几对牛可以放置相当于有几对位置可以给它睡觉,没有牛可以在其他牛的位置睡觉,所以有几对牛放置的可能答案就乘多少(相当于在原本的两个集合里分别插入一个元素,元素代表它睡觉的位置)

容斥的时候,第二遍会把当前位置i+1这个点没有牛在睡觉的情况全部去掉,尝试写了不容斥,直接计算当前枚举位置i一定有牛睡觉的方法,发现巨麻烦无比,遂放弃55555

 #define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
int a[];
vector<int>v[];
int l[],r[];
const long long mod =1e9+;
int n,m;
int binary_search_(int color,int num){
int point=upper_bound(v[color].begin(),v[color].end(),num)-v[color].begin();
return point;
}
pair<int,long long> solve(){
long long sum=;
int ans=;
for(int i=;i<=n;++i){//枚举草的颜色
int x=binary_search_(i,l[i]);//有x头牛可以放在左边
int y=binary_search_(i,r[i]);//有y有牛可以放在右边
if(x*y-min(x,y)>){//两边都可以有牛放置
ans+=;
sum=(sum*(x*y-min(x,y)))%mod;//每头牛停止的位置是唯一的(数据保证不存在喜爱相同颜色且数量也相同的牛)
//有几对喜爱吃颜色i草的牛,答案就乘多少,可以把每头牛看作一个位置,有几对牛可以放置相当于有几对位置可以给它睡觉,没有牛可以在其他牛的位置睡觉,所以有几对牛放置的可能答案就乘多少(相当于在原本的两个集合里分别插入一个元素,元素代表它睡觉的位置)
}
else if(x||y){//只有一边可以有牛放置或者两边只能放置同一头牛
++ans;
sum=(sum*(x+y))%mod;//两种情况对答案产生的影响都是x+y,前者x或y有一个是0,后者x和y都是1
}
}
return make_pair(ans,sum);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>m;
for(int i=;i<=n;++i){
cin>>a[i];
++r[a[i]];//[i,n]区间里a[i]出现的次数
}
for(int i=;i<=m;++i){
int x,y;
cin>>x>>y;
v[x].emplace_back(y);
}
for(int i=;i<=n;++i)
sort(v[i].begin(),v[i].end());
int ans=;
long long num=;
for(int i=;i<=n;++i){//以i+0.5为分界点
--r[a[i]];//分界点以右a[i]出现次数-1(a[i]被划到了左边)
++l[a[i]];//分界点以左a[i]出现次数+1(a[i]被划到了左边)
pair<int,long long>pr=solve();
if(pr.first>ans){
ans=pr.first;
num=pr.second;
}
else if(pr.first==ans)
num=(num+pr.second)%mod;
}
for(int i=;i<=n;++i){
l[a[i]]=;//初始化
++r[a[i]];//回归枚举分界线以前的状态
}
/*举一个重复计算的例子
8 2
1 1 1 1 2 2 2 2
1 2
2 2
答案应输出2 3
不容斥的话会输出2 11
因为当一次枚举分界点的时候i=2~7,牛的最多头数都是2,可是排列方式总数全都加到了sum中
通过容斥可以在第二次枚举分界点的时候i=2~6把多余的方案数去掉
容斥去掉的是实际上被重复计算的那些,可能有多个区间计算了同样的方案,相同方案只计算一次,不同方案还是都应该计入贡献
容斥去掉第i个位置没有牛的情况,这样可以保证所有计算在内的情况必定有牛要在[0,n]枚举区间i位置时睡觉
*/
for(int i=;i<n;++i){//第一次枚举分界点的时候计算了很多重复情况,需要用容斥将它挤掉
//新的分界左边区间是[0,i],右边区间是[i+2,n]
--r[a[i+]];
++l[a[i]];
pair<int,long long>pr=solve();
if(pr.first==ans)
num=(mod+num-pr.second)%mod;//去掉重复计算的次数
}
cout<<ans<<" "<<num;
return ;
}

Codeforces Round #621 (Div. 1 + Div. 2)E(二分查找,枚举分界点,容斥原理)的更多相关文章

  1. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  2. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

  3. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

  4. Educational Codeforces Round 35 (Rated for Div. 2)

    Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...

  5. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

  6. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...

  7. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

  8. Educational Codeforces Round 39 (Rated for Div. 2) G

    Educational Codeforces Round 39 (Rated for Div. 2) G 题意: 给一个序列\(a_i(1 <= a_i <= 10^{9}),2 < ...

  9. Educational Codeforces Round 48 (Rated for Div. 2) CD题解

    Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...

  10. Educational Codeforces Round 60 (Rated for Div. 2) 题解

    Educational Codeforces Round 60 (Rated for Div. 2) 题目链接:https://codeforces.com/contest/1117 A. Best ...

随机推荐

  1. 安全师(网络安全类pdf电子书籍)

    2020-02-17  天气晴,西安. 今天找到一个可以下载网络安全(渗透,kali,web)电子书籍网站. https://www.secshi.com/

  2. 使用SignalR从服务端主动推送警报日志到各种终端(桌面、移动、网页)

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 使用SignalR从服务端主动推送警报日志到各种终端(桌面.移动.网页) 阅读导航 本文背景 ...

  3. 初始socket编程

    服务端语法 import socket # 导入套接字模块# 生成一个socket对象进行网络编程操作server = socket.socket(family=socket.AF_INET, typ ...

  4. js有关字符串拼接问题

    我们经常写代码要遇见要拼接字符串,比如说我们要把     "yyy" 和一个动态数字拼接,接下来我们怎么办? 其实我们都会想到直接用“yyy”  + 一个数字不就可以了吗? 对的, ...

  5. HTML5文档类型如何定义,有哪些标签,以及如何使用,从整体认识HTML5

    html5新增结构标签 header 头部 nav 导航 section 区域 article 文章 aside 侧边栏 figure 一组多媒体内容 figcaption 多媒体内容的标题 foot ...

  6. 剑指offer-面试题49-丑数-空间换时间

    /* 题目: 求从1开始的第n个丑数. */ /* 思路: 按顺序列出各个丑数. */ #include<iostream> #include<cstring> #includ ...

  7. webpack4从安装到使用入过的那些坑

    1.全局安装 安装 webpack 前要确保已经下载 node.js 最新版本(node.js官网地址) 目前使用命令行安装的 webpack 默认为最新版本(以下我使用了全局安装.官网建议本地安装, ...

  8. Android 开发调试最优选项

    1 开发环境 VS2019 16.4.5 2 开发调试选项 Android 选项

  9. [PAT] A1022 Digital Library

    [题目大意] 给出几本书的信息,包括编号,名字,出版社,作者,出版年份,关键字:然后给出几个请求,分别按照1->名字,2->出版社等对应信息查询符合要求的书的编号. [思路] 模拟. [坑 ...

  10. php 字符串常用函数

    数组.字符串和数据库是我们函数里面最.最.最常用的三类函数. 当然PHP的字符串函数也有很多.我们最常使用的两个系列的字符串: 1.单字节字符串处理函数 2.多字节字符串处理函数 3.字符串编码转换函 ...