考虑某两行a和b的dis

如果相同:$|a-b|$

如果不同:$n-|a-b|$

然后考虑三行的dis,不妨设a>=b>=c

那么有4种情况:

1.a,b,c 0/1的种类相同:$|a-b|+|a-c|+|b-c|=2a-2c$

2.a和b相同:$2n+2c-2b$

3.a和c相同:$2n$

4.b和c相同:$2n+2b-2a$

所以我们排序后枚举这个b,预处理出前缀和后缀的是0/1的最大值个数、最小值个数以及总共的个数,加一加乘一乘统计答案即可

注意如果记权值的时候用int,那要先减再加,防爆

 #include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pa;
const int maxn=1e5+,inf=1e9+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Node{
int v;ll n;
Node(int a=,ll b=){v=a,n=b;}
}f[][maxn][],g[][maxn][],ans;
int N,M;
pa a[maxn]; inline void update(int v1,ll n1){
// printf("~%d %d\n",v1,n1);
if(!n1) return;
if(v1>ans.v) ans=Node(v1,n1);
else if(v1==ans.v) ans=Node(v1,n1+ans.n);
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),M=rd();
for(i=;i<=M;i++){
a[i].second=rd(),a[i].first=rd();
}sort(a+,a+M+);
f[][][].v=f[][][].v=g[][M+][].v=g[][M+][].v=inf;
for(i=;i<=M;i++){
int tp=a[i].second,x=a[i].first;
memcpy(f[!tp][i],f[!tp][i-],sizeof(f[][]));
if(x>f[tp][i-][].v) f[tp][i][]=Node(x,);
else if(x==f[tp][i-][].v) f[tp][i][]=Node(x,f[tp][i-][].n+);
else f[tp][i][]=f[tp][i-][]; if(x<f[tp][i-][].v) f[tp][i][]=Node(x,);
else if(x==f[tp][i-][].v) f[tp][i][]=Node(x,f[tp][i-][].n+);
else f[tp][i][]=f[tp][i-][]; f[tp][i][].n=f[tp][i-][].n+;
}
for(i=M;i;i--){
int tp=a[i].second,x=a[i].first;
memcpy(g[!tp][i],g[!tp][i+],sizeof(g[][]));
if(x>g[tp][i+][].v) g[tp][i][]=Node(x,);
else if(x==g[tp][i+][].v) g[tp][i][]=Node(x,g[tp][i+][].n+);
else g[tp][i][]=g[tp][i+][]; if(x<g[tp][i+][].v) g[tp][i][]=Node(x,);
else if(x==g[tp][i+][].v) g[tp][i][]=Node(x,g[tp][i+][].n+);
else g[tp][i][]=g[tp][i+][]; g[tp][i][].n=g[tp][i+][].n+;
} for(i=;i<=M-;i++){
int tp=a[i].second,x=a[i].first;
int v1=*g[tp][i+][].v-*f[tp][i-][].v;ll n1=g[tp][i+][].n*f[tp][i-][].n;
update(v1,n1); v1=*N-*x+*f[!tp][i-][].v,n1=f[!tp][i-][].n*g[tp][i+][].n;
update(v1,n1); v1=*N,n1=f[!tp][i-][].n*g[!tp][i+][].n;
update(v1,n1); v1=*N-*g[!tp][i+][].v+*x,n1=f[tp][i-][].n*g[!tp][i+][].n;
update(v1,n1);
}
printf("%I64d\n",ans.n);
return ;
}

