传送门

分析

我们考虑用所有的情况减去不合法的情况

不难想出所有情况为$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的更多相关文章

  1. CodeForces - 283E Cow Tennis Tournament

    Discription Farmer John is hosting a tennis tournament with his n cows. Each cow has a skill level s ...

  2. 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 ...

  3. CF 628A --- Tennis Tournament --- 水题

    CF 628A 题目大意:给定n,b,p,其中n为进行比赛的人数,b为每场进行比赛的每一位运动员需要的水的数量, p为整个赛程提供给每位运动员的毛巾数量, 每次在剩余的n人数中,挑选2^k=m(m & ...

  4. Educational Codeforces Round 8 A. Tennis Tournament 暴力

    A. Tennis Tournament 题目连接: http://www.codeforces.com/contest/628/problem/A Description A tennis tour ...

  5. Codeforces Educational Codeforces Round 8 A. Tennis Tournament

    大致题意: 网球比赛,n个參赛者,每场比赛每位选手b瓶水+裁判1瓶水,所有比赛每一个參赛者p条毛巾 每一轮比赛有2^k个人參加比赛(k为2^k<=n中k的最大值),下一轮晋级人数是本轮每场比赛的 ...

  6. Codeforces Round #174 (Div. 1 + Div. 2)

    A. Cows and Primitive Roots 暴力. B. Cows and Poker Game 模拟. C. Cows and Sequence 线段树维护. D. Cow Progra ...

  7. Codeforces Round #382 (Div. 2)C. Tennis Championship 动态规划

    C. Tennis Championship 题目链接 http://codeforces.com/contest/735/problem/C 题面 Famous Brazil city Rio de ...

  8. 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 ...

  9. Tennis Championship

    Tennis Championship time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

随机推荐

  1. Hibernate(1)

    一.什么是hibernate 1. hibernate是开源的轻量级框架,应用在javaee三层结构中 dao层框架,使用orm思想对数据库进行crud操作 2 .在dao层里面做对数据库crud操作 ...

  2. java学习笔记 --- 多线程(多线程的创建方式)

    1.创建多线程方式1——继承Thread类. 步骤:  A:自定义类MyThread继承Thread类.  B:MyThread类里面重写run()? 为什么是run()方法呢? C:创建对象 D:启 ...

  3. Codeforces Round #266 (Div. 2)B(暴力枚举)

    很简单的暴力枚举,却卡了我那么长时间,可见我的基本功不够扎实. 两个数相乘等于一个数6*n,那么我枚举其中一个乘数就行了,而且枚举到sqrt(6*n)就行了,这个是暴力法解题中很常用的性质. 这道题找 ...

  4. bzoj 3681 Arietta

    一棵有根树,每个点有一个音高,有 $m$ 中弹奏方法,每种方法可以弹奏 $d$ 子树中音高在 $[l,r]$ 间的音符,每种方法最多弹 $t$ 次 求最多能弹出多少个音符 $n \leq 10000$ ...

  5. 使用 MLCC 替代电解电容需要注意几点 (2018-07-23)

    使用 MLCC 替代电解电容需要注意几点 容量,MLCC 在高压时容量会降到标称的 30~50% 以下 1. MLCC 的 ESR 很低,比较适合高频 DCDC 输出. MLCC 会有压电效应,可能会 ...

  6. java编程思想第八章多态

    前言: 封装:通过合并特征和行为创建新的数据类型. 实现隐藏:通过将细节“私有化”,把接口和实现分离. 多态:消除类型间的耦合关系.也称作动态绑定,后期绑定或运行时绑定. 8.1再论向上转型: 对象既 ...

  7. echo 的部分用法

    echo “内容” > 文件名 (会覆盖文件里的所有内容) echo “内容” >> 文件名 (追加内容到文件里,会另起一行写入) 如果您阅读过此文章有所收获,请为我顶一个,如果文章 ...

  8. POJ1274(二分图最大匹配)

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23356   Accepted: 104 ...

  9. QString 乱谈(1)

    一个月前尝试写了一篇关于QStringLiteral,存盘时MoinMoin罢工了.吸取一点经验,还是写成短篇吧 可是,可是,QString不就是简简单单一个字符串么?能有什么可谈的.真的么... ( ...

  10. 2015 浙江省赛 H - May Day Holiday

    H - May Day Holiday As a university advocating self-learning and work-rest balance, Marjar Universit ...