今天的模拟赛就比较常规要稍简单一点(不过我一道都没切满)

01串

我因为傻傻地一个一个地printf,居然T了,下次记得输出整串。
细节较多,分奇偶性讨论

#include<bits/stdc++.h>
using namespace std;
int main() {
//	freopen("binary.in","r",stdin);
//	freopen("binary.out","w",stdout);
	int T;
	scanf("%d",&T);
	while(T--) {
		int n,m;
		scanf("%d%d",&n,&m);
		if(n==1) {printf("-1\n-1\n");continue;}
		if(n&1) {
			if(m<2) {printf("-1\n-1\n");continue;}
			for(int i=1;i<=n-2;i++) printf("1");
			printf("0101");
			for(int j=1;j<=m-2;j++) printf("0");
			puts("");printf("1");
			if((n+m)&1) {
				for(int j=1;j<m;j++) printf("0");
				printf("10");
				for(int i=1;i<=n-2;i++) printf("1");
				puts("");
			}
			else {
				for(int j=1;j<=m-2;j++) printf("0");
				printf("1010");
				for(int i=1;i<=n-3;i++) printf("1");
				puts("");
			} 
		} 
		else {
			if(((n+m)&1)&&(m<1)) {printf("-1\n-1\n");continue;}
			for(int i=1;i<=n;i++) printf("1");
			for(int i=1;i<=m;i++) printf("0");
			puts("");
			printf("1");
			if((n+m)&1) {
				for(int j=1;j<m;j++) printf("0");
				printf("10");
				for(int i=1;i<=n-2;i++) printf("1");
				puts("");
			} 
			else {
				for(int j=1;j<=m;j++) printf("0");
				for(int i=1;i<=n-1;i++) printf("1");
				puts("");
			}
		}
	}
	return 0;
}

球与盒子

  • 题解:模数导致大于某个(2106 3106)的数答案为0,就没注意这点便痛失30pt
  • 代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e6+5;
vector<int> V[N];
int to[N],cnt[N],b[N],tot;
ll jc[N],mod=500009,ans[N];
bool mark[N];
struct node {int id,x;}a[N];
bool cmp(node u,node v) {return u.x<v.x;}
void init() {
	int n=3e6;
	jc[0]=1;for(int i=1;i<=n;i++) jc[i]=jc[i-1]*i%mod; 
	for(int i=1;i<=n;i++) {
		for(int j=i;j<=n;j+=i) cnt[j]++;
	}
	int mx=0;
	for(int i=1;i<=n;i++) {
		if(!mark[cnt[i]]) b[++tot]=cnt[i];
		mark[cnt[i]]=1; V[cnt[i]].push_back(i);
		int t=V[cnt[i]].size();
		mx=max(mx,t);
	}
}
int main() {
//	freopen("ball.in","r",stdin);
//	freopen("ball.out","w",stdout);
	int T;
	scanf("%d",&T);
	for(int t=1;t<=T;t++)scanf("%d",&a[t].x),a[t].id=t;
	init();
	sort(a+1,a+1+T,cmp);
	for(int i=1;i<=T;i++) {
		if(a[i].x>3e6) break;
		ll res=1;
		for(int j=1;j<=tot;j++) {
			int c=b[j],sz=V[c].size();
			while(to[c]+1<sz&&V[c][to[c]+1]<=a[i].x) to[c]++;
			res=res*jc[to[c]+1]%mod;
		}
		ans[a[i].id]=res;
	}
	for(int i=1;i<=T;i++) printf("%lld\n",ans[i]);
	return 0;
}

三角查询

  • 题解:
    三维偏序(第三维类曼哈顿)CDQ板题
    排序讲究
  • 代码:
#include<bits/stdc++.h>
using namespace std;
const int N=3e6+5;
struct node {int x,y,id,d=0;}q[N],t[N];
int ans[N],c[N];
int lowbit(int x) {return x&(-x);}
void Update(int x,int w) {for(;x<=3e6;x+=lowbit(x)) c[x]+=w;}
int Ask(int x) {int res=0;for(;x;x-=lowbit(x))res+=c[x]; return res;}
void Clear(int x) {for(;x<=3e6;x+=lowbit(x))c[x]=0;}
bool cmp(node u,node v) {
	if(u.x^v.x)return u.x>v.x;
	if(u.y^v.y)return u.y>v.y;
	if(u.d^v.d)return u.d<v.d;
}
void _CDQ(int l,int r) {
	if(l==r) return;
	int mid=(l+r)>>1;
	_CDQ(l,mid); _CDQ(mid+1,r);
	int i=l,j=mid+1,c=l;
	while(c<=r) {
		if((j>r)||(i<=mid&&q[i].y>=q[j].y)) {if(!q[i].d){Update(q[i].x+q[i].y,1);}t[c++]=q[i++];}
		else {if(q[j].d){ans[q[j].id]+=Ask(q[j].x+q[j].y+q[j].d);}t[c++]=q[j++];}
	}
	for(int k=l;k<=mid;k++) if(!q[k].d)Clear(q[k].x+q[k].y);
	for(int k=l;k<=r;k++) q[k]=t[k];
}
int main() {
//	freopen("data.in","r",stdin);
//	freopen("data.out","w",stdout);
	int n,Q;
	scanf("%d%d",&n,&Q);
	for(int i=1;i<=n;i++) scanf("%d%d",&q[i].x,&q[i].y);
	for(int i=1;i<=Q;i++) scanf("%d%d%d",&q[n+i].x,&q[n+i].y,&q[n+i].d),q[n+i].id=i;
	sort(q+1,q+1+n+Q,cmp);
	_CDQ(1,n+Q);
	for(int i=1;i<=Q;i++) printf("%d\n",ans[i]);
	return 0;
}

T4

.未完待续