A.
单调队列维护一个递增序列。那么可以知道这个递增序列的第一个数就是区间最小值,那如果在某个区间内有更小的值出现,原最小值和队列中元素将被清空,所以可以通过元素个数的变化来判断最小值的下标的变化
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
int a[maxn],b[maxn];
int quea[maxn],queb[maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
int la=0,ra=0,lb=0,rb=0;
int ans=n;
for(int i=1;i<=n;i++)
{
while(la<=ra&&a[i]<quea[ra]) ra--;
quea[++ra]=a[i];
while(lb<=rb&&b[i]<queb[rb]) rb--;
queb[++rb]=b[i];
if(ra!=rb)
{
ans=i-1;
break;
}
}
printf("%d\n",ans);
}
}
B.
待定系数法:
我们可以假设
那么要求C1,左右两边同乘 ,就变成了
然后令 ,可以解得
类推 累加即可
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5+7;
const int mod = 1e9+7;
ll a[maxn],c[maxn];
ll poww(ll a,ll b=mod-2)
{
ll ans=1,base=a;
while(b!=0)
{
if(b&1!=0) ans=(ans*base)%mod;
base=(base*base)%mod;
b>>=1;
}
return ans;
}
int main()
{
int n;
while(~(scanf("%d",&n)))
{
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
{
c[i]=1ll;
for(int j=1;j<=n;j++)
{
if(i!=j) c[i]=c[i]*(a[j]*a[j]%mod-a[i]*a[i]%mod+mod)%mod;
}
c[i]=poww(c[i]);
}
ll ans=0;
for(int i=1;i<=n;i++)
{
ll tmp=poww(2)*poww(a[i])%mod*c[i]%mod;
ans=(ans+tmp)%mod;
}
printf("%lld\n",ans);
}
}
J.
pytxdy
代码:
while 1:
try:
x, a, y, b = input().split()
x = int(x)
y = int(y)
a = int(a)
b = int(b)
if x * b == y * a:
print("=")
elif x * b < y * a:
print("<")
else:
print(">")
except:
break