POJ 3067【树状数组】
来源:互联网 发布:sql在哪里打开 编辑:程序博客网 时间:2024/06/01 10:19
题意:
给你两行数字,n个m个,然后给你k条线直接把两个数连起来,问有多少个交叉的
思路:
假定上一行是起点,下一行是终点。
把路按照起点从大到下排序,
然后可以直接对每条路查询,这条路目前的交叉数,等于sum[终点-1]条路相连,
因为是起点是从大到小,终点是取一个前面点的路,所以肯定相交;
具体处理就是利用树状数组存终点,每次取值,复杂度也低;
然后这个K有问题…
//#include <bits/stdc++.h>#include<iostream>#include<cstdio>#include<string.h>#include<algorithm>using namespace std;const int N=1e6+10;typedef long long LL;struct asd{ int s,t;};asd q[N];bool cmp(asd a,asd b){ if(a.s>b.s) return 1; if(a.s==b.s) return a.t>b.t; return 0;}LL c[N];int n,m;int lowbit(int x){ return x&(-x);}void add(int i,LL v){ while(i<=n+7) { c[i]+=v; i+=lowbit(i); }}LL sum(int i){ LL ans=0; while(i>0) { ans+=c[i]; i-=lowbit(i); } return ans;}int main(){ int T; int cas=1; scanf("%d",&T); while(T--) { int num; LL ans; scanf("%d%d",&n,&m); scanf("%d",&num); for(int i=0;i<num;i++) scanf("%d%d",&q[i].s,&q[i].t); sort(q,q+num,cmp); memset(c,0,sizeof(c)); ans=0; for(int i=0;i<num;i++) { int x=q[i].t; if(x>1) ans+=sum(x-1); add(x,1); } printf("Test case %d: %lld\n",cas++,ans); } return 0;}
0 0
- poj 3067 树状数组
- POJ 3067 树状数组
- poj 3067 树状数组
- poj 3067(树状数组)
- poj 3067 树状数组
- POJ 3067【树状数组】
- POJ-3067-树状数组
- POJ 3067 Japan【树状数组】
- poj 3067 japan 树状数组
- poj 3067 树状数组 Japan
- POJ 3067 Japan 树状数组
- poj 3067 树状数组 水
- POJ 3067 Japan 树状数组
- poj 3067(树状数组)
- poj 3067 - Japan(树状数组)
- 树状数组 - POJ 3067 Japan
- 树状数组 之 poj 3067
- Poj 3067 Japan 树状数组
- LeetCode 274.H-Index
- lightoj 1085【离散化+树状数组】
- 16斤水平分问题
- mac终端命令
- Hust oj 1944 皮卡丘(同蚂蚁感冒)
- POJ 3067【树状数组】
- 双色汉诺塔
- 浅谈CSRF攻击方式
- JAVA 中BIO,NIO,AIO的理解
- 百度外卖编程题练习笔记
- [Coursera机器学习]Logistic Regression WEEK3编程作业
- NORFlash协议层
- HDU 1556【线段树区间更新】
- lpa 半监督学习 之--标签传播算法