Cf训练
水题不贴码
B. Accordion
找风琴嘛。
#include<bits/stdc++.h>
#define MAX_INT ((unsigned)(-1)>>1)
#define MIN_INT (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
using namespace std;
string s;
int len;
int look(int l,int r)
{
if(l>=r) return -5;
int num=0;
for(int i=l+1;i<r;i++){
if(s[i]=='|'){
num++;
}
}
return num;
}
int findl()
{
for(int i=0;i<len;i++){
if(s[i]=='['){
for(int j=i;j<len;j++){
if(s[j]==':')
return j;
}
return 0;
}
}
return 0;
}
int findr()
{
for(int i=len-1;i>=0;i--){
if(s[i]==']'){
for(int j=i;j>=0;j--){
if(s[j]==':')
return j;
}
return len-1;
}
}
return len-1;
}
int main(void)
{
cin>>s;
len=s.length();
int l=findl(),r=findr();
if(l==0||r==len-1) cout<<-1;
else {
cout<<4+look(l,r);
}
return 0;
}
E.Polycarp’s New Job
钱的大小,注意长跟宽要匹对好,然后开个加速,没开加速wa了一发
#include<bits/stdc++.h>
#define MAX_INT ((unsigned)(-1)>>1)
#define MIN_INT (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
using namespace std;
int main(void)
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n;cin>>n;
char s;
int a,b;
int l=0,r=0;
while(n--){
cin>>s>>a>>b;
if(b>a) swap(a,b);
if(s=='+'){
l=max(l,a);
r=max(r,b);
}
else{
if(a>=l&&b>=r)
cout<<"YES";
else cout<<"NO";
cout<<endl;
}
}
return 0;
}
B.Letters Shop:
题意:在一段字符串种剪一段出来重新组合成新字符串
要记忆搜索的东西。
#include<bits/stdc++.h>
#define MAX_INT ((unsigned)(-1)>>1)
#define MIN_INT (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
using namespace std;
string s,c;
int show[30][200050];/*字符x第i次出现的位置*/
int sn[30];/*临时记录主字符串中字符个数*/
int num[30];
int main(void)
{
int n,m;cin>>n>>s>>m;
for(int i=0;i<n;i++){
show[s[i]-'a'][++sn[s[i]-'a']]=i;
}
while(m--){
memset(num,0,sizeof num);
cin>>c;
for(int i=0;i<c.length();i++){
num[c[i]-'a']++;
}
int ans=0;
for(int i=0;i<26;i++){
ans=max(ans,show[i][num[i]]);
}
cout<<ans+1<<endl;
}
return 0;
}
Division and Union:
题意,将很对线段分成任意的两组互不相关的两组
找出一个间断点是断开的就行。
#include<bits/stdc++.h>
#define MAX_INT ((unsigned)(-1)>>1)
#define MIN_INT (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
using namespace std;
struct node
{
int l,r,id;
}a[200005];
bool cmp1(node a,node b)
{
return a.l<b.l;
}
bool cmp2(node a,node b)
{
return a.id<b.id;
}
int main(void)
{
int t;cin>>t;
while(t--){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
a[i].id=i;
}
sort(a+1,a+1+n,cmp1);
int temp=0,r=a[1].r;
for(int i=2;i<=n;i++){
if(a[i].l>r){
temp=a[i].l;
break;
}
r=max(r,a[i].r);
}
if(temp==0) cout<<-1<<endl;
else{
sort(a+1,a+1+n,cmp2);
for(int i=1;i<=n;i++){
if(a[i].r<temp) cout<<1<<" ";
else cout<<2<<" ";
}
cout<<endl;
}
}
return 0;
}
本次训练,主要思维题。打完补题
进程:了解数论余数定理
下周目标:深入了解数论的同时,加强树的遍历操作。
学习kuanbin
争取下周比赛顺手。