#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int n,q;
int s[maxn];
int main()
{
scanf("%d%d",&n,&q);
for(int i=0;i<n;i++)
scanf("%d",&s[i]);
while(q--)
{
int x;
scanf("%d",&x);
int l=0,r=n-1,mid;
while(l<r)//求左端点
{
mid=l+r>>1;
if(s[mid]>=x)
r=mid;
else
l=mid+1;
}
if(s[r]==x)
{
printf("%d ",r);
l=r,r=n-1;
while(l<r)//求右端点
{
mid=l+r+1>>1;
if(s[mid]<=x)
l=mid;
else
r=mid-1;
}
printf("%d\n",l);
}
else
printf("-1 -1\n");
}
return 0;
}
求左端点判断条件为q[mid]>=x,找到大于等于x的最小序作为左边界,
求右端点时,判断条件为q[mid]<=x,找到小于等于x最大序作为有边界,但是求mid=l+r+1>>1, 不明白为什么要加1,手动模拟了题给的例子,不加的话会无限循环
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
double x;
bool flag=0;
scanf("%lf",&x);
if(x<0)
{
x=-x;
flag=1;
}
double l=0,r=x,mid;
// printf("%lf",abs(r-l));
while(r-l>0.0000001)
{
mid=(l+r)/2;
if(mid*mid*mid>x)
r=mid;
else
l=mid;
}
if(flag)
printf("-");
printf("%0.6lf",l);
return 0;
}
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
a[0]=0;
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
a[i]=a[i-1]+x;
}
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",a[y]-a[x-1]);
}
return 0;
}
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
using namespace std;
const int N = 1e3+10;
int a[N][N],s[N][N];
int main() {
int n,m,q;
cin>>n>>m>>q;
for (int i=1;i<=n;i++)
for (int j=1; j<=m;j++)
{
scanf("%d",&a[i][j]);
s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]+a[i][j]; // 求前缀和
}
while (q--) {
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("%d\n",s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]);
}
return 0;
}
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll n,h[maxn];
ll maxh=0;
int abc(ll mid)
{
for(int i=0;i<n;i++)
{
mid=mid+(mid-h[i]);
if(mid<0)
return 0;
if(mid>=maxh)
return 1;
}
return 1;
}
int main()
{
ll l=0,r,mid;
scanf("%lld",&n);
for(int i=0;i<n;i++)
{
scanf("%lld",&h[i]);
if(h[i]>maxh)
maxh=h[i];
}
r=maxh;
while(l<r)
{
mid=l+r>>1;
// printf("mid %d\n",mid);
if(abc(mid))
r=mid;
else
l=mid+1;
}
printf("%lld\n",r);
return 0;
}
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int x[maxn][2];
int n,k;
bool abc(int mid)
{
int ant=0;
for(int i=0;i<n;i++)
{
ant+=(x[i][0]/mid)*(x[i][1]/mid);
}
if(ant>=k)
return 1;
else
return 0;
}
int main()
{
scanf("%d%d",&n,&k);
int l=1,r=0,mid;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x[i][0],&x[i][1]);
if(x[i][0]>r)
r=x[i][0];
if(x[i][1]>r)
r=x[i][1];
}
while(l<r)
{
mid=l+r+1>>1;
if(abc(mid))
l=mid;
else
r=mid-1;
}
printf("%d\n",l);
return 0;
}
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1e7+10;
struct node{
int a;
int b;
int sum;
}s[maxn];
int n;
bool cmp(node a,node b)
{
if(a.sum!=b.sum) return a.sum<b.sum;
if(a.a!=b.a) return a.a<b.a;
if(a.b!=b.b) return a.b<b.b;
}
int main()
{
int n;
scanf("%d",&n);
int m=0;
for(int i=0;i*i<=n;i++)
{
for(int j=i;j*j+i*i<=n;j++)
{
s[m].a=i;
s[m].b=j;
s[m++].sum=i*i+j*j;
}
}
sort(s,s+m,cmp);
for(int i=0;i*i<=n;i++)
{
for(int j=0;j*j+i*i<=n;j++)
{
int t=n-i*i-j*j;
int l=0,r=m-1,mid;
while(l<r)
{
mid=r+l>>1;
if(s[mid].sum>=t)
r=mid;
else
l=mid+1;
}
if(s[l].sum==t)
{
printf("%d %d %d %d\n",i,j,s[r].a,s[r].b);
return 0;
}
}
}
return 0;
}