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;
}


浙公网安备 33010602011771号