#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; }
題面太鬼畜了...建議直接看 $Formally$ 那一段.c++
首先容易發現, $s$ 數組的順序對答案是不影響的.因此咱們能夠先將 $s$ 從小到大排序.數組
每次詢問 $(l,r)$ ,對於每一個 $s_i$ ,它所貢獻的數就是 $[s_i+l,s_i+r]$ 這一段,那麼就等價於給了 $n$ 條長度同樣的線段,問覆蓋的長度.spa
能夠考慮用整個區間 $[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) $$rest
記 $b_i=s_{i+1}-s_i$ ,將 $b_i$ 排序後記錄一下前綴和,詢問時二分找出 $b_i\geq r-l+1$ 的第一個位置,只算後面的部分便可.時間複雜度 $O(nlogn+qlogn)$ .code
#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; }
#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=3e5+10; int a[MAXN]; ll ans=0,rest=0; int main() { int n=read(); for(int i=1;i<=n;++i) { int x=read(); ll p=min(1LL*x/2,rest); ans+=p; rest-=p; x-=p*2; ans+=x/3; x%=3; rest+=x; } cout<<ans<<endl; return 0; }