标签:eve else move course compute instance seve count 时间
Little Artem has invented a time machine! He could go anywhere in time, but all his thoughts of course are with computer science. He wants to apply this time machine to a well-known data structure: multiset.
Artem wants to create a basic multiset of integers. He wants these structure to support operations of three types:
But what about time machine? Artem doesn‘t simply apply operations to the multiset one by one, he now travels to different moments of time and apply his operation there. Consider the following example.
Note that Artem dislikes exceptions so much that he assures that after each change he makes all delete operations are applied only to element that is present in the multiset. The answer to the query of the third type is computed at the moment Artem makes the corresponding query and are not affected in any way by future changes he makes.
Help Artem implement time travellers multiset.
Input
The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the number of Artem‘s queries.
Then follow n lines with queries descriptions. Each of them contains three integers ai, ti and xi (1 ≤ ai ≤ 3, 1 ≤ ti, xi ≤ 109) — type of the query, moment of time Artem travels to in order to execute this query and the value of the query itself, respectively. It‘s guaranteed that all moments of time are distinct and that after each operation is applied all operations of the first and second types are consistent.
Output
For each ask operation output the number of instances of integer being queried at the given moment of time.
Examples
6
1 1 5
3 5 5
1 2 5
3 6 5
2 3 5
3 7 5
1
2
1
3
1 1 1
2 2 1
3 3 1
0
题意:按顺序给定一些操作或者询问。操作:在集合里加元素,删元素,然后有执行时间。 或询问。
思路:3维偏序,第1维:给出的顺序; 第二维:时间; 第三维:大小。
第一维已经排好序了,第二维也可以手动排序,然后搞定第三维。
复杂度O(NlgNlgN),不过跑起来还挺快的。
#include<bits/stdc++.h> using namespace std; const int maxn=100010; int b[maxn],ans[maxn],num[maxn],cnt,tN; struct in{ int id,opt,t,x; }s[maxn]; bool cmp1(in w,in v){ return w.t<v.t ;} bool cmp2(in w,in v){ return w.id<v.id; } void solve(int L,int R) { if(L==R) return ; int Mid=(L+R)/2; solve(L,Mid); solve(Mid+1,R); sort(s+L,s+R+1,cmp1); for(int i=L;i<=R;i++){ if(s[i].id<=Mid){ int pos=lower_bound(b+1,b+tN+1,s[i].x)-b; if(s[i].opt==1) num[pos]++; if(s[i].opt==2) num[pos]--; } else { int pos=lower_bound(b+1,b+tN+1,s[i].x)-b; if(s[i].opt==3) ans[s[i].id]+=num[pos]; } } for(int i=L;i<=R;i++){ if(s[i].id<=Mid){ int pos=lower_bound(b+1,b+tN+1,s[i].x)-b; if(s[i].opt==1) num[pos]--; if(s[i].opt==2) num[pos]++; } } sort(s+L,s+R+1,cmp2); } int main() { int N,i,j; scanf("%d",&N); for(i=1;i<=N;i++) scanf("%d%d%d",&s[i].opt,&s[i].t,&s[i].x); for(i=1;i<=N;i++) s[i].id=i, b[i]=s[i].x; sort(b+1,b+N+1); tN=unique(b+1,b+N+1)-(b+1); solve(1,N); for(i=1;i<=N;i++) if(s[i].opt==3) printf("%d\n",ans[i]); return 0; }
CodeForces669E:Little Artem and Time Machine(CDQ分治)
标签:eve else move course compute instance seve count 时间
原文地址:https://www.cnblogs.com/hua-dong/p/9101643.html