首页 > 其他分享 >[CF283E] Cow Tennis Tournamsan

[CF283E] Cow Tennis Tournamsan

时间:2023-10-29 14:55:04浏览次数:32  
标签:Cow int Tennis long yy include ql Tournamsan define

CF283E
答案即为 \(\binom{n}{3}\) 减去不合法环数。
一个三元环中最多1个点出度为2,所以出度为 x 的点会造成 \(\binom{x}{2}\) 个不合法的环。
\(\Omicron(nm)\) 的做法就是枚举 i,判断 i 与 n 个点连边是否反向(0,1表示)。
然后可以发现对于一段区间 [l,r] 修改后做贡献的点是一样的,所以区间排序后直接计算即可。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<bitset>
using namespace std;
#define db double
#define ll long long
#define ull unsigned long long
#define ld long double
#define ls p<<1
#define rs p<<1|1
#define mp make_pair
typedef pair<int,int> kk;
const int MAXN=1e5+5;
const int INF=0x3f3f3f3f;
void read(int &x){
	x=0;int f=1;char s=getchar();
	while(s<'0'||s>'9'){
		if(s=='-') f=-1;s=getchar();
	}
	while(s>='0'&&s<='9'){
		x=(x<<3)+(x<<1)+(s^48);s=getchar();
	}
	x*=f;
}
int n,m,a[MAXN],b[MAXN];
vector<kk> v[MAXN],v1[MAXN];
ll Ans;
struct ren{
	int len,va,ta;
}t[MAXN<<2];
void pup(int p){
	t[p].va=t[ls].va+t[rs].va;
}
void pdo(int p){
	if(!t[p].ta) return;
	t[ls].va=t[ls].len-t[ls].va;t[ls].ta^=1;
	t[rs].va=t[rs].len-t[rs].va;t[rs].ta^=1;
	t[p].ta=0;
}
void bui(int p,int l,int r){
	t[p].len=r-l+1;t[p].va=0;
	if(l==r) return;
	int mid=(l+r)>>1;
	bui(ls,l,mid);bui(rs,mid+1,r);
}
void modi(int p,int l,int r,int ql,int qr){
	if(l>=ql&&r<=qr){
		t[p].va=t[p].len-t[p].va;t[p].ta^=1;return;
	}
	pdo(p);
	int mid=(l+r)>>1;
	if(ql<=mid) modi(ls,l,mid,ql,qr);
	if(qr>mid) modi(rs,mid+1,r,ql,qr);
	pup(p);
}
int que(int p,int l,int r,int ql,int qr){
	if(l>=ql&&r<=qr) return t[p].va;
	pdo(p);
	int mid=(l+r)>>1,tmp=0;
	if(ql<=mid) tmp+=que(ls,l,mid,ql,qr);
	if(qr>mid) tmp+=que(rs,mid+1,r,ql,qr);
	return tmp;
}
int main(){
	read(n);read(m);
	for(int i=1;i<=n;i++){
		read(a[i]);
	}
	a[n+1]=INF;
	sort(a+1,a+2+n);
	for(int i=1,x,y;i<=m;i++){
		read(x);read(y);
		if(y<a[1]||x>a[n]) continue;
		int xx=lower_bound(a+1,a+2+n,x)-a;
		int yy=upper_bound(a+1,a+2+n,y)-a-1;
		v[xx].push_back(mp(xx,yy));
		v1[yy+1].push_back(mp(xx,yy));
	}
	bui(1,1,n);
	Ans=1ll*n*(n-1)*(n-2)/6;
	for(int i=1;i<=n;i++){
		for(auto u:v[i]){
			modi(1,1,n,u.first,u.second);
		}
		for(auto u:v1[i]){
			modi(1,1,n,u.first,u.second);
		}
		ll op=0;
		if(i>1) op+=i-1-que(1,1,n,1,i-1);
		if(i<n) op+=que(1,1,n,i+1,n);
		if(op>=2) Ans-=op*(op-1)/2;
	}
	printf("%lld",Ans);
}

标签:Cow,int,Tennis,long,yy,include,ql,Tournamsan,define
From: https://www.cnblogs.com/StranGePants/p/17794266.html

