传送门

分析

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

不难想出所有情况为$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. hdu-3068-最长回文(manacher算法模板)

    题目链接 /* Name:hdu-3068-最长回文 Copyright: Author: Date: 2018/4/24 16:12:45 Description: manacher算法模板 */ ...

  2. 【SQL查询】查询结果分组_Group

    1. 概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组 示例 2. group by的简单操作 3. Group By中Select指定的字段限制 select指定的 ...

  3. Python ord()与chr()函数

    chr():十进制或十六进制数(0-255)转成对应的ASCII字符. ord():ASCII字符转成对应的十进制数. 一个小性质:ASCII表中大写字母排在前面小写排在后面,相差32. 比如: or ...

  4. git 远程库 创建私钥

    1.创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步.如果没有,打开Shell(W ...

  5. UVA - 10570 Meeting with Aliens (置换的循环节)

    给出一个长度不超过500的环状排列,每次操作可以交换任意两个数,求把这个排列变成有序的环状排列所需的最小操作次数. 首先把环状排列的起点固定使其成为链状排列a,枚举排好序时的状态b(一种有2n种可能) ...

  6. 20181229模拟 T1 palindrome

    20181229模拟 T1 palindrome 题意 : \(S\)是字符串\(s\)的子串可重集,求\(\sum\limits_{x\in S}\sum\limits_{y\in S}(|x|+| ...

  7. LeetCode Base 7

    原题链接在这里:https://leetcode.com/problems/base-7/#/description 题目: Given an integer, return its base 7 s ...

  8. web service的理解

    http://blog.csdn.net/u011075267/article/details/41522643

  9. visualvm-profile以及远程访问

    使用visualvm的Profiler功能,可以提供两方面的性能跟踪功能: Profile 一个是CPU,可以跟踪每个方法占用CPU的时长:比如你在发现CPU持续走高的时候可以通过Profile的CP ...

  10. git公钥生成以及与coding等联合

    更好用的 https://segmentfault.com/a/1190000002645623 其中 $ ssh -T git@github.comgitbub $ ssh -T git@git.c ...