牛客小白月赛18【其中含有给4个点坐标,判断是不是正方形模板】【树状数组模板】

 

线性筛的一道题。

线筛是能记录最小质因子的。套模板。

 1 #include<bits/stdc++.h>
 2   
 3 using namespace std;
 4 #define int long long
 5 #define MAXN 30000012
 6 int prime[MAXN],v[MAXN];
 7 int m=0;//m表示现在筛出m个质数
 8 void primes(int n)
 9 {
10     for(int i=2;i<=n;i++)
11     {
12         if(v[i]==0)//如果v[i]为0,说明 i 之前没有被筛到过,i 为质数
13         {
14             v[i] = i;
15              prime[++m] = i;
16         }
17         for(int j = 1;j<=m;j++)//遍历小于 i 的所有质数
18         {
19             //如果质数大于 i 的最小质因数或者乘起来大于n就跳出循环
20             if(prime[j] > v[i] || prime[j] > n/i) break;
21             v[i*prime[j]] = prime[j];//标记 i*prime[j] 的最小质因数是prime[j]
22         }
23     }
24 }
25 signed main(){
26    int n;cin>>n; 
27     primes(n);
28      
29    int sum=0;
30    for(int i=2;i<=n;i++){
31     sum+=v[i];
32    }  
33    cout<<sum<<endl;
34     return 0;
35 }

 模拟一下:【其中含有给4个点坐标,判断是不是正方形模板】

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 struct str{
 5     int x,y;
 6 };
 7 bool cmp(str a,str b){
 8     if(a.x!=b.x){
 9         return a.x<b.x;
10     }else{
11         return a.y<b.y;
12     }
13 }
14 int len(int a,int b,int c,int d)
15 {
16     return (a-c)*(a-c)+(b-d)*(b-d);
17 }
18 int  check(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4){
19     int s1,s2,s3,s4,s5,s6;
20     struct str p[10];
21     p[0].x=x1,p[0].y=y1;
22     p[1].x=x2,p[1].y=y2;
23     p[2].x=x3,p[2].y=y3;
24     p[3].x=x4,p[3].y=y4;
25     sort(p,p+4,cmp);
26     s1=len(p[0].x,p[0].y,p[3].x,p[3].y);
27        s2=len(p[1].x,p[1].y,p[2].x,p[2].y);
28        if(s1!=s2||s1==0)
29         {
30            return 0;
31             
32         }
33         else if(s1==s2)
34         {
35             if(((p[0].x-p[3].x)*(p[1].x-p[2].x)+(p[1].y-p[2].y)*(p[0].y-p[3].y))==0)//对角线相等
36                 return 1;
37             else return 0;
38         }
39 }
40 int  main(){
41     int x1,x2,x3,x4,y1,y2,y3,y4;
42     cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
43     if(check(x1,y1,x2,y2,x3,y3,x4,y4)){
44         cout<<"wen";
45         return 0;
46     }
47     int flag=0;
48     if(check(x1+1,y1,x2,y2,x3,y3,x4,y4)){
49         flag=-1;
50     }else if(check(x1-1,y1,x2,y2,x3,y3,x4,y4)){
51             flag=-1;
52     }else if(check(x1,y1+1,x2,y2,x3,y3,x4,y4)){
53             flag=-1;
54     }else if(check(x1,y1-1,x2,y2,x3,y3,x4,y4)){
55             flag=-1;
56     }else if(check(x1,y1,x2+1,y2,x3,y3,x4,y4)){
57             flag=-1;
58     }else if(check(x1,y1,x2-1,y2,x3,y3,x4,y4)) {
59             flag=-1;
60     }else if(check(x1,y1,x2,y2+1,x3,y3,x4,y4)){
61             flag=-1;
62     }else if(check(x1,y1,x2,y2-1,x3,y3,x4,y4)){
63             flag=-1;
64     }else if(check(x1,y1,x2,y2,x3+1,y3,x4,y4)){
65             flag=-1;
66     }else if(check(x1,y1,x2,y2,x3-1,y3,x4,y4)) {
67             flag=-1;
68     }else if(check(x1,y1,x2,y2,x3,y3+1,x4,y4)){
69             flag=-1;
70     }else if(check(x1,y1,x2,y2,x3,y3-1,x4,y4)){
71             flag=-1;
72     }else if(check(x1,y1,x2,y2,x3,y3,x4+1,y4)){
73             flag=-1;
74     }else if(check(x1,y1,x2,y2,x3,y3,x4-1,y4)) {
75             flag=-1;
76     }else if(check(x1,y1,x2,y2,x3,y3,x4,y4+1)){
77             flag=-1;
78     }else if(check(x1,y1,x2,y2,x3,y3,x4,y4-1)){
79             flag=-1;
80     }
81     if(flag==-1){
82         cout<<"hai xing"<<endl; 
83     }else{
84         cout<<"wo jue de bu xing"<<endl; 
85     }
86     
87     return 0;
88 }

 树状数组维护一下然后二分答案。【树状数组模板·】

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 #define N 300000
 5 #define int long long
 6 #define inf 0x3f3f3f3f
 7 struct str{
 8     int c[N];
 9     int lowbit(int x){
10         return x&(-x);
11     }
12     void update(int x,int v){
13         for(int i=x;i<=N;i+=lowbit(i))  
14             c[i]+=v;
15     }
16     int getsum(int x){
17         int res=0; 
18         for(int i=x;i;i-=lowbit(i))
19             res+=c[i]; 
20         return res;
21     }
22     int query(int l,int r){
23         return getsum(r)-getsum(l-1);
24     }
25 }st;
26 signed main(){
27     int _;cin>>_;
28     while(_--){
29         int op=0;
30         int x,y,z;
31         cin>>op;
32         if(op==1){
33             cin>>x>>y>>z;
34             int temp=(int)ceil(sqrt(x*x+y*y+z*z));
35             st.update(temp,1);
36         }else{
37             int k;
38             cin>>k;
39             int l=0;
40             int r=N;
41             int ans=inf;
42             while(l<=r){
43                 int mid=(l+r)/2;
44                 if(st.getsum(mid)>=k){
45                     ans=min(ans,mid);
46                     r=mid-1;
47                 }else{
48                     l=mid+1;
49                 }
50             }
51             if(ans==inf){
52                 printf("-1
");
53             }else{
54                 printf("%lld
",ans);
55             }
56         }
57         
58     }
59     return 0;
60 }

B题待补。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

原文地址:https://www.cnblogs.com/pengge666/p/11748007.html