相关文章

  • P3119 [USACO15JAN] Grass Cownoisseur G 题解
    分析大概是强连通分量里面最水的一道紫题,不过细节挺多的,做题的时候给蒟蒻震惊到了。题目要求是从\(1\)走到某个点,然后再走回\(1\)号点,中途可逆行一次,问最多能经过几个点。有一个明显的思路是存两个图,一个正图一个反图,正图是为了求\(1\)到各个点的距离,反图是为了求各个点......
  • USACO 2023 US Open Platinum Triples of Cows
    洛谷传送门LOJ传送门hottea.一次删点操作的影响太大了,考虑添加虚点以减小影响(相同的套路在CF1882E2TwoPermutations(HardVersion)也出现过)。具体而言,我们把第\(i\)条边\((u,v)\)变成\((u,n+i),(v,n+i)\)。称编号\(\len\)的点为黑点,编号\(>n\)的点......
  • Codeforces Round 707 (Div. 2, based on Moscow Open Olympiad in Informatics) B. N
    按以下\(n\)次操作制作蛋糕。叠上第\(i\)块面包,然后浇上\(a_i\)单位的奶油。可以使当前往下\(a_i\)块面包沾上奶油。输出空格隔开的\(n\)个数,第\(i\)个的\(0/1\)代表第\(i\)块面包是否沾有奶油。比较显然的思路可以进行差分修改。view1#include<bits/std......
  • P1522 [USACO2.4] 牛的旅行 Cow Tours
    Problem题目简述给你两个独立的联通块,求:在两个联通块上各找一个点连起来,使得新的联通块的直径的最小值。思路本题主要做法:\(Floyd\)。首先,Floyd求出任意两个点之间的最短路。枚举每一个点,求出以这个点能走到的所有点中距离的最大值。(一定在能走到的情况下,不然默认距离就是......
  • P6066 [USACO05JAN] Watchcow S
    prologue这个题这么水的一个板子题。analysis这个题目我们正反建两条边,在跑欧拉回路的时候,看这个边是不是被走过,走过就不走,跳过这个边。如果没走,就走这条边并且标记这个边走过了。codetime#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#definerlr......
  • 洛谷P3612 [USACO17JAN] Secret Cow Code S
    [USACO17JAN]SecretCowCodeS题面翻译奶牛正在试验秘密代码,并设计了一种方法来创建一个无限长的字符串作为其代码的一部分使用。给定一个字符串,让后面的字符旋转一次(每一次正确的旋转,最后一个字符都会成为新的第一个字符)。也就是说,给定一个初始字符串,之后的每一步都会增加当......
  • 【POJ 3278】Catch That Cow 题解(广度优先搜索)
    农夫约翰已被告知一头逃亡奶牛的位置,并想立即抓住她。他从一条数字线上的N点(0≤N≤100000)开始,奶牛在同一条数字线上的K点(0≥K≤100000)。农夫约翰有两种交通方式:步行和坐车。*步行:FJ可以在一分钟内从任何点X移动到点X-1或X+1*坐车:FJ可以在一分钟内从任何X点移动到2×X点。如果奶......
  • 【POJ 3278】Catch That Cow 题解(深度优先搜索)
    农夫约翰已被告知一头逃亡奶牛的位置,并想立即抓住她。他从一条数字线上的N点(0≤N≤100000)开始,奶牛在同一条数字线上的K点(0≥K≤100000)。农夫约翰有两种交通方式:步行和坐车。*步行:FJ可以在一分钟内从任何点X移动到点X-1或X+1*坐车:FJ可以在一分钟内从任何X点移动到2×X点。如果奶......
  • P6961 [NEERC2017] Journey from Petersburg to Moscow
    P6961感觉很神奇的题。一条路径的代价是前\(k\)大的边的权值和,有个假的做法是每个点维护一个堆,表示走到这个点前\(k\)大边的权值,读者可以思考一下这个做法为什么是假的。既然直接最短路不好处理,自己观察性质,可以发现前\(k\)条边权值和等价于每条边边权变为\(\max(val-va......
  • 【POJ 3275】Ranking the Cows 题解(传递闭包)
    农夫约翰的N头奶牛(1≤N≤1000)产奶率各不相同,FJ希望根据这些比率从最快的奶牛到最慢的奶牛订购奶牛。FJ已经比较了M(1≤M≤10000)对奶牛的产奶率。他想列出另外C对奶牛的列表,这样,如果他现在比较这些C对奶牛,他肯定能够推断出所有N头牛的正确顺序。请帮助他确定C的最小值,这样的列表是可......