国庆1 B-Crazy Binary String(构造)
题意:有一串01串,求01串的(0和1数量相等的)最长子序列长度和最长子串长度
思路:1. 最长子序列长度就是0和1最小的个数的两倍
2. 求最长子串长度:
因为只有0和1,可以把0看作-1,那么开始求和,只要求和的数字回到之前有过的数字,那么这段子串就是0和1的个数相等的,所以可以用vector记录下每一个前缀和出现的位置,然后最晚出现的地方减去最早出现的地方就是01平衡的子串的长度
代码:
#include<bits/stdc++.h>
using namespace std;
vector<int >v[200005];int sum=0;
int main()
{
int n;cin>>n;string s;
cin>>s;int x=0,y=0;s=" "+s;v[100000].push_back(0);
for(int i=1;i<=n;i++){
if(s[i]=='1'){sum+=1;x++;}
else {sum-=1;y++;}
v[sum+100000].push_back(i);
}
int ans=0;
for(int i=0;i<=200000;i++){
if(v[i].size()==0)continue;
int r=(int)v[i].size()-1;
ans=max(ans,v[i][r]-v[i][0]);
}
cout<<ans<<" "<<2*min(x,y);
return 0;
}
H-Magic Line(几何)
题意:找到一根线把 点集 等分
思路:很数学,要计算斜率、直线公式什么的
代码:
#include<bits/stdc++.h>
using namespace std;
bool cmp(pair<int,int>a,pair<int,int>b)
{
if(a.first!=b.first)
return a.first<b.first;
return a.second<b.second;
}
int main()
{
int T;cin>>T;
while(T--){
pair<int,int>p[1003];
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>p[i].first>>p[i].second;
sort(p+1,p+n+1,cmp);
cout<<p[n/2].first-1<<" "<<999000000<<" "<<p[n/2].first+1<<" "<<2*p[n/2].second-999000000+1<<endl;
}
return 0;
}
J-LRU management(模拟)
思路:用stl的list模拟,list的迭代器不会被改变,且li.end()不指向内容
用map来记录list的迭代器,这样能快速消除想删掉的数字
代码:
#include<bits/stdc++.h>
using namespace std;
typedef pair<string,int> PSI;
typedef list <PSI>::iterator lit;
#define fi first
#define se second
map <string,lit>mp;
list <PSI> li;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);
int T;cin>>T;
while(T--){
mp.clear();li.clear();
int q,m;cin>>q>>m;int op,v;string s;int ans=0;
while(q--){
cin>>op>>s>>v;
if(op==0){
if(mp.count(s)==0||mp[s]==li.end()){
if(ans==m){
mp[li.begin()->fi]=li.end();
li.erase(li.begin());
}
else ans++;
li.push_back({s,v});
mp[s]=--li.end();
cout<<v<<'\n';
}
else{
lit it=mp[s];
int vv=(*it).se;
cout<<vv<<'\n';
li.erase(it);
li.push_back({s,vv});
mp[s]=--li.end();
}
}
else{
if(mp.count(s)==0||mp[s]==li.end()){cout<<"Invalid\n";continue;}
lit it=mp[s];
if(v==0){cout<<(*it).se<<"\n";continue;}
else if(v==1){
if(it==--li.end()){cout<<"Invalid\n";continue;}
else {
it++;
cout<<(*it).se<<"\n";continue;
}
}
else if(v==-1){
if(it==li.begin()){cout<<"Invalid\n";continue;}
else {
it--;cout<<(*it).se<<"\n";continue;
}
}
}
}
}
return 0;
}