Codeforces1062A 双指针 坑 C快速幂+贪心

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值