https://www.nowcoder.com/acm/contest/143/I

vc-dimension

题解:分三种情况,组合数学算一下,其中一种要用树状数组维护

技巧(来自UESTC):1.循环技巧i主j滑

2.树状数组:一个数列从左到右分别维护某个元素左边比它大num的与右边比他大的num时,从上往下扫, 对每个点的x坐标离散化累加1到X轴上,然后就会发现sum(p[i].x-1)就是左边比它大的,i-1-sum(p[i])就是右边比它大的。 注意y相同的点,需要一起更新(我已开始一个一个更新,根本写不出来)

orz太屌了

坑点:我循环写错了+公式里i,j写反了,wa了20发

比赛时x,y轴都看反了orz

#define _CRT_SECURE_NO_WARNINGS
#include<cmath>
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<stack>
#include<vector>
#include<string.h>
#include<queue>
#include<string>
#include<set>
using namespace std;
#define rep(i,t,n) for(int i =(t);i<=(n);++i)
#define per(i,n,t) for(int i =(n);i>=(t);--i)
#define mmm(a,b) memset(a,b,sizeof(a))
#define eps 1e-6
#define pb push_back
#define lowbit(x) ((x)&(-(x)))
const int maxn = 3e5 + ;
const int inf = 1e7 + ;//0x7fffffff; //无限大
const int MOD = ;
typedef long long ll;
const int mod = ;
int power(int a, int b) {
int c = ; a %= mod;
while (b) {
if (b & ) c = 1ll * c*a%mod;
a = 1ll * a*a%mod; b >>= ;
}
return c;
} struct node {
int x, y;
void sc() { scanf("%d%d", &x, &y); }
}p[maxn]; int n;
bool cmp(node a, node b) {
return a.x > b.x;
} bool cmpy(node a, node b) {
return a.y < b.y;
} int f[maxn];
int idx;
void add(int x, int y) { for (; x <= idx; x += lowbit(x)) f[x] += y; }
int sum(int x) { int ans = ; for (; x; x -= lowbit(x)) ans += f[x]; return ans; } int main() {
int div2 = power(, mod - );
cin >> n;
rep(i, , n) {
p[i].sc();
}
int ans = n;
ans += 1ll*n * (n - )%mod*div2 % mod;
if (ans >= mod)ans -= mod; else if (ans < )ans += mod;
sort(p + , p + + n, cmpy);
idx = ;
for (int i = , j; i <= n; i = j + ) {
for (j = i ; j < n&&p[i].y == p[j+].y; j++);
++idx;
rep(k, i, j)p[k].y = idx;
ans -=1ll* (j - i)*(j - i + )%mod*div2%mod;
if (ans >= mod)ans -= mod; else if (ans < )ans += mod;
}
mmm(f, );
sort(p + , p + + n, cmp);
for (int i = , j; i <= n; i = j + ) {
for (j = i ; j < n&&p[i].x == p[j+].x; j++);
rep(k, i, j) {
int t1 = sum(p[k].y - ); int t2 = i - - sum(p[k].y);
ans += 1ll * t1*t2%mod;
if (ans >= mod)ans -= mod; else if (ans < )ans += mod;
}
rep(k, i, j)add(p[k].y, );
}
cout << ans << endl;
cin >> n;
return ;
} /* */

一开始无脑分别前后维护

