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[100100];
long long d[400100],col[400100],n,m;
long long a[100100],sum[100100];
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]^=1;
      d[wh]=(ri-le+1)-d[wh];
      return;
    }
    long long mid=(le+ri)>>1;
    if(col[wh]){
      col[wh<<1]^=1;
      col[wh<<1|1]^=1;
      d[wh<<1]=(mid-le+1)-d[wh<<1];
      d[wh<<1|1]=(ri-mid)-d[wh<<1|1];
      col[wh]=0;
    }
    if(mid>=x)update(le,mid,wh<<1,x,y);
    if(mid<y)update(mid+1,ri,wh<<1|1,x,y);
    d[wh]=d[wh<<1]+d[wh<<1|1];
}
inline long long Q(long long le,long long ri,long long wh,long long x,long long y){
    if(x>y)return  0;
    if(le>=x&&ri<=y)return d[wh];
    long long mid=(le+ri)>>1,ans=0;
    if(col[wh]){
      col[wh<<1]^=1;
      col[wh<<1|1]^=1;
      d[wh<<1]=(mid-le+1)-d[wh<<1];
      d[wh<<1|1]=(ri-mid)-d[wh<<1|1];
      col[wh]=0;
    }
    if(mid>=x)ans+=Q(le,mid,wh<<1,x,y);
    if(mid<y)ans+=Q(mid+1,ri,wh<<1|1,x,y);
    d[wh]=d[wh<<1]+d[wh<<1|1];
    return ans;
}
int main(){
    long long i,j,k;
    scanf("%lld%lld",&n,&m);
    for(i=1;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=1;i<=m;i++)
      scanf("%lld%lld",&q[i].le,&q[i].ri);
    sort(q+1,q+m+1,cmp1);
    long long Ans=n*(n-1)*(n-2)/6;
    j=1;
    for(i=1;i<=m;i++){
      for(j;j<=lower_bound(id.begin(),id.end(),q[i].le)-id.begin();j++)
        sum[j]+=(n-j)-Q(1,n,1,j+1,n);
      update(1,n,1,lower_bound(id.begin(),id.end(),q[i].le)-id.begin()+1,
             upper_bound(id.begin(),id.end(),q[i].ri)-id.begin());
    }
    for(j;j<=n;j++)sum[j]+=(n-j)-Q(1,n,1,j+1,n);
    memset(d,0,sizeof(d));
    memset(col,0,sizeof(col));
    sort(q+1,q+m+1,cmp2);
    j=n;
    for(i=1;i<=m;i++){
      for(j;j>=upper_bound(id.begin(),id.end(),q[i].ri)-id.begin()+1;j--)
        sum[j]+=Q(1,n,1,1,j-1);
      update(1,n,1,lower_bound(id.begin(),id.end(),q[i].le)-id.begin()+1,
             upper_bound(id.begin(),id.end(),q[i].ri)-id.begin());
    }
    for(j;j>0;j--)sum[j]+=Q(1,n,1,1,j-1);
    for(i=1;i<=n;i++)Ans-=sum[i]*(sum[i]-1)/2;
    cout<<Ans;
    return 0;
}

原文地址:https://www.cnblogs.com/yzxverygood/p/9906005.html

时间: 2024-11-05 16:34:57

283E&EZOJ #89 Cow Tennis Tournament的相关文章

Codeforces 283E Cow Tennis Tournament 线段树 (看题解)

Cow Tennis Tournament 感觉这题的难点在于想到求违反条件的三元组.. 为什么在自己想的时候没有想到求反面呢!!!! 违反的三元组肯定存在一个人能打败其他两个人, 扫描的过程中用线段树维护一下就好了. 反思: 计数问题: 正难则反 正难则反 正难则反 !!!! #include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long #define fi

CodeForces - 283E Cow Tennis Tournament

Discription Farmer John is hosting a tennis tournament with his n cows. Each cow has a skill level si, and no two cows having the same skill level. Every cow plays every other cow exactly once in the tournament, and each cow beats every cow with skil

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

CF 628A 题目大意:给定n,b,p,其中n为进行比赛的人数,b为每场进行比赛的每一位运动员需要的水的数量, p为整个赛程提供给每位运动员的毛巾数量, 每次在剩余的n人数中,挑选2^k=m(m <=n)个人进行比赛,剩余的n-m个人直接晋级, 直至只剩一人为止,问总共需要的水的数量和毛巾的数量 解题思路:毛巾数很简单: n*p即可 水的数量:1,2,4,8,16,32,64,128,256,512,提前打成一个表, 根据当前剩余的人数n在表中二分查找最大的小于等于n的数,结果即为本次进行比赛

千穗谷大家空心砖接着看见数据库恢复

pinterest.com/youzhenqu/%E6%BF%89%E6%BA%AA%E5%8E%BF%E5%93%AA%E9%87%8C%E6%9C%89%E6%89%BE%E5%B0%8F%E5%A7%90%E6%9C%8D%E5%8A%A1%E7%94%B5%E8%AF%9D%E4%BF%A1%E6%81%AF pinterest.com/youzhenqu/%E7%95%8C%E9%A6%96%E6%89%BE%E5%B0%8F%E5%A7%90%E4%B8%8A%E9%97%A8%E5

7. 及时发布。除非真正的用户接触到你的产品并给予反馈

7. 及时发布.除非真正的用户接触到你的产品并给予反馈,你永远都不会知道你的产品是好是坏. 8. 尽快发布,经常发布.不要惦记着再增加一些其它功能.只要能达到可以用来收集用户反馈的最小功能集合,那就发布它.收集反馈信息,反复这个过程,发布下一 个版本.下一个版本,越快越好.如果你3个月才发布出第一版面向用户的产品,你拖延的太久了.如果3个星期才发布一次更新包,你拖延的太久了.如果不能一 周几次,那每周发布一次更新.每3周发布一次重大更新. 9. 唯一有意义的事是你的产品的好坏.其它的都是鸡毛蒜皮

否极泰来接电话高科技电话施

http://www.yhd.com/ctg/s2/c19606-0-60977/%E8%BF%9E%E4%BA%91%E6%B8%AF%E6%B5%B7%E5%B7%9E%E5%8C%BA%E5%93%AA%E9%87%8C%E6%9C%89%E6%89%BE%E5%AD%A6%E7%94%9F%E5%A6%B9%E6%89%93%E7%82%AE%E4%B8%8A%E9%97%A8%E6%9C%8D%E5%8A%A1%E5%8C%85%E5%A4%9C%E7%94%B5%E8%AF%9D%2

Catch That Cow(广搜)

个人心得:其实有关搜素或者地图啥的都可以用广搜,但要注意标志物不然会变得很复杂,想这题,忘记了标志,结果内存超时: 将每个动作扔入队列,但要注意如何更简便,更节省时间,空间 Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and t

ural 1218. Episode N-th: The Jedi Tournament

1218. Episode N-th: The Jedi Tournament Time limit: 1.0 secondMemory limit: 64 MB Decided several Jedi Knights to organize a tournament once. To know, accumulates who the largest amount of Force. Brought each Jedi his lightsaber with him to the tourn

[BZOJ] 1631: [Usaco2007 Feb]Cow Party

1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 866  Solved: 624[Submit][Status][Discuss] Description 农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共有M(1≤M≤100000)条单向路连接着牛棚,第i条踣需要Ti的时间来通过.牛们都很懒,所以不管是前去X牛棚参加派对还是返回住所,她们都采用了用时最