1 2 3 4

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;
}    
posted @ 2021-03-15 07:45  snuonuo  阅读(41)  评论(0)    收藏  举报