Codeforces Round #703 (Div. 2)
Virtual participation
A. Shifting Stacks
-
问题描述:
给定一个长度为n的序列,每次操作:序列中前一个数-1,与之相邻的后一个数+1.
问:能否使这个给定的序列成为单调递增的序列. -
思路:
求一个前缀和,看后面的每一个数是否大于前面这些数的和.全部满足才是 yes -
code
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define N 1000005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline int read()
{
int x=0,w=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
return w==1?x:-x;
}
ll t,n,a[N];
int main()
{
t = read();
while(t--)
{
n = read();
rep(i,1,n) a[i] = read();
ll s=0;
ll fl=0;
rep(i,1,n)
{
if(a[i]+s<i-1)
{
fl=1;
break;
}
s+=a[i]-i+1;
}
if(fl==0) printf("yes\n");
else printf("no\n");
}
return 0;
}
B. Eastern Exhibition
-
问题描述:
在二维平面上有n个整数坐标的点,问有几个整数坐标的点(x,y),|x-xi|+|y-yi|最小. -
思路:
分别做两个一维的答案满足乘法原理. -
code:
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define N 10005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline int read()
{
int x=0,w=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
return w==1?x:-x;
}
ll t,n,x[N],y[N];
int main()
{
t = read();
while(t --)
{
n = read();
rep(i,1,n){x[i]=read();y[i]=read();}
sort(x+1,x+n+1);
sort(y+1,y+1+n);
if(n%2==1) printf("1\n");
else
{
ll ans1 = x[n/2+1]-x[n/2]+1;
ll ans2 = y[n/2+1]-y[n/2]+1;
printf("%lld\n",ans1*ans2);
}
}
return 0;
}
C(C1+C2).Guessing the Greatest
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define maxn 1000005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline int read()
{
int x=0,w=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
return w==1?x:-x;
}
int n;
int get(int l,int r)
{
if(l>=r) return 0;
int t;
cout<<'?'<<' '<<l<<' '<<r<<endl;
t=read();
return t;
}
int main()
{
// freopen("t1.in","r",stdin);
n = read();
int l=1,r=n;
int t;
t = get(1,n);
while(l!=r)
{
int mid = (l+r)>>1;
if(t>mid)
{
if(get(mid+1,n)==t) l=mid+1;
else r=mid;
}
else
{
if(get(1,mid)==t) r=mid;
else l=mid+1;
}
}
cout<<"! "<<l<<endl;
return 0;
}
D. Max Median
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define maxn 1000005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline int read()
{
int x=0,w=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
return w==1?x:-x;
}
int n,k,a[maxn],b[maxn],dp[maxn],pre[maxn],f[maxn];
inline bool jud(int x)
{
rep(i,1,n) if(a[i]>=x) b[i]=1; else b[i]=-1; rep(i,1,n) pre[i]=pre[i-1]+b[i];
per(i,n,1) dp[i]=max(0,dp[i+1]+b[i]);
rep(i,k,n) if(pre[i]-pre[i-k]+dp[i+1]>0) return true;
return false;
}
int main()
{
n=read(); k=read(); rep(i,1,n) a[i]=read();
int l=1,r=n,ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(jud(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号