一开始想的是前缀和,发现自己想多了,直接从前往后扫就行了,每次看去一个加一个,用map当桶来维护就行了
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
int n,len;
map<ll,ll>mp;
ll a[N];
ll res;
ll reu;
int main()
{
cin>>n>>len;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=len;i++){
mp[a[i]]++;
if(mp[a[i]]==1)res++;
}
reu = max(res,reu);
for(int i=2;i+len-1<=n;i++){
mp[a[i-1]]--;
if(!mp[a[i-1]])res--;
mp[a[i+len-1]]++;
if(mp[a[i+len-1]]==1)res++;
reu = max(res,reu);
}
cout<<reu;
}
组合思想,有点DP的感觉,从前往后扫就行,注意每一个位置的贡献都要依赖他前面的东西
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
string str;
const int mod = 1e9+7;
ll res[10];
int main()
{
cin>>str;
int len = str.size();
for(int i=0;i<len;i++){
if(str[i]=='c'){
res[1]++;
res[1]%=mod;
}else if(str[i]=='h'){
res[2]+=res[1];
res[2]%=mod;
}else if(str[i]=='o'){
res[3]+=res[2];
res[3]%=mod;
}else if(str[i]=='k'){
res[4]+=res[3];
res[4]%=mod;
}else if(str[i]=='u'){
res[5]+=res[4];
res[5]%=mod;
}else if(str[i]=='d'){
res[6]+=res[5];
res[6]%=mod;
}else if(str[i]=='a'){
res[7]+=res[6];
res[7]%=mod;
}else if(str[i]=='i'){
res[8]+=res[7];
res[8]%=mod;
}
}
cout<<res[8]%mod<<endl;
}
一眼双指针,自己wa了两发,注意在开始结束都要特判一下~
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
int b[N];
int n,m;
int res=0x3f3f3f3f;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>b[i];
sort(a+1,a+1+n);
sort(b+1,b+1+m);
int j = 1;
for(int i = 1;i<=n;i++){
if(j<=m){
res = min(res,abs(a[i]-b[j]));
}
while(b[j]<=a[i]&&j<=m){
res = min(res,abs(a[i]-b[j]));
j++;
}
if(j<=m){
res = min(res,abs(a[i]-b[j]));
}
}
if(j<=m)
res = min(res,abs(a[n]-b[j]));
cout<<res<<endl;
}
离散化之后输出就行了~~
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
vector<int>vecx;
vector<int>vecy;
struct Node{
int x,y;
}node[N];
int h,w,n;
int find1(int x){
return lower_bound(vecx.begin(),vecx.end(),x)-vecx.begin()+1;
}
int find2(int y){
return lower_bound(vecy.begin(),vecy.end(),y)-vecy.begin()+1;
}
int main()
{
cin>>h>>w>>n;
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
node[i].x = x;
node[i].y = y;
vecx.push_back(x);
vecy.push_back(y);
}
sort(vecx.begin(),vecx.end());
vecx.erase(unique(vecx.begin(),vecx.end()),vecx.end());
sort(vecy.begin(),vecy.end());
vecy.erase(unique(vecy.begin(),vecy.end()),vecy.end());
for(int i=1;i<=n;i++){
int x = node[i].x;
int y = node[i].y;
printf("%d %d\n",find1(x),find2(y));
}
}
范围很小,直接暴搜就行了
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
vector<string>str;
string str1;
int n,m;
int len;
bool st[15];
void dfs(int u,string tem){
if(u>len){
//cout<<tem<<endl;
str.push_back(tem);
tem = "";
return;
}
for(int i=0;i<len;i++){
if(!st[i]){
st[i] = 1;
tem+=str1[i];
//cout<<tem<<" "<<str1[i]<<end
dfs(u+1,tem);
st[i] = 0;
tem = tem.substr(0,tem.size()-1);
}
}
}
int main()
{
cin>>str1;
cin>>m;
len = str1.size();
string tem1 = "";
dfs(1,tem1);
sort(str.begin(),str.end());
str.erase(unique(str.begin(),str.end()),str.end());
//for(auto t:str)cout<<t<<endl;
cout<<str[m-1];
}