暑假刷题第13天--7/25

P2216 [HAOI2007] 理想的正方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)(单调队列)

#include<iostream>
#include<deque>
using namespace std;
int v[1005][1005],mi1[1005][1005],ma1[1005][1005],ma2[1005][1005],mi2[1005][1005];
int main(){
	int a,b,n;
	cin>>a>>b>>n;
	for(int i=0;i<a;i++){
		for(int j=0;j<b;j++){
			cin>>v[i][j];
		}
	}
	for(int i=0;i<a;i++){
		deque<int>q,Q;
		for(int j=0;j<b;j++){
			if(!q.empty()&&j-q.front()>=n)q.pop_front();
			if(!Q.empty()&&j-Q.front()>=n)Q.pop_front();
			while(!q.empty()&&v[i][q.back()]>v[i][j])q.pop_back();
			while(!Q.empty()&&v[i][Q.back()]<v[i][j])Q.pop_back();
			q.push_back(j); 
			Q.push_back(j); 
			if(j>=n-1){
				ma1[i][j]=v[i][Q.front()];
				mi1[i][j]=v[i][q.front()];
			}
		}
	}
	for(int i=n-1;i<b;i++){
		deque<int>q,Q;
		for(int j=0;j<a;j++){
			if(!q.empty()&&j-q.front()>=n)q.pop_front();
			if(!Q.empty()&&j-Q.front()>=n)Q.pop_front();
			while(!q.empty()&&mi1[q.back()][i]>mi1[j][i])q.pop_back();
			while(!Q.empty()&&ma1[Q.back()][i]<ma1[j][i])Q.pop_back();
			q.push_back(j); 
			Q.push_back(j); 
			if(j>=n-1){
				ma2[j][i]=ma1[Q.front()][i];
				mi2[j][i]=mi1[q.front()][i];
			}
		}
	}
	int ans=1e9+6;
	for(int i=n-1;i<a;i++){
		for(int j=n-1;j<b;j++){
			ans=min(ma2[i][j]-mi2[i][j],ans);
		}
	}
	cout<<ans<<endl;
} 

P2034 选择数字 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)(单调队列优化dp)

//删除范围内最小的数
#include<iostream>
#include<deque>
using namespace std;
const int N=100005;
long long a[N],dp[N];
int main(){
	long long n,k;
	cin>>n>>k;
	long long sum=0;
	for(int i=0;i<n;i++){
		cin>>a[i];
		sum+=a[i];
	}
	deque<int>q;
	for(int i=0;i<n;i++){
		if(i<=k){
			dp[i]=a[i];
		}
		else {
			dp[i]=dp[q.front()]+a[i];
		}
		if(!q.empty()&&i-q.front()>=k+1){
			q.pop_front();
		}
		while(!q.empty()&&dp[q.back()]>dp[i])q.pop_back();
		q.push_back(i);
	}
	long long mi=1e17+6;
	for(int i=n-1;i>=n-k-1;i--){
		mi=min((long long)mi,(long long)dp[i]);
	}
	cout<<sum-mi<<endl;
} 

135. 最大子序和 - AcWing题库

//固定右边界,只需求规定范围内的最小左边界
#include<iostream>
#include<deque>
using namespace std;
const int N=300005;
int a[N],s[N];
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s[i]+=s[i-1]+a[i];
	}
	deque<int>q;
	q.push_back(0);
	int ans=-1e10-6;
	for(int i=1;i<=n;i++){
		if(!q.empty()&&i-q.front()>=m+1)q.pop_front();
		ans=max(ans,s[i]-s[q.front()]);
		while(!q.empty()&&s[q.back()]>s[i])q.pop_back();
		q.push_back(i);
	}
	cout<<ans<<endl;
} 

138. 兔子与兔子 - AcWing题库(字符串hash)

#include<iostream>
#include<deque>
#include<map>
#include<string>
using namespace std;
#define ull unsigned long long
const int N=1000005;
int a[6];
ull f[N],p[N];
int w=131;
int main(){
	string s;
	cin>>s;
	p[0]=1;
	f[0]=0; 
	for(int i=0;i<s.size();i++){
		f[i+1]=f[i]*131+s[i]-'a'+1;
		p[i+1]=p[i]*131;
	}
	int m;
	cin>>m;
	for(int i=0;i<m;i++){
		int l1,l2,r1,r2;
		cin>>l1>>r1>>l2>>r2;
		ull k=f[r1]-f[l1-1]*p[r1-l1+1];
		ull k2=f[r2]-f[l2-1]*p[r2-l2+1];
		if(k==k2){
			cout<<"Yes"<<endl;
		}
		else cout<<"No"<<endl;
	}
} 

P3370 【模板】字符串哈希 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)(字符串hash模板)

#include<iostream>
#include<deque>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
#define ull unsigned long long
const int N=1000005;
ull a[10005],mod=100000000000000007;
int w=131;
ull h(string s){
	ull ans=0;
	for(int i=0;i<s.size();i++){
		ans=(ans*131+s[i])%mod;
	}
	return ans;
}
int main(){
	int n;
	cin>>n;
	int t=0;
	for(int i=0;i<n;i++){
		string s;
		cin>>s;
		a[t++]=h(s);
	}
	sort(a,a+n);
	int ans=1;
	for(int i=1;i<n;i++){
		if(a[i]!=a[i-1])ans++;
	}
	cout<<ans<<endl;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值