283E&EZOJ #89 Cow Tennis Tournament
分析
我们考虑用所有的情况减去不合法的情况
不难想出所有情况为$C_n^3$
于是我们考虑不合法的情况
我们知道对于一个不合法的三元组$(a,b,c)$一定是修改后$a<b,b>c$
于是我们可以离散化后用线段树维护每个点被覆盖了几次
所以每次对于一个点$i$,比它大的点的个数即为在它前面修改次数为偶数的数量加在它后面修改次数为奇数的数量
而产生的不合法情况即为$C_{sum_i}^2$
我们再统计前后两种情况的时候将修改排序然后分别从后往前和从前往后各跑一次即可
每次只要区间不再覆盖点$i$则统计答案
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
struct node {
long long le,ri;
};
node q[];
long long d[],col[],n,m;
long long a[],sum[];
vector<long long>id;
inline bool cmp1(const node x,const node y){
return x.le==y.le?x.ri<y.ri:x.le<y.le;
}
inline bool cmp2(const node x,const node y){
return x.ri==y.ri?x.le>y.le:x.ri>y.ri;
}
inline void update(long long le,long long ri,long long wh,long long x,long long y){
if(x>y)return;
if(le>=x&&ri<=y){
col[wh]^=;
d[wh]=(ri-le+)-d[wh];
return;
}
long long mid=(le+ri)>>;
if(col[wh]){
col[wh<<]^=;
col[wh<<|]^=;
d[wh<<]=(mid-le+)-d[wh<<];
d[wh<<|]=(ri-mid)-d[wh<<|];
col[wh]=;
}
if(mid>=x)update(le,mid,wh<<,x,y);
if(mid<y)update(mid+,ri,wh<<|,x,y);
d[wh]=d[wh<<]+d[wh<<|];
}
inline long long Q(long long le,long long ri,long long wh,long long x,long long y){
if(x>y)return ;
if(le>=x&&ri<=y)return d[wh];
long long mid=(le+ri)>>,ans=;
if(col[wh]){
col[wh<<]^=;
col[wh<<|]^=;
d[wh<<]=(mid-le+)-d[wh<<];
d[wh<<|]=(ri-mid)-d[wh<<|];
col[wh]=;
}
if(mid>=x)ans+=Q(le,mid,wh<<,x,y);
if(mid<y)ans+=Q(mid+,ri,wh<<|,x,y);
d[wh]=d[wh<<]+d[wh<<|];
return ans;
}
int main(){
long long i,j,k;
scanf("%lld%lld",&n,&m);
for(i=;i<=n;i++)scanf("%lld",&a[i]),id.push_back(a[i]);;
sort(id.begin(),id.end());
id.erase(unique(id.begin(),id.end()),id.end());
for(i=;i<=m;i++)
scanf("%lld%lld",&q[i].le,&q[i].ri);
sort(q+,q+m+,cmp1);
long long Ans=n*(n-)*(n-)/;
j=;
for(i=;i<=m;i++){
for(j;j<=lower_bound(id.begin(),id.end(),q[i].le)-id.begin();j++)
sum[j]+=(n-j)-Q(,n,,j+,n);
update(,n,,lower_bound(id.begin(),id.end(),q[i].le)-id.begin()+,
upper_bound(id.begin(),id.end(),q[i].ri)-id.begin());
}
for(j;j<=n;j++)sum[j]+=(n-j)-Q(,n,,j+,n);
memset(d,,sizeof(d));
memset(col,,sizeof(col));
sort(q+,q+m+,cmp2);
j=n;
for(i=;i<=m;i++){
for(j;j>=upper_bound(id.begin(),id.end(),q[i].ri)-id.begin()+;j--)
sum[j]+=Q(,n,,,j-);
update(,n,,lower_bound(id.begin(),id.end(),q[i].le)-id.begin()+,
upper_bound(id.begin(),id.end(),q[i].ri)-id.begin());
}
for(j;j>;j--)sum[j]+=Q(,n,,,j-);
for(i=;i<=n;i++)Ans-=sum[i]*(sum[i]-)/;
cout<<Ans;
return ;
}
283E&EZOJ #89 Cow Tennis Tournament的更多相关文章
- CodeForces - 283E Cow Tennis Tournament
Discription Farmer John is hosting a tennis tournament with his n cows. Each cow has a skill level s ...
- Codeforces CF#628 Education 8 A. Tennis Tournament
A. Tennis Tournament time limit per test 1 second memory limit per test 256 megabytes input standard ...
- CF 628A --- Tennis Tournament --- 水题
CF 628A 题目大意:给定n,b,p,其中n为进行比赛的人数,b为每场进行比赛的每一位运动员需要的水的数量, p为整个赛程提供给每位运动员的毛巾数量, 每次在剩余的n人数中,挑选2^k=m(m & ...
- Educational Codeforces Round 8 A. Tennis Tournament 暴力
A. Tennis Tournament 题目连接: http://www.codeforces.com/contest/628/problem/A Description A tennis tour ...
- Codeforces Educational Codeforces Round 8 A. Tennis Tournament
大致题意: 网球比赛,n个參赛者,每场比赛每位选手b瓶水+裁判1瓶水,所有比赛每一个參赛者p条毛巾 每一轮比赛有2^k个人參加比赛(k为2^k<=n中k的最大值),下一轮晋级人数是本轮每场比赛的 ...
- Codeforces Round #174 (Div. 1 + Div. 2)
A. Cows and Primitive Roots 暴力. B. Cows and Poker Game 模拟. C. Cows and Sequence 线段树维护. D. Cow Progra ...
- Codeforces Round #382 (Div. 2)C. Tennis Championship 动态规划
C. Tennis Championship 题目链接 http://codeforces.com/contest/735/problem/C 题面 Famous Brazil city Rio de ...
- Codeforces Round #382 (Div. 2) C. Tennis Championship 斐波那契
C. Tennis Championship time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Tennis Championship
Tennis Championship time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
随机推荐
- vs2010 oraclelient 引用问题
不能正常引用 oracleclent :错误信息如下 ================================================================= 排除1. 当前 ...
- C#中的索引器的简单理解和用法
索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了数组和集合成员时,索引器 ...
- hdu-2544-最短路(dijkstra算法模板)
题目链接 题意很清晰,入门级题目,适合各种模板,可用dijkstra, floyd, Bellman-ford, spfa Dijkstra链接 Floyd链接 Bellman-Ford链接 SPFA ...
- 关于/usr/bin/ld: cannot find -lcrypto 的错误
Linux下 build code 时,要做 -lssl, -lcrypto 的链接,出现类似下面的错误: /usr/bin/ld: cannot find -lcrypto /usr/bin/ld: ...
- GDB Core,gdb 调试大全,core文件调试
编译: gcc -g -o hello hello.c gdb 调试: 基本 gdb 命令. 命 令 描 述 小结:常用的gdb命令 backtrace 显示程序中的当前位置和表示如何到达当前位置的栈 ...
- jsp有哪些内置对象?作用分别是什么?
JSP共有以下9种基本内置组件 1.request对象 客户端请求,此请求会包含来自GET/POST请求的参数通过它才能了解到客户的需求,然后做出响应. 2.response对象 响应客户请求的有关信 ...
- Oracl使用总结二
1.ORA-00972: 标识符过长 错误排除 可能原因: 1.如果是拼接成的sql语句,请查找传递参数时字符型字段是否两边少了引号.2.数据库表名太长了,附各种类型的数据库表名长度: SQLSERV ...
- 基于BP神经网络的字符识别研究
基于BP神经网络的字符识别研究 原文作者:Andrew Kirillov. http://www.codeproject.com/KB/cs/neural_network_ocr.aspx 摘要:本文 ...
- CentOS 7.2 PowerShell下安装Azure Module
目前Linux版本的PowerShell还是Alpha版本,所以很多功能不能使用. 比如通过Powershell命令:install-module AzureRM在线安装Azure的Module.但我 ...
- laravel 对于ajax请求返回的数据
ajax在调试器中的位置 XHR 代表 XMlHTTPREQUET 一般ajax请求php的时候我们需要给返回什么数据呢? 一般我都是直接renturn 数组的 其实也没啥问题 但是还是感觉第三种写 ...