AtCoder Regular Contest 068 E - Snuke Line 离线+树状数组
2018-02-23 09:45
309 查看
题意
有m+1个车站,编号为0到m,有n种纪念品,第i种在编号在区间[li,ri]的车站中可以买到。现在有m辆车,第i辆会从车站0出发,每隔i站停靠一次,问在该车上的旅客最多可以买到多少种不同的纪念品。n<=300000,m<=100000
分析
我们可以考虑求第i辆车的旅客买不到哪些纪念品。一个区间不包含整除i的点,要么区间在两个可以整除i的点之间,要么在最后一个可以整除i的点之后。我们可以把每一个区间看作一个点(li,ri),那么每次我们要做的就是查询一个矩形内有多少个点。
可以先调和级数把所有要查询的矩形搞出来,然后离线+树状数组即可。
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; const int N=100005; int n,m,tot,ans ,c ; struct data{int x,y,l,r,id,c;}a[N*3],q[N*50]; int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } bool cmp(data a,data b) { return a.x<b.x; } void ins(int x,int y) { while (x<=m) c[x]+=y,x+=x&(-x); } int query(int x) { int ans=0; while (x) ans+=c[x],x-=x&(-x); return ans; } int main() { n=read();m=read(); for (int i=1;i<=n;i++) a[i].x=read(),a[i].y=read(); sort(a+1,a+n+1,cmp); for (int i=2;i<=m;i++) { for (int j=i;j<=m;j+=i) { q[++tot].x=j-i;q[tot].l=j-i+1;q[tot].r=j-1;q[tot].id=i;q[tot].c=1; q[++tot].x=j-1;q[tot].l=j-i+1;q[tot].r=j-1;q[tot].id=i;q[tot].c=-1; } int x=(m/i)*i; q[++tot].x=x;q[tot].l=x+1;q[tot].r=m;q[tot].id=i;q[tot].c=1; q[++tot].x=m;q[tot].l=x+1;q[tot].r=m;q[tot].id=i;q[tot].c=-1; } sort(q+1,q+tot+1,cmp); for (int i=1;i<=m;i++) ans[i]=n; int now=1; for (int i=1;i<=tot;i++) { while (now<=n&&a[now].x<=q[i].x) ins(a[now].y,1),now++; ans[q[i].id]+=q[i].c*(query(q[i].r)-query(q[i].l-1)); } for (int i=1;i<=m;i++) printf("%d\n",ans[i]); return 0; }
相关文章推荐
- 【树状数组】AtCoder Regular Contest 075 E - Meaningful Mean
- AtCoder Regular Contest 075 E - Meaningful Mean(树状数组)
- AtCoder Regular Contest 075 E - Meaningful Mean(树状数组)
- AtCoder Regular Contest 088 E - Papple Sort(树状数组+结论)
- AtCoder Regular Contest 068 E- Snuke Line
- AtCoder Grand Contest 006 E - Rotate 3x3 树状数组
- AtCoder Regular Contest 068-D
- 【AtCoder - 2300】Snuke Line(树状数组)
- AtCoder Regular Contest 068 F - Solitaire 动态规划
- Atcoder Regular Contest 084
- AtCoder Regular Contest 078
- [AtCoder Regular Contest 077] F: SS (arc077F)
- AtCoder Regular Contest 063 Integers on a Tree 树形dp+构造
- AtCoder Regular Contest 065 Shuffling 动态规划
- Atcoder regular Contest 073(C - Sentou)
- AtCoder Regular Contest 073 D - Simple Knapsack(贪心)
- AtCoder Regular Contest D - Remainder Reminder 取余问题
- AtCoder Regular Contest 077
- AtCoder Regular Contest 092 C - 2D Plane 2N Points 贪心 匈牙利算法模板
- 【搜索】[AtCoder Regular Contest 092 F]Two Faced Edges