CF1152

A Copying Homework

将每一项+1就行

#include<bits/stdc++.h>
int n;
const int maxn=1e5+5;
int a[maxn]; 
using namespace std;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cout<<(a[i]==n?1:(a[i]+1))<<" ";
	return 0;
}

B Cleaning Robots

不会

C Even Path

考虑找规律,起始点横纵坐标必然都是偶数或者都是奇数,因为它一次只能改变横坐标或纵坐标,所以可以发现你从起点到终点的每一个 \(r_i\)\(c_i\) 的奇偶性是不变的,又因为每一行和每一列都会经过,所以可以发现起点到终点的矩形内坐标奇偶性全部相同,用线段树维护下区间有没有奇数或者偶数就可以了。

#include<bits/stdc++.h>
#define int long long
#define ls (k<<1)
#define rs (k<<1|1)
#define mid (l+r>>1)
using namespace std;
int n,q;
const int maxn=1e5+5;
int c[maxn];
int d[maxn];
int maxx[maxn*16][5];
void build3(int k,int l,int r){
	if(l==r){
		if(c[l]&1) maxx[k][3]=1;
		return;
	}
	build3(ls,l,mid);
	build3(rs,mid+1,r);
	maxx[k][3]=max(maxx[ls][3],maxx[rs][3]);
}
void build4(int k,int l,int r){
	if(l==r){
		if(!(c[l]&1)) maxx[k][4]=1;
		return; 
	}
	build4(ls,l,mid);
	build4(rs,mid+1,r);
	maxx[k][4]=max(maxx[ls][4],maxx[rs][4]);
}
void build1(int k,int l,int r){
	if(l==r){
		if(d[l]&1) maxx[k][1]=1;
		return;
	}
	build1(ls,l,mid);
	build1(rs,mid+1,r);
	maxx[k][1]=max(maxx[ls][1],maxx[rs][1]);
}
void build2(int k,int l,int r){
	if(l==r){
		if(!(d[l]&1)) maxx[k][2]=1;
		return; 
	}
	build2(ls,l,mid);
	build2(rs,mid+1,r);
	maxx[k][2]=max(maxx[ls][2],maxx[rs][2]);
}
int query(int k,int l,int r,int x,int y,int val){
	int res=0;
	if(x<=l&&r<=y){
		return maxx[k][val];
	}
	if(x<=mid){
		res=max(res,query(ls,l,mid,x,y,val));
	}
	if(y>mid){
		res=max(res,query(rs,mid+1,r,x,y,val));
	}
	return res;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>d[i];
	for(int i=1;i<=n;i++) cin>>c[i];
	build1(1,1,n);
	build2(1,1,n);
	build3(1,1,n);
	build4(1,1,n);
	while(q--){
		int stx,sty,edx,edy;
		cin>>stx>>sty>>edx>>edy;
		if(stx>edx) swap(stx,edx);
		if(sty>edy) swap(sty,edy);
		if((d[stx]+c[sty])%2!=0||(d[edx]+c[sty])%2!=0){
			cout<<"NO"<<'\n';
			continue;
		}
		if(d[stx]&1){
			if(query(1,1,n,stx,edx,2)+query(1,1,n,sty,edy,4)==0) cout<<"YES"<<'\n';
			else cout<<"NO"<<'\n';
		}
		else{
			if(query(1,1,n,stx,edx,1)+query(1,1,n,sty,edy,3)==0) cout<<"YES"<<'\n';
			else cout<<"NO"<<'\n';
		}
	}
	return 0;
}

D Find String in a Grid

3000分不会不丢人

E Songwriter

先倒着卡出范围,然后再正着求出答案

