博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu 3810 三维偏序
阅读量:5326 次
发布时间:2019-06-14

本文共 3363 字,大约阅读时间需要 11 分钟。

我真的写不来cdq啊……

树套树卡常丧心病狂(作死套了fhqTreap……)

注意最后对于完全一样的点, 要在这些点的贡献都添加完了之后一起算答案

Code:

// luogu-judger-enable-o2#include 
#include
#include
using namespace std;const int N = 2e5 + 5;const int M = N * 21;int n, m, ans[N];struct Node { int ai, bi, ci;} a[N];inline bool cmp(const Node &x, const Node &y) { if(x.ai != y.ai) return x.ai < y.ai; if(x.bi != y.bi) return x.bi < y.bi; return x.ci < y.ci;}inline void read(int &X) { X = 0; char ch = 0; int op = 1; for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') op = -1; for(; ch >= '0' && ch <= '9'; ch = getchar()) X = (X << 3) + (X << 1) + ch - 48; X *= op;}namespace FhqTreap { int root[M], cnt, ch[M][2], key[M], pri[M], siz[M]; #define lc ch[p][0] #define rc ch[p][1] inline void init() { cnt = 0; } inline void up(int p) { siz[p] = siz[lc] + siz[rc] + 1; } inline int newnode(int val) { ++cnt; siz[cnt] = 1; pri[cnt] = rand(); key[cnt] = val; return cnt; } void split(int p, int v, int &x, int &y) { if(!p) x = y = 0; else { if(v < key[p]) y = p, split(lc, v, x, lc); else x = p, split(rc, v, rc, y); up(p); } } int merge(int x, int y) { if(!x || !y) return x + y; else { if(pri[x] < pri[y]) { ch[x][1] = merge(ch[x][1], y); up(x); return x; } else { ch[y][0] = merge(x, ch[y][0]); up(y); return y; } } } inline void insert(int R, int val) { if(!root[R]) { root[R] = newnode(val); return; } int r1, r2; split(root[R], val, r1, r2); root[R] = merge(r1, merge(newnode(val), r2)); } inline int getRank(int R, int val) { int r1, r2, res; split(root[R], val - 1, r1, r2); res = siz[r1]; root[R] = merge(r1, r2); return res; } }using namespace FhqTreap;struct BinaryIndexTree { inline int lowbit(int x) { return x & -x; } inline void modify(int x, int val) { for(; x <= m; x += lowbit(x)) insert(x, val); } inline int getsum(int x, int val) { int res = 0; for(; x > 0; x -= lowbit(x)) res += getRank(x, val + 1); return res; } } bit;int main() { srand(19260817); read(n), read(m); init(); for(int i = 1; i <= n; i++) read(a[i].ai), read(a[i].bi), read(a[i].ci);// bit.modify(a[i].bi, a[i].ci); sort(a + 1, a + 1 + n, cmp); for(int sum = 0, i = 1; i <= n; i++) {/* for(ed = i; a[ed].ai == a[i].ai; ed++); for(int j = i; j < ed; j++) ans[bit.getsum(a[j].bi, a[j].ci)]++; for(int j = i; j < ed; j++) bit.modify(a[j].bi, a[j].ci); */ if(a[i].ai == a[i + 1].ai && a[i].bi == a[i + 1].bi && a[i].ci == a[i + 1].ci) sum++; else { int res = bit.getsum(a[i].bi, a[i].ci); ans[res] += sum + 1; sum = 0; } bit.modify(a[i].bi, a[i].ci); } for(int i = 0; i < n; i++) printf("%d\n", ans[i]); return 0;}

 

转载于:https://www.cnblogs.com/CzxingcHen/p/9466339.html

你可能感兴趣的文章
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
XML学习笔记(二)-- DTD格式规范
查看>>
IOS开发学习笔记026-UITableView的使用
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
界面交互之支付宝生活圈pk微信朋友圈
查看>>
<转>Shell脚本相关
查看>>
[leetcode]403. Frog Jump青蛙过河
查看>>
英语音节知识
查看>>
IEEE 802.15.4协议学习之MAC层
查看>>
AngularJS学习篇(十三)
查看>>
Tableau 学习资料
查看>>
在ASP.NET WebService 中如何使用 WebMethod 属性
查看>>
一个很详细的web.xml讲解
查看>>