#define _CRT_SECURE_NO_WARNINGS
#include<cmath>
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<stack>
#include<vector>
#include<string.h>
#include<queue>
#include<string>
#include<set>
using namespace std;
#define rep(i,t,n) for(int i =(t);i<=(n);++i)
#define per(i,n,t) for(int i =(n);i>=(t);--i)
#define mmm(a,b) memset(a,b,sizeof(a))
#define eps 1e-6
#define pb push_back
const int maxn = 1e5 + ;
const int inf = 1e7 + ;//0x7fffffff; //无限大
const int MOD = ;
typedef long long ll;
const long long mod = ;
int power(int a,int b){
int c=; a%=mod;
while (b) {
if (b&) c=1ll*c*a%mod;
a=1ll*a*a%mod; b>>=;
}
return c;
} ll div2 = power(, mod - );
struct node {
int x, y;
int id;
void sc() { scanf("%d%d", &x, &y); }
}P[maxn]; ll n;
bool cmp(node a, node b) {
if (a.x != b.x)
return a.x < b.x;
else return a.y < b.y;
}
bool cmpx(node a, node b) {
if (a.x != b.x)
return a.x > b.x;
else return a.y < b.y;
} bool cmpy(node a, node b) {
return a.y < b.y;
}
int cnt[maxn];
ll l[maxn], r[maxn];
int d[maxn];
int lowbit(int x) { return x & (-x); }
int fr[maxn], bk[maxn];
void add(int x, int v) {//a[x]+=v;
while (x <= maxn) {
d[x] += v;
x += lowbit(x);
} }
int query(int x) {
int res = ;
while (x) {
res += d[x];
x -= lowbit(x);
}
return res;
} int main() {
cin >> n;
rep(i, , n) {
P[i].sc();
P[i].id = i;
}
sort(P + , P + n + , cmp); int idx = ;
int now = ;
rep(i, , n) {
if (P[i].x != now) {
cnt[++idx]++;
now = P[i].x;
}
else {
cnt[idx]++;
}
}
ll ans = n;
ll tmp = n * (n - ) %mod*div2;
rep(i, , idx)if (cnt[i] > ) { tmp = (tmp - cnt[i] * (cnt[i] - ) % mod *div2) % mod; }
ans = (ans + tmp) % mod;
//维护每个点左右比它高的点
sort(P + , P + n + , cmpy);
idx = ;
now = ;
rep(i, , n) {
if (P[i].y != now) {
P[i].y = ++idx;
now = P[i].y;
}
else {
P[i].y = idx;
}
}
sort(P + , P + n + , cmp);
now = ;
rep(i, , n)
{
if (P[i].x != P[i - ].x)fr[i] =now= i - ;
else fr[i] = now;
}
now = ;
per(i, n, )
{
if (P[i].x != P[i + ].x)bk[i] = now = i + ;
else bk[i] = now;
}
rep(i, , n) {
if(P[i].x!=P[i-].x)l[i] =ll( i--query(P[i].y));
else {
if (P[i].y >= P[fr[i]].y || P[i].y >= P[bk[i]].y)l[i] = ;
else l[i] = l[i - ];
}
add(P[i].y, );
}
mmm(d, );
//sort(P + 1, P + n + 1, cmpx);
int first = ;
per(i, n, ) {
if (P[i].x != P[i + ].x)r[i] = ll(n-i - query(P[i].y)),first=;
else {
if (P[i].y >= P[fr[i]].y || P[i].y >= P[bk[i]].y)r[i] = ;
else {
if (first)
{
first = ;
r[i] = ll(n - i -- query(P[i].y));
}
else r[i] = r[i + ];
}
}
add(P[i].y, );
}
tmp = ;
rep(i, , n) {
tmp = (tmp + l[i] * r[i] % mod) % mod;
}
ans = (ans + tmp) % mod;
cout << ans<<endl; //sort(P + 1, P + n + 1, cmp);
rep(i, , n) {
//cout << l[i] << ' ' << r[i] << endl;
}
cin >> n;
} /* */

