hdu5101 线段树做法
来源:互联网 发布:个人信息网络黑市 编辑:程序博客网 时间:2024/04/28 19:52
要从从n个集合里面找出两个权值之和大于k的数 问总共的方案数是多少
用线段树很傻的进行模拟 每次从里面挑选一个集合 全部删除之后 再枚举集合里面的每一个数字
然后再将这个集合插回线段树里面 nlogn的复杂度 + 很大的常数
#include<cstdio>#include<cstring>#include<string.h>#include<algorithm>using namespace std;#define LL __int64//#define LL long long#define maxn 111111#define ls (rt<<1)#define rs (rt<<1|1)#define mid ((l+r)>>1)int n,m,num[maxn],s[maxn<<2],mp[1111][111],clas[1111][111];inline void up(int rt){s[rt]=s[ls]+s[rs];}inline void build(int rt,int l,int r){ s[rt]=0; if(l==r)return ; build(ls,l,mid); build(rs,mid+1,r); up(rt);}inline void ins(int rt,int l,int r,int L,int R,int w){ if(L<=l&&r<=R){s[rt]+=w;return ;} if(L<=mid)ins(ls,l,mid,L,R,w); if(mid<R)ins(rs,mid+1,r,L,R,w); up(rt);}inline int query(int rt,int l,int r,int L,int R){ if(L<=l&&r<=R)return s[rt]; int sum=0; if(L<=mid)sum+=query(ls,l,mid,L,R); if(mid<R)sum+=query(rs,mid+1,r,L,R); return sum;}void solve1(){ int n,k,co,ma=0; LL ans=(LL)0; scanf("%d%d",&n,&k); co=0; for(int i=0;i<n;++i){ scanf("%d",&mp[i][0]); for(int j=1;j<=mp[i][0];++j){ scanf("%d",&mp[i][j]); num[co++]=mp[i][j]; clas[i][j]=mp[i][j];ma=max(ma,mp[i][j]); } } sort(num,num+co); int clc=(int)(unique(num,num+co)-num); build(1,1,clc); for(int i=0;i<n;++i){ for(int j=1;j<=mp[i][0];++j){ mp[i][j]=(int)(lower_bound(num,num+clc,mp[i][j])-num); ins(1,1,clc,mp[i][j]+1,mp[i][j]+1,1); } } for(int i=0;i<n;++i){ for(int j=1;j<=mp[i][0];++j){ ins(1,1,clc,mp[i][j]+1,mp[i][j]+1,-1); } for(int j=1;j<=mp[i][0];++j){ if(k-clas[i][j]+1>ma)continue; int pos=(int)(lower_bound(num,num+clc,k-clas[i][j]+1)-num); pos+=1; if(pos<=clc)ans+=(LL)query(1,1,clc,pos,clc); } for(int j=1;j<=mp[i][0];++j){ ins(1,1,clc,mp[i][j]+1,mp[i][j]+1,1); } }// printf("%lld\n",ans/2); printf("%I64d\n",ans/2);}int main(){ int _; scanf("%d",&_); while(_--){ solve1(); } return 0;}
0 0
- hdu5101 线段树做法
- HDU1506线段树做法
- 特殊做法类线段树
- 【NOI2014】购票 线段树做法
- HDU1166(线段树做法)
- 【t019】window(线段树做法)
- 校门外的树线段树做法
- poj 2352 Stars (线段树做法)
- HDU2665 kth number 线段树做法
- codevs 切水果(线段树做法)
- hdu5101-Select
- 杭电1166-敌兵布阵 →线段树做法和暴力模拟做法
- 线段树求周长求交面积的做法
- JOJ 2442: Be efficient 线段树的做法
- poj 1389 Area of Simple Polygons(线段树做法)
- hdu 1166 敌兵布阵 基础线段树 2种做法
- hdu1556树状数组&&线段树2种做法
- HDOJ 4288 Coder 线段树 vector偷懒做法
- OpenGL入门学习
- Python - 求斐波那契数列前N项之和
- 2013 Chengdu Regional H - Hard Disk Drive解题报告
- 苦逼的面试
- source文件和makefile文件编写
- hdu5101 线段树做法
- 现货白银投资是什么东西啊?之前有人叫我做是不是骗人的啊?
- hdu1428 记忆化搜索
- fread函数
- HDU 4782 Beautiful Soup(模拟)
- Java堆和栈的区别
- 【SSH三大框架】Struts2基础第三篇:配置Action以及调用Action的三种方式
- 我的微信公众号
- 关联规则算法Apriori的学习与实现