#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
fh=-1,jp=getchar();
while (jp>='0'&&jp<='9')
out=out*10+jp-'0',jp=getchar();
return out*fh;
}
int n;
const int MAXN=3e5+10;
int c[MAXN];
int check(int x)
{
for(int i=1;i+x<=n;++i)
if(c[i]!=c[i+x])
return 1;
return 0;
}
int pos[MAXN];
set<int> s;
int main()
{
n=read();
s.insert(n+1);
int ans=0;
for(int i=1;i<=n;++i)
{
int x=read();
int y=pos[x];
if(y)
s.erase(y);
int p=*s.begin();
ans=max(ans,i-p);
if(!pos[x])
pos[x]=i;
if(pos[x])
s.insert(pos[x]);
}
cout<<ans<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define mp make_pair
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
fh=-1,jp=getchar();
while (jp>='0'&&jp<='9')
out=out*10+jp-'0',jp=getchar();
return out*fh;
}
int n,h;
const int MAXN=1e3+10;
int a[MAXN];
int b[MAXN],tp=0;
bool check(int k)
{
for(int i=1;i<=k;++i)
b[i]=a[i];
sort(b+1,b+1+k);
int f=0,rs=h;
for(int i=k;i>=1;--i)
{
if(!f)
{
rs-=b[i];
if(rs<0)
return false;
}
f^=1;
}
return true;
}
int main()
{
n=read(),h=read();
int s=0;
for(int i=1;i<=n;++i)
a[i]=read();
int L=1,R=n;
int ans=0;
while(L<=R)
{
int mid=(L+R)>>1;
if(check(mid))
ans=mid,L=mid+1;
else
R=mid-1;
}
cout<<ans<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
fh=-1,jp=getchar();
while (jp>='0'&&jp<='9')
out=out*10+jp-'0',jp=getchar();
return out*fh;
}
const int MAXN=512;
int a[MAXN][MAXN],b[MAXN][MAXN];
int main()
{
int n=read(),m=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
a[i][j]=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
b[i][j]=read();
for(int i=1;i<=n;++i)
{
int s1=0,s2=0;
for(int j=1;j<=m;++j)
s1+=a[i][j],s2+=b[i][j];
s1&=1,s2&=1;
if(s1!=s2)
return puts("No"),0;
}
for(int j=1;j<=m;++j)
{
int s1=0,s2=0;
for(int i=1;i<=n;++i)
s1+=a[i][j],s2+=b[i][j];
s1&=1,s2&=1;
if(s1!=s2)
return puts("No"),0;
}
puts("Yes");
return 0;
}
可以考虑用整个区间 \([s_1+l,s_n+r]\) 的长度减去中间没有覆盖到的部分.容易发现这样的部分只可能出现在两条相邻线段之间,可以直接用 \(\max(s_{i+1}+l-s_i-r-1,0)\) 来计算.那么这次询问的答案就是
\[
ans=s_n+r-s_1-l+1-\sum_{i=1}^{n-1} \max(s_{i+1}+l-s_i-r-1,0)\=s_n+r-s_1-l+1-\sum_{i=1}^{n-1} \max(s_{i+1}-s_i-(r-l+1),0)
\]
记 \(b_i=s_{i+1}-s_i\) ,将 \(b_i\) 排序后记录一下前缀和,询问时二分找出 \(b_i\geq r-l+1\) 的第一个位置,只算后面的部分即可.时间复杂度 \(O(nlogn+qlogn)\) .
#include<bits/stdc++.h>
#define inf (1e18)+10
using namespace std;
typedef long long ll;
inline ll read()
{
ll out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
fh=-1,jp=getchar();
while (jp>='0'&&jp<='9')
out=out*10+jp-'0',jp=getchar();
return out*fh;
}
const int MAXN=1e6+10;
ll n,a[MAXN];
ll b[MAXN];
ll sum[MAXN];
int main()
{
n=read();
for(int i=1;i<=n;++i)
a[i]=read();
sort(a+1,a+1+n);
for(int i=1;i<n;++i)
b[i]=a[i+1]-a[i];
sort(b+1,b+n);
for(int i=1;i<n;++i)
sum[i]=sum[i-1]+b[i];
int Q=read();
while(Q--)
{
ll l=read(),r=read();
ll s=r-l+1;
ll ans=a[n]+r-a[1]-l+1;
if(s>b[n-1])
{
cout<<ans<<' ';
continue;
}
int p=lower_bound(b+1,b+n,s)-b;
ans-=sum[n-1]-sum[p-1];
ans+=1LL*(n-p)*s;
cout<<ans<<' ';
}
return 0;
}
原文:https://www.cnblogs.com/jklover/p/10664164.html