【魔改】树状数组 牛客多校第五场I vcd 几何+阅读理解的更多相关文章

  1. 牛客多校第五场 F take

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] ...

  2. 2018牛客多校第五场 H.subseq

    题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以 ...

  3. 牛客多校第五场 F take 期望转化成单独事件概率(模板) 树状数组

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 Kanade has n boxes , the i-th box has p[i] proba ...

  4. 牛客多校第五场-D-inv

    链接:https://www.nowcoder.com/acm/contest/143/D来源:牛客网 题目描述 Kanade has an even number n and a permutati ...

  5. 牛客多校第五场 J:Plan

    链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  6. 牛客多校第五场 E room 二分图匹配 KM算法模板

    链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...

  7. 2019牛客多校第五场 F maximum clique 1 状压dp+最大独立集

    maximum clique 1 题意 给出一个集合s,求每个子集的最大独立集的权值和(权值是独立集的点个数) 分析 n比较小,一股浓浓的暴力枚举每一个子集的感觉,但是暴力枚举模拟肯定会T,那么想一想 ...

  8. 2019牛客多校第五场H - subsequence 2 拓扑

    H - subsequence 2 题意 要你使用前\(m\)个小写字母构造一个长度为\(n\)的字符串 有\(m*(m-1)/2\)个限制条件: \(c_{1} .c_{2}. len\):表示除去 ...

  9. 牛客多校第七场H Pair 数位dp理解

    Pair 题意 给出A B C,问x取值[1,A]和y取值[1,B]存在多少组pair<x,y>满足以下最小一种条件,\(x \& y >c\),\(x\) xor \(y& ...

随机推荐

  1. 基于mindwave脑电波进行疲劳检测算法的设计(3)

    这一节我将讲解thinkgear.h 里面的函数和宏定义.这一些都可以在MindSet Development Tools\ThinkGear Communications Driver\docs\h ...

  2. 8个非常个性化的CSS3单/复选框

    单选框和复选框在网页表单中应用十分广泛,但是浏览器默认自带的单选框和复选框样式不仅不统一,而且大多都比较简单丑陋.本文给大家介绍了一些基于CSS3的个性化单选框和复选框,一些选中动画是基于jQuery ...

  3. git初始化本地项目并推送到git服务器

    1.创建本地项目,在项目根目录执行git init命令 git init 2.在git服务器上创建一个仓库,这里使用GitHub创建一个仓库. 3.执行git remote add origin &l ...

  4. Java知多少(47)多重catch语句的使用

    某些情况,由单个代码段可能引起多个异常.处理这种情况,你可以定义两个或更多的catch子句,每个子句捕获一种类型的异常.当异常被引发时,每一个catch子句被依次检查,第一个匹配异常类型的子句执行.当 ...

  5. qualcomm wifi kernel beacon loss 日志记录

    记录一下高通对于beacon loss的处理的日志.方便后面再来分析. 04:17:13.397139 [04:17:13.383909] [000000A81699E7EC] [VosMC] wla ...

  6. Wifi 开放系统认证和共享密钥身份认证

    记录开放系统认证和共享密钥认证的区别. 开放系统身份认证(open-systern authentication) 是802.11 要求必备的惟一方式. 由行动式工作站所发出的第一个帧被归类为auth ...

  7. Go指南练习_Reader

    https://tour.go-zh.org/methods/22 一.题目描述 实现一个 Reader 类型,它产生一个 ASCII 字符 'A' 的无限流. 二.题目分析 io 包指定了 io.R ...

  8. (原)java 向上转型中,任何域的访问操作都是由编译器解析,不是多态

    最近在向java发力,学习学习了下.看到了多态这一节,书中有个比较好的例子,所以就准备写下来,记录下来: package dynamic_binding01; public class dynamic ...

  9. Tensorflow学习笔记——安装和运行

    参考的资料: 1.官网 2.tensorflow官方文档中文版 安装的是Python 2.7; CPU support (no GPU support),版本是1.1 pip install tens ...

  10. 仿迅雷播放器教程 -- 提取exe资源(12)

    既然选择了一个界面库,那么咱们就开始吧!     既然是仿迅雷播放器,那当然要把迅雷播放器的资源提取出来啦,但是很多小伙伴可能不知道怎么提取,所以这里就教大家一些方法: 一.传统的资源提取器     ...