小白月赛

编程入门 行业动态 更新时间:2024-10-27 01:33:44

本场新生赛和今晚的小白月
本次比赛还是暴力了自己很大的问题,代码量和思维量都明显不够,只会暴力和找规律,遇到稍微思维量大一点的
代码题就没办法。
优点是,比赛完后立马补题,效果最好。

A-签到  

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 const ll mod = 1e9+7;
 8 const int maxx = 1e5+7;
 9 struct node
10 {
11     ll x,y;
12 }p[maxx];
13 ll qpow(ll a,ll b)
14 {
15     ll ans=1;
16     while(b)
17     {
18         if(b&1)
19         {
20             ans=ans*a%mod;
21         }
22         a=a*a%mod;
23         b/=2;
24     }
25     return ans;
26 }
27 int main()
28 {
29     ll n;
30     while(~scanf("%lld",&n))
31     {
32         for (int i=1; i<=n; i++)
33         {
34             scanf("%lld%lld",&p[i].x,&p[i].y);
35         }
36         ll ans=1;
37         ll a=1;
38         ll b=1;
39         for(int i=1; i<=n; i++)
40         {
41            a=a*(p[i].y-p[i].x)%mod;
42            b=b*qpow(p[i].y,mod-2)%mod;
43         }
44         ans=(1-a*b%mod+mod)%mod;
45         printf("%lld\n",ans);
46     }
47     return 0;
48 }
View Code


本题最开始我想错了,正解是每层楼掉东西的概率p[i]=a[i]/b[i],那么不掉东西的概率应该是
                   p=sigma((b[i]-a[i])/b[i])

那么掉东西的概率就是1-p,那么·这个题再求逆元,就很好办了。

 

B-法法  

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll long long
int main(){int t;scanf("%d",&t);long long n;while(t--){scanf("%lld",&n);if (n==1 || n==2)printf("1\n");else printf("0\n");}return 0;
}
View Code

水题:特判1,2即可


E-换个角度思考

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxx  = 1e5+7;
int n,m,ans[maxx];
struct node
{int val;int id;
} s[maxx];
bool cmpnode(node x,node y)
{return x.val<y.val;
}
struct Query
{int l,r;int h;int id;
} q[maxx];
bool cmpQuery(Query x,Query y)
{return x.h < y.h;
}
int tree[maxx];
int lowbit(int x)
{return x&(-x);
}
void add(int i,int x)
{while(i<maxx){tree[i]+=x;i+=lowbit(i);}
}
int sum(int i)
{int sum=0;while(i>0){sum+=tree[i];i-=lowbit(i);}return sum;
}
int query(int l,int r)
{return sum(r)-sum(l-1);
}
int main()
{memset(tree,0,sizeof(tree));scanf("%d%d",&n,&m);for (int i=1;i<=n;i++){scanf("%d",&s[i].val);s[i].id=i;}sort(s+1,s+1+n,cmpnode);//按值进行排序for (int i=1;i<=m;i++){scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].h);q[i].id=i;}sort(q+1,q+1+m,cmpQuery);//按照询问的右区间进行排序int top=1;//对于每个值,如果这个数在某个区间for (int i=1;i<=m;i++){while(top<=n && s[top].val<=q[i].h)//这个值小于x
        {add(s[top].id,1);//这个位置+1等价于,这个询问后面的询问一定会询问到这个数,如果下一个询问k,依然可以比这个值小,那么后面依然可以询问道。top++;}ans[q[i].id]=query(q[i].l,q[i].r);//那么我只需要统计这个位置就行了
    }for (int i=1;i<=m;i++){printf("%d\n",ans[i]);}return 0;
}
/*
5 3
1 2 3 4 5
1 4 3
3 4 5
1 5 4
*/
View Code

 

这个题目数据有问题,暴力能过。。。。

查询区间小于等于某个数的个数,如果强制在线的话要写主席树之类的……
然而允许离线,那么可以直接用套路做题了
首先把询问拆成和,同时打上对答案产生贡献的标记(前者是,后者是)
那么现在问题就成了:查询前缀小于等于的个数
把所有询问按照右端点(实际上是)排序,然后转化为一开始给定一个空序列,每次往序列末端添加一个数,同
时支持查询这个序列小于等于的元素个数
数据范围才,树状数组维护一下就好了

H-论如何出一道水题

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){long long n;while(~scanf("%lld",&n)){if(n==1)printf("2\n");elseprintf("%lld\n",2*n-1);}return 0;
}
View Code

水题,MAX(i,j),且i,j互质。
那么问题很简单,i=n-1,j=n,即可。但是要特判1;

转载于:blogs./bluefly-hrbust/p/9976316.html

更多推荐

白月

本文发布于:2023-05-24 16:42:09,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/226573.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:白月

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!