2020.10.26模拟赛

2020.10.25 模拟赛

T1 稻草富翁

先考虑都不等于0的情况,一轮下来,1单位沙子可以变成\(\frac{bdf}{ace}\)单位沙子,如果这个值大于1,那么他就可以制造出无数黄金。

再考虑等于0的情况。我们的目的是兑换黄金,不考虑其他影响,如果d等于0,那么无论有多少铅,都不可能换到黄金,如果d不等于0,c等于0,那么就算没有铅,也可以换到无数黄金。以此类推,再考虑b,a,f,e。按照顺序一个一个判断。

#include<bits/stdc++.h>
using namespace std;
int t,a,b,c,d,e,f;
int main(){
	cin>>t;
	while(t--){
		scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
		if(d==0){printf("FON\n");continue;}
		if(c==0){printf("MEI\n");continue;}
		if(b==0){printf("FON\n");continue;}
		if(a==0){printf("MEI\n");continue;}
		if(a*c*e<b*d*f){printf("MEI\n");continue;}
		printf("FON\n");
	}
	return 0;
}

T2 序列

考虑处理出每一个操作被执行的次数。可以从后往前扫,用差分数组维护(我比较愚笨,只想得起树状数组)。再用另一个差分维护每一个点的数值。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5,mod=1e9+7;;
struct node{
	int t,l,r,o;
}a[N];
int n,m,c[N],d[N];
void add(int x,int y){
	y%=mod;
	for(int i=x;i<=m;i+=i&-i)c[i]=(c[i]+y+mod)%mod;
}
int getsum(int x){
	int sum=0;
	for(int i=x;i>=1;i-=i&-i){sum=(sum+c[i]+mod)%mod;}
	return sum;
}
void jia(int x,int y){
	for(int i=x;i<=n;i+=i&-i)d[i]=(d[i]+y+mod)%mod;
}
int qiuhe(int x){
	int sum=0;
	for(int i=x;i>=1;i-=i&-i){sum=(sum+d[i]+mod)%mod;}
	return sum;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int t,l,r;
		scanf("%lld%lld%lld",&a[i].o,&a[i].l,&a[i].r);
	}
	add(1,1);
	for(int i=m;i>=1;i--){
		if(a[i].o==2){
			int x=getsum(i);
			add(a[i].l,x);
			add(a[i].r+1,-x);
		}
		if(a[i].o==1){
			int x=getsum(i);
			jia(a[i].l,x);
			jia(a[i].r+1,-x);
		}
	}
	for(int i=1;i<=n;i++){
		printf("%lld ",qiuhe(i));
	}
	return 0;
}

总结

非常开心,虽然只是拿到了比较好拿而且没什么区分度的240分,不过居然拿到了小机房rk1!(不是并列)

其实有很多大佬比我强,但是T1需要仔细地判0的情况,许多大佬疏忽了,只拿了70分。结果因为我不会T3,花了更多时间思考T1,有了意外的收获。

这件事情生动形象地告诉了我们,如果遇见了不会做的题,要花时间检查前面的题而不是花大量的时间思考不会的题,有时简单题的细节会造成很大的影响。

posted @ 2020-10-26 17:46  蒟蒻_william555  阅读(98)  评论(1)    收藏  举报