标签:def eps 继承 limit sam vector col over contains
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9618 Accepted Submission(s): 4074
//int cnt=lower_bound(b+1,b+1+d,h[i])-b; int cnt=upper_bound(b+1,b+1+d,h[i])-b-1;
以上两种都是对的。
代码:
1 //无修改区间-可持久化线段树(权值线段树+可持久化) 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<bitset> 7 #include<cassert> 8 #include<cctype> 9 #include<cmath> 10 #include<cstdlib> 11 #include<ctime> 12 #include<deque> 13 #include<iomanip> 14 #include<list> 15 #include<map> 16 #include<queue> 17 #include<set> 18 #include<stack> 19 #include<vector> 20 using namespace std; 21 typedef long long ll; 22 typedef pair<int,int> pii; 23 24 const double PI=acos(-1.0); 25 const double eps=1e-6; 26 const ll mod=1e9+7; 27 const int inf=0x3f3f3f3f; 28 const int maxn=2e5+10; 29 const int maxm=100+10; 30 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 31 #define lson l,m 32 #define rson m+1,r 33 34 int a[maxn],b[maxn],sum[maxn<<5],ls[maxn<<5],rs[maxn<<5];//sum线段树里保存的值,L左儿子,R右儿子 35 int n,m,sz=0; 36 37 void build(int &rt,int l,int r)//建棵空树 38 { 39 rt=++sz;sum[rt]=0;//动态开点,初始值为0,空树 40 if(l==r){ 41 return ; 42 } 43 44 int m=(l+r)>>1; 45 build(ls[rt],lson); 46 build(rs[rt],rson); 47 } 48 49 void update(int pre,int &rt,int l,int r,int p,int c) 50 { 51 rt=++sz;sum[rt]=sum[pre]+c;//插入序列,首先继承以前的线段树 然后直接单点+1就可以 52 ls[rt]=ls[pre];rs[rt]=rs[pre]; 53 if(l==r){ 54 return ; 55 } 56 57 int m=(l+r)>>1; 58 if(p<=m) update(ls[pre],ls[rt],lson,p,c);//因为右边不需要更新,所以覆盖掉左边 59 else update(rs[pre],rs[rt],rson,p,c); 60 //sum[rt]=sum[ls[rt]]+sum[rs[rt]]; 61 } 62 63 int query(int pre,int rt,int L,int R,int l,int r)//查询l到r区间就是第r次插入减去第l-1次插入后的线段树的样子 64 { 65 if(L>R) return 0; 66 if(L<=l&&r<=R){ 67 return sum[rt]-sum[pre]; 68 } 69 70 int ret=0; 71 int m=(l+r)>>1; 72 if(L<=m) ret+=query(ls[pre],ls[rt],L,R,lson); 73 if(R> m) ret+=query(rs[pre],rs[rt],L,R,rson); 74 return ret; 75 } 76 77 int rt[maxn],l[maxn],r[maxn],h[maxn]; 78 79 int main() 80 { 81 int t; 82 scanf("%d",&t); 83 for(int cas=1;cas<=t;cas++){ 84 scanf("%d%d",&n,&m); 85 sz=0; 86 for(int i=1;i<=n;i++) 87 { 88 scanf("%d",&a[i]); 89 b[i]=a[i]; 90 } 91 for(int i=1;i<=m;i++){ 92 scanf("%d%d%d",&l[i],&r[i],&h[i]); 93 b[i+n]=h[i]; 94 l[i]++,r[i]++; 95 } 96 sort(b+1,b+1+n+m);//首先把值全部排序去重,用于建权值线段树,权值线段树保存的内容是值的数量。 97 int d=unique(b+1,b+1+n+m)-(b+1); 98 build(rt[0],1,d); 99 for(int i=1;i<=n;i++) //按照序列顺序插入值 100 { 101 int p=lower_bound(b+1,b+1+d,a[i])-b; 102 update(rt[i-1],rt[i],1,d,p,1); 103 } 104 printf("Case %d:\n",cas); 105 for(int i=1;i<=m;i++) 106 { 107 //int L=1,R=upper_bound(b+1,b+1+d,h)-b-1; 108 //int cnt=lower_bound(b+1,b+1+d,h[i])-b; 109 int cnt=upper_bound(b+1,b+1+d,h[i])-b-1; 110 //printf("%d\n",query(rt[l[i]],rt[r[i]+1],1,cnt,1,d)); 111 //printf("%d\n",query(rt[l],rt[r+1],1,cnt,1,d)); 112 printf("%d\n",query(rt[l[i]-1],rt[r[i]],1,cnt,1,d)); 113 } 114 } 115 return 0; 116 }
菜的难受。。。
HDU 4417.Super Mario-无修改区间小于等于H的数的个数-可持久化线段树
标签:def eps 继承 limit sam vector col over contains
原文地址:https://www.cnblogs.com/ZERO-/p/9807491.html