#include<bits/stdc++.h>
using namespace std;
int n,l,r,k;
const int maxn=1e5+5;
struct node{
	int l,r;
}p[maxn];
int a[maxn];
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>l>>r>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	p[n].l=l,p[n].r=r;
	for(int i=n-1;i;i--){
		if(a[i]==a[i+1]) p[i].l=p[i+1].l,p[i].r=p[i+1].r;
		else if(a[i]<a[i+1]) p[i].l=max(p[i+1].l-k,l),p[i].r=p[i+1].r-1; 
		else p[i].l=p[i+1].l+1,p[i].r=min(p[i+1].r+k,r);
		if(p[i].l>p[i].r||p[i].l<l||p[i].r>r){
			cout<<"-1";
			exit(0);
		}
	}
	int now=p[1].l;
	cout<<p[1].l<<" ";
	for(int i=2;i<=n;i++){
		if(a[i]>a[i-1]) now=max(now+1,p[i].l);
		if(a[i]<a[i-1]) now=max(now-k,p[i].l);
		cout<<now<<" ";
	}
	return 0;
}

G Performance Review

直接用线段树维护下区间最小值就行

#include<bits/stdc++.h>
#define mid (l+r>>1)
#define rs (k<<1|1)
#define ls (k<<1)
#define int long long
using namespace std;
int n,m,q;
const int maxn=1e5+5;
int a[maxn];
int r[maxn];
//int sum[maxn];
vector<int>b[maxn]; 
int sum[maxn*4];
int lazy[maxn*4];
void pushdown(int k,int l,int r){
	sum[ls]+=lazy[k];
	sum[rs]+=lazy[k];
	lazy[ls]+=lazy[k];
	lazy[rs]+=lazy[k];
	lazy[k]=0;
}
void add(int k,int l,int r,int x,int y,int val){
    if(x>y) return;
	if(x<=l&&r<=y){
		sum[k]+=val;
		lazy[k]+=val;
//		cout<<sum[k]<<" "<<lazy[k]<<'\n';
		return;
	}
	pushdown(k,l,r);
	if(x<=mid){
		add(ls,l,mid,x,y,val);
	}
	if(y>mid){
		add(rs,mid+1,r,x,y,val);
	}
	sum[k]=min(sum[ls],sum[rs]); 
}
int ask(int k,int l,int r,int x,int y){
	int res=1e18;
	if(x<=l&&r<=y){
		return sum[k];
	}
	pushdown(k,l,r);
	if(x<=mid){
		res=min(ask(ls,l,mid,x,y),res);
	}
	if(y>mid){
		res=min(ask(rs,mid+1,r,x,y),res);
	}
	return res;
}
int su;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>q;
	int now=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(a[i]<a[1]) now++;
	}
//	add(1,1,m,1,m,now);
	for(int i=1;i<=m;i++){
		cin>>r[i];
		
//		if(i==1) now=0;
//		cout<<i<<" "<<su<<" "<<now<<" "<<su+now-r[i]<<'\n';
		add(1,1,m,i,i,su+now-r[i]);
		su+=now;
		su-=r[i];	
		now=0;
		for(int j=1;j<=r[i];j++){
			int x;
			cin>>x;
			b[i].push_back(x);
			if(x<a[1]) now++;
		}
//		add(1,1,m,i,i,now);
	}
//	cout<<ask(1,1,m,1,m)<<'\n';
	for(int i=1;i<=q;i++){
		int x,y,z;
		cin>>x>>y>>z;
		if(b[x][y-1]>a[1]&&z<a[1]){
//			cout<<i<<"yes"<<'\n'; 
			add(1,1,m,x+1,m,1);
		}
		if(b[x][y-1]<a[1]&&z>a[1]){
//			cout<<i<<"no"<<'\n';
			add(1,1,m,x+1,m,-1);
		}
//		cout<<ask(1,1,m,1,m);
		if(ask(1,1,m,1,m)<0) cout<<0<<'\n';
		else cout<<1<<'\n';
		b[x][y-1]=z;
	}
	return 0;
}

posted @ 2023-11-10 21:01  jt0007  阅读(10)  评论(0)    收藏  举报