Ball CodeForces - 12D (线段树)

题目链接:https://cn.vjudge.net/problem/CodeForces-12D

题目大意:给你一个人的三个信息,如果存在一个人比当前人的这三个信息都大,那么这个人就会退出,问你最终有多少人退出。

具体思路:首先按照x的大小排序,大的在前面,然后对y进行离散化,其次就该使用线段树了,将y表示成区间,每一次更新的是y当前的到最大节点,然后线段树中储存的是z值,这样的话,每一次查询,在保证x变大的同时,通过对当前y+1-》siz的区间的z值的最大值,就能判断了。

AC代码:

 1 #include<iostream>
 2 #include<stack>
 3 #include<stdio.h>
 4 #include<map>
 5 #include<cstring>
 6 #include<string>
 7 #include<cmath>
 8 #include<queue>
 9 #include<algorithm>
10 using namespace std;
11 # define lson l,m,rt<<1
12 # define rson m+1,r,rt<<1|1
13 # define ll long long
14 const int maxn = 1e5+100;
15 ll sto1[maxn],sto2[maxn];
16 ll sto3[maxn];
17 ll cal(ll t1,ll t2)
18 {
19     ll tmp=0;
20     while(t2)
21     {
22         tmp+=(t2/t1);
23         t2/=t1;
24     }
25     return tmp;
26 }
27 int main()
28 {
29     ll n,m,tmp;
30     scanf("%lld %lld",&n,&m);
31     tmp=m;
32     int num=0;
33     for(ll i=2; i*i<=m; i++)
34     {
35         int res=0;
36         if(tmp%i==0)
37         {
38             sto1[++num]=i;
39             while(tmp%i==0)
40             {
41                 tmp/=i;
42                 res++;
43             }
44               sto2[num]=res;
45         }
46     }
47     if(tmp!=1)sto1[++num]=tmp,sto2[num]=1;
48     for(int i=1; i<=num; i++)
49     {
50         sto3[i]=cal(sto1[i],n);
51        // cout<<sto1[i]<<" "<<sto2[i]<<" "<<sto3[i]<<endl;
52     }
53     ll minn=9e18+1;
54     for(int i=1; i<=num; i++)
55     {
56         minn=min(minn,sto3[i]/sto2[i]);
57     }
58     printf("%lld\n",minn);
59     return 0;
60 }

猜你喜欢

转载自www.cnblogs.com/letlifestop/p/10362661.html
今日推荐