首页 > 其他分享 >ZROJ369 Tiny Counting - 容斥 - 树状数组 -

ZROJ369 Tiny Counting - 容斥 - 树状数组 -

时间:2023-01-19 00:44:42浏览次数:54  
标签:树状 int tr 容斥 long add ZROJ369 Tiny rightarrow

题目链接:http://zhengruioi.com/contest/101/problem/369

题解:
枚举 \(i\) ,表示 钦定了 \(b\) 或者 \(d\) 位于 \(i\) 处
不妨设是 \(b\) 位于 \(i\) 处,\(d\) 同理
\(a\) 位于 \(1..b-1\),而且 \((a,b)\) 是逆序对,\(c,d\) 就是位于 \(1..b\) 的任意顺序对,这利用树状数组就能简单维护
但是这有很多不合法的情况:

  • \(a=c \rightarrow S_a<S_b 且 S_a>S_d\)
  • \(b=d \rightarrow S_a<S_b 且 S_c>S_b\)(注意这个要乘以 2 因为对于 \(b\) 和 \(d\) 分别算了两次)
  • \(a=d \rightarrow S_a<S_b 且 S_c>S_a\)
  • \(b=c \rightarrow S_a<S_b 且 S_b>S_d\)

容斥减去即可,这四种都可以用树状数组解决

// by SkyRainWind
#include <bits/stdc++.h>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define pii pair<int,int>

using namespace std;

typedef long long ll;
typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f, maxn = 1e5+5;

int n;
int a[maxn];
map<int,int>mp,trans;

struct fen{
	int a[maxn];
	int N = -1;
	void init(int up){
		N = up;
	}
	
	int lb(int x){return x & (-x);}
	void add(int x,int del){	// init N!!!
		assert(N != -1);
		for(int i=x;i<=N;i+=lb(i)){
			a[i] += del;
		}
	}
	
	int query(int x){
		int res = 0;
		for(int i=x;i;i-=lb(i))res += a[i];
		return res;
	}
	int query(int l,int r){
		return query(r) - query(l-1);
	}
}rev,sev,nrev,nsev;
int gr[maxn], le[maxn];

signed main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]), mp[a[i]] = 1;
	int cnt = 0;
	for(auto it : mp)trans[it.first] = ++ cnt;
	for(int i=1;i<=n;i++)a[i] = trans[a[i]];
	
	rev.init(cnt); sev.init(cnt);
	nrev.init(cnt); nsev.init(cnt);
	rev.add(cnt - a[1] + 1, 1);sev.add(a[1], 1);
	ll revcnt=0, sevcnt=0, ans = 0;
	ll del1 = 0;
	for(int i=2;i<=n;i++){
		int tr = rev.query(cnt - a[i] + 1 - 1), sr = sev.query(a[i] - 1); 
		revcnt += tr;sevcnt += sr;
		ans += 1ll * tr * sevcnt;
		ans += 1ll * sr * revcnt;
		rev.add(cnt - a[i] + 1, 1);sev.add(a[i], 1);
		del1 += 2ll*tr*sr;	// #2 
		gr[i] = tr, le[i] = sr;
	}
	
	nrev.add(cnt - a[n] + 1, 1); nsev.add(a[n], 1);
	ll del2 = 0;
	for(int i=n-1;i>=1;i--){
		int tr = nrev.query(cnt - a[i] + 1 - 1), sr = nsev.query(a[i] - 1);
		del2 += 1ll*gr[i]*tr + 1ll*le[i]*sr + 1ll*tr*sr;  // #3  #4  #1
		nrev.add(cnt - a[i] + 1, 1); nsev.add(a[i], 1);
	}
	cout<<ans - del1 - del2;

	return 0;
}

标签:树状,int,tr,容斥,long,add,ZROJ369,Tiny,rightarrow
From: https://www.cnblogs.com/SkyRainWind/p/17060952.html

相关文章

  • TinyWebserver项目简述
    webserver总结前言:最近做毕设刚好看了这个项目,所以做了一个总结,同时也希望可以帮到其他人。如果本文中有一些概念看不懂,比如说epoll之类的概念,可以自行百度,对这些概念的......
  • 容斥原理
    概述容斥原理是正难则反思想的实践产物。(23.1.15upd:存疑)即,在正向求解问题过于困难时,考虑逆向求出不合法方案数,然后用总方案数减去以得到合法方案数。大体上,可以......
  • tinyxml.dll dll劫持下载器
    目录基本信息pdb信息dllmain流程创建服务检查到360和卡巴斯基进程未检测到通过sRDI(原dllTools.dll)调用CreateHollowedProcess第二次通过sRDI执行http下载工作,代码与tinyx......
  • 【luogu CF1707D】Partial Virtual Trees(容斥)(DP)
    PartialVirtualTrees题目链接:luoguCF1707D题目大意给你一棵以1为根的数,问你对于每个长度,有多少个点集序列,第一个点集是全部点,最后一个点集只有1号点,且中间每个点......
  • angular的编辑器tinymce
    angular的插件的确挺少的,编辑器更是少,ui-tinymce是angular-ui推荐的一款编辑器​​(GIT:https://github.com/angular-ui/ui-tinymce)​​;效果图通过n......
  • tinyproxy简单应用(linux设置网络代理、中转)
    1、安装yuminstalltinyproxy-y 2、修改配置文件修改代理ip和端口vim/etc/tinyproxy/tinyproxy.conf 3、服务管理systemctlstarttinyproxysystemc......
  • tinymce---加载慢或者加载不出来的解决办法
    最近在用vue开发项目,使用Tinymce作为富文本编辑器,最开始用的时候,还是不错的。但是用了一年发现一个问题,就是这个编辑器加载的太慢了,有时候网速慢一点,可能就直接加载不出来......
  • 亲测有效! Scrutiny 网站SEO检测及优化工具 V12.6.1 for mac
    亲测有效!Scrutiny网站SEO检测及优化工具 V12.6.1formacScrutiny是一款网站SEO工具,它能够自动检测目标网站的坏链、HTML验证、描述Description、标题Title等SEO信息,......
  • 使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss
    前言什么是RSS?RSS是一种描述和同步网站内容的格式,是使用最广泛的XML应用。RSS搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者。发布一个RSS......
  • 使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss
    前言什么是RSS?RSS是一种描述和同步网站内容的格式,是使用最广泛的XML应用。RSS搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者。发布一个RSS......