https://codeforces.com/contest/1062/problem/A
1<=n<=100 1<=ai<=1000
最多删除数量 可以还原A数组
8
2 3 4 5 997 998 999 1000
前半部分2 后半部分有1000 是3
输出3
补全后答案直接是删的个数
O(n)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 1e6 + 10;
const int INF=0x3f3f3f3f;
ll n,k,cnt,ans,s,f;
ll a[maxn],minn=INF,maxx;
int main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
a[0]=0;a[n+1]=1001;
for(int i=1;i<=n;i++){
if(a[i-1]+1==a[i] && a[i]+1==a[i+1])
ans++;
}
cout<<ans<<endl;
return 0;
}
双指针
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 1e6 + 10;
const int INF=0x3f3f3f3f;
ll n,k,cnt,ans,s,f;
ll a[maxn],minn=INF,maxx;
int main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){ //i为左指针 pre右指针
ll pre=i;
cnt=0; //连续个数
while(a[pre]==a[pre+1]-1){
pre++;
cnt++;//对数
}
if(pre!=i)
cnt++;
ans=cnt-2;
if(a[i]==1 && i==1)
ans++;
if(a[n]==1000 && pre==n)
ans++;
// cout<<ans<<endl;
maxx=max(maxx,ans);
}
cout<<maxx<<endl;
return 0;
}
/*
6
1 3 4 5 6 9
7
1 2 3 4 997 998 999
*/
给一个01区间 拿走一个值快乐值+xi 同时其他值都增加xi 求最大快乐值
区间全为0 +0不变
优先考虑拿1 1+2+4+8… 2^n-1
剩下的0 为1倍 的1的个数前缀和 2^num1-1 2倍的 4倍的
2^num0-1倍 1的个数的前缀和
n,q<=1e5 每次查询区间l-r内最优快乐值
4 2
1011
1 4
3 4
14
3
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const ll mod=1e9+7;
ll n,q,l,r,sum[maxn],a[maxn],b[maxn],ans,res;
string s;
ll ksm(ll a,ll b){
ll res=1;
while(b){
if(b&1)
res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main(){
cin>>n>>q;
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='1')
sum[i+1]=sum[i]+1;
else
sum[i+1]=sum[i];
}
while(q--){
cin>>l>>r;
ll num1=sum[r]-sum[l-1];
ll num0=r-l+1-num1;
ans=ksm(2,num1)-1;
ans%=mod;
res=ksm(2,num0)-1;
res%=mod;
res=res*ans%mod;
cout<<(ans+res)%mod<<endl;
}
return 0;
}
D 埃氏筛 素数筛 nlogn n<=1e5
transform a into b if and only if there exists an integer x such that 1<|x| and (a⋅x=b or b⋅x=a)
T=4 求最大|x|的和
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const ll mod=1e9+7;
ll n,q,sum[maxn],a[maxn],b[maxn],ans,res,cnt;
string s;
ll ksm(ll a,ll b){
ll res=1;
while(b){
if(b&1)
res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
//n=6
//2->4->-2->-4->2
//2->6->-2->-6->2
//3->6->-3->-6->3
int main(){
cin>>n;
for(int i=2;i<=n;i++){
for(int j=2*i;j<=n;j+=i){
ans+=4*(j/i);
}
}
cout<<ans<<endl;
return 0;
}