cf406E Hamming Triples (推公式)的更多相关文章

  1. HDU 4873 ZCC Loves Intersection(JAVA、大数、推公式)

    在一个D维空间,只有整点,点的每个维度的值是0~n-1 .现每秒生成D条线段,第i条线段与第i维度的轴平行.问D条线段的相交期望. 生成线段[a1,a2]的方法(假设该线段为第i条,即与第i维度的轴平 ...

  2. HDU 4870 Rating(概率、期望、推公式) && ZOJ 3415 Zhou Yu

    其实zoj 3415不是应该叫Yu Zhou吗...碰到ZOJ 3415之后用了第二个参考网址的方法去求通项,然后这次碰到4870不会搞.参考了chanme的,然后重新把周瑜跟排名都反复推导(不是推倒 ...

  3. HDU 5047 推公式+别样输出

    题意:给n个‘M'形,问最多能把平面分成多少区域 解法:推公式 : f(n) = 4n(4n+1)/2 - 9n + 1 = (8n+1)(n-1)+2 前面部分有可能超long long,所以要转化 ...

  4. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  5. bjfu1211 推公式,筛素数

    题目是求fun(n)的值 fun(n)= Gcd(3)+Gcd(4)+…+Gcd(i)+…+Gcd(n).Gcd(n)=gcd(C[n][1],C[n][2],……,C[n][n-1])C[n][k] ...

  6. sgu495:概率dp / 推公式

    概率题..可以dp也可以推公式 抽象出来的题目大意: 有 n个小球,有放回的取m次  问 被取出来过的小球的个数的期望 dp维护两个状态 第 i 次取出的是 没有被取出来过的小球的 概率dp[i] 和 ...

  7. ASC(22)H(大数+推公式)

    High Speed Trains Time Limit: 4000/2000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Su ...

  8. hdu_5810_Balls and Boxes(打表推公式)

    题目链接:hdu_5810_Balls and Boxes 题意: 如题,让你求那个公式的期望 题解: 打表找规律,然后推公式.这项技能必须得学会 #include<cstdio> #in ...

  9. hdu4507 数位dp+推公式

    推公式的能力需要锻炼.. /* dp的时候要存结构体 里面三个元素: cnt,就是满足条件的个数 sum1,就是满足条件的数字和 sum2,满足条件的数字平方和 推导过程:还是用记忆化搜索模板 dp[ ...

随机推荐

  1. 百度地图api在Html中显示,在jsp页面中不显示解决方法

    在jsp页面中显示如下 但是在html中正常显示. 原来的代码如下: <script type="text/javascript" src="http://api. ...

  2. 六、es6 map

    一.map的特点 JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键.这给它的使用带来了很大的限制. 为了解决这个问题,ES6 提供了 ...

  3. 解读event.returnValue和return false

    前言 首先我们要清楚returnValue是IE的一个属性,如果设置了该属性,它的值比事件句柄的返回值优先级要高,把它的值设置为false,可以取消发生事件源元素的默认动作:return false就 ...

  4. maven中jar下载失败

    关键词:maven jar 错误描述:反编译时遇到 invalid LOC header (bad signature)的问题 aether-89969cb8-5741-44e3-be2c-74f90 ...

  5. restful 规范(建议)

    需求:开发cmdb,对用户进行管理. 做前后端分离,后端写api(URL),对用户表进行增删改查,应该写四个URL(还要给文档(返回值,返回,请求成功,干嘛,失败,干嘛)),然后分别写视图函数. ht ...

  6. 如何使用apache自带的ab压力测试工具

    ab是apache自带的一个很好用的压力测试工具,当安装完apache的时候,就可以在bin下面找到ab 1 我们可以模拟100个并发用户,对一个页面发送1000个请求 ./ab -n1000 -c1 ...

  7. checkbox选中事件的正确写法

    判断选中CHECKBOX事件  网上各种扯淡 搞死我了..加上总觉得smarty引擎和JSJQ有很多冲突.. $("#id").is(":checked");

  8. 集合之LinkedList(含JDK1.8源码分析)

    一.前言 LinkedList是基于链表实现的,所以先讲解一下什么是链表.链表原先是C/C++的概念,是一种线性的存储结构,意思是将要存储的数据存在一个存储单元里面,这个存储单元里面除了存放有待存储的 ...

  9. Python2基础

    1.python 3.python函数 python的函数定义: 以def关键字定义一个函数: 参数放在小括号里面: 必须有return语句: 关键字参数: 即调用函数时传参顺序可以人为指定 默认参数 ...

  10. debug方法

    debug as -> spring boot->开始了 可以添加 ,, 来进行向下步骤:使用其他方法(在方法内打点) 一步步F6就可以了