码迷,mamicode.com
首页 > 其他好文 > 详细

【模板】 codeforces-669E cdq分治

时间:2019-09-11 20:14:08      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:create   操作   inf   queue   es6   auth   span   scanf   sort   

题目传送门:https://vjudge.net/contest/325125#problem/A

题意:三种操作:1 t x  在第t秒x点的值+1  ,     2 t x  在第t秒x点的值-1  ,  3 t x  查询在t秒x点处的值

感觉用结构体写好看一点。然后记得归并。坑点都在注释里了。

技术图片
 1 /*************************************************************************
 2     > File Name: codeforces669E.cpp
 3 # File Name: codeforces669E.cpp
 4 # Author : xiaobuxie
 5 # QQ : 760427180
 6 # Email:760427180@qq.com
 7 # Created Time: 2019年09月10日 星期二 22时43分43秒
 8  ************************************************************************/
 9 
10 #include<iostream>
11 #include<cstdio>
12 #include<map>
13 #include<cmath>
14 #include<cstring>
15 #include<set>
16 #include<queue>
17 #include<vector>
18 #include<algorithm>
19 using namespace std;
20 typedef long long ll;
21 #define inf 0x3f3f3f3f
22 #define pq priority_queue<int,vector<int>,greater<int> >
23 ll gcd(ll a,ll b){
24     if(a<b) return gcd(b,a);
25     return b==0?a:gcd(b,a%b);
26 }
27 
28 const int N=1e5+9;
29 struct node{
30     int tim,pos,ord,ty,ans;
31     bool operator<(const node& o){
32         return ord<o.ord;
33     }
34 }A[N],B[N];
35 map<int,int> mp;
36 
37 void cdq(int l,int r){
38     if(l==r) return;
39     int m=(l+r)>>1;
40     cdq(l,m); cdq(m+1,r);
41     for(int i=l,t1=l,t2=m+1;i<=r;++i){
42         if(t1<=m && (A[t1].tim<=A[t2].tim || t2>r)){
43             if(A[t1].ty==1) mp[A[t1].pos]++;
44             if(A[t1].ty==2) mp[A[t1].pos]--;
45             B[i]=A[t1];  //赋值要放在操作之后
46             ++t1;
47         }
48         else{
49             if(A[t2].ty==3) A[t2].ans+=mp[A[t2].pos];
50             B[i]=A[t2];   //赋值要放在操作之后,因为B待会要给回A
51             ++t2;
52         }
53     }
54     for(int i=l;i<=m;++i){
55         if(A[i].ty==1) mp[A[i].pos]--;
56         if(A[i].ty==2) mp[A[i].pos]++;
57     }
58     for(int i=l;i<=r;++i) A[i]=B[i]; //不要忘了
59 }
60 int main(){
61     int n; scanf("%d",&n);
62     for(int i=1;i<=n;++i){
63         scanf("%d %d %d",&A[i].ty,&A[i].tim,&A[i].pos);
64         A[i].ord=i; 
65     }
66     cdq(1,n);
67     sort(A+1,A+1+n);
68     for(int i=1;i<=n;++i) if(A[i].ty==3) printf("%d\n",A[i].ans);
69     return 0;
70 }
View Code

 

【模板】 codeforces-669E cdq分治

标签:create   操作   inf   queue   es6   auth   span   scanf   sort   

原文地址:https://www.cnblogs.com/xiaobuxie/p/11508164.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!