015.洛谷模拟题
做了几道模拟题,总结一下
- 动手之前一定要好好读题,遗漏信息大概率WA到死
- 不要怕麻烦,码量大是模拟题的特点
- 对算法要求一般不高
- 细心,逻辑链要完整
处理环形数组
#include<bits/stdc++.h>
using namespace std;
namespace IO{template<typename T>void read(T&x){x=0;bool f=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}if(f)x=-x;}void read(char&c){c=getchar();while(isspace(c))c=getchar();}void read(string&s){s.clear();char ch=getchar();while(isspace(ch))ch=getchar();while(!isspace(ch)&&ch!=EOF){s+=ch;ch=getchar();}}template<typename T,typename...Args>void read(T&first,Args&...rest){read(first);read(rest...);}template<typename T>void wr(T x){if(x==0){putchar('0');return;}if(x<0){putchar('-');x=-x;}char stk[20];int top=0;while(x){stk[++top]=x%10+'0';x/=10;}while(top){putchar(stk[top--]);}}void wr(const char c){putchar(c);}void wr(const string&s){for(char c:s)putchar(c);}void wr(const char*s){while(*s)putchar(*s++);}template<typename T>void wr(const T&x,char sep){wr(x);putchar(sep);}template<typename T,typename...Args>void wr(const T&first,const Args&...rest){wr(first);((putchar(' '),wr(rest)),...);}}using namespace IO;
typedef long long ll;
typedef pair<int,int> pii;
void solve(){
int n,m;
read(n,m);
string s;
vector<int>a(n);
vector<string>b(n);
for(int i=0;i<n;++i)read(a[i],b[i]);
int x,y,cur=0;
while(m--){
read(x,y);y%=n;
if(a[cur]==x)cur=(cur-y+n)%n;
else cur=(cur+y+n)%n;
}
wr(b[cur]);
}
int main(){
int T=1;
//read(T);
while(T--){
solve();
}
}
简单记数
void solve(){
int n,na,nb;
read(n,na,nb);
vector<int>a(na),b(nb);
for(int i=0;i<na;++i)read(a[i]);
for(int i=0;i<nb;++i)read(b[i]);
int A=0,B=0;
int i=0,j=0;
while(n--){
if(a[i]==0){
if(b[j]==2||b[j]==3)A++;
if(b[j]==1||b[j]==4)B++;
}
if(a[i]==1){
if(b[j]==0||b[j]==3)A++;
if(b[j]==2||b[j]==4)B++;
}
if(a[i]==2){
if(b[j]==4||b[j]==1)A++;
if(b[j]==0||b[j]==3)B++;
}
if(a[i]==3){
if(b[j]==2||b[j]==4)A++;
if(b[j]==0||b[j]==1)B++;
}
if(a[i]==4){
if(b[j]==0||b[j]==1)A++;
if(b[j]==3||b[j]==2)B++;
}
i=(i+1)%na;
j=(j+1)%nb;
}
wr(A,B);
}
处理
- 全为0
- 1,-1
- 首位,末位
void solve(){
int n;read(n);
if(n==0){
int x;
read(x);
wr(x);
return ;
}
vector<int>a(n+1);
bool f=0;
for(int i=0;i<=n;++i){
read(a[i]);
if(a[i])f=1;
}
if(f==0||n==0){
wr(0);
return ;
}
if(a[0]==-1)wr("-x^"),wr(n);
else if(a[0]==1)wr("x^"),wr(n);
else if(a[0]>1)wr(a[0]),wr("x^"),wr(n);
else if(a[0]<-1)wr(a[0]),wr("x^"),wr(n);
for(int i=1;i<n-1;i++){
if(a[i]==-1)wr("-x^"),wr(n-i);
else if(a[i]==1)wr("+x^"),wr(n-i);
else if(a[i]>1)wr('+'),wr(a[i]),wr("x^"),wr(n-i);
else if(a[i]<-1)wr(a[i]),wr("x^"),wr(n-i);
}
if(a[n-1]==-1)wr("-x");
else if(a[n-1]==1)wr("+x");
else if(a[n-1]>1)wr('+'),wr(a[n-1]),wr("x");
else if(a[n-1]<-1)wr(a[n-1]),wr("x");
if(a[n]>0)wr('+'),wr(a[n]);
if(a[n]<0)wr(a[n]);
}
矩阵翻转
void solve(){
int n,m;
read(n,m);
int t=1;
vector<vector<int>>M(n+1,vector<int>(n+1));
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
M[i][j]=t++;
}
}
int x,y,r,z;
while(m--){
read(x,y,r,z);
if(z){
for(int k=x-r;k<=x+r;k++){
int i=y-r,j=y+r;
while(i<j){
swap(M[k][i],M[k][j]);
i++,j--;
}
}
for(int i=x-r;i<=x+r;++i){
for(int j=y-r;j<=y+r;j++){
if(i-x<j-y)swap(M[i][j],M[x+j-y][y+i-x]);
}
}
}
else{
for(int i=x-r;i<=x+r;++i){
for(int j=y-r;j<=y+r;j++){
if(i-x<j-y)swap(M[i][j],M[x+j-y][y+i-x]);
}
}
for(int k=x-r;k<=x+r;k++){
int i=y-r,j=y+r;
while(i<j){
swap(M[k][i],M[k][j]);
i++,j--;
}
}
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
wr(M[i][j],' ');
}
wr('\n');
}
}
没考虑数字和字母搭配,还有数字不需要转大写
void solve(){
int p1,p2,p3;
read(p1,p2,p3);
string s;
read(s);
int ls=s.length();
string ans="";
for(int i=0;i<ls;i++){
if(s[i]!='-'||i==0||i==ls-1){
ans+=s[i];
continue;
}
char l=s[i-1],r=s[i+1];
if(((isdigit(l)&&isdigit(r))||(islower(r)&&islower(l)))&&r>l){
if(r==l+1)continue;
string t="";
if(p1==1){
for(char j=l+1;j<r;j++)
for(int k=0;k<p2;k++)t+=j;
}
else if(p1==2){
for(char j=l+1;j<r;j++){
char ch=j;
if(islower(j))ch=j-'a'+'A';
for(int k=0;k<p2;k++){
t+=ch;
}
}
}
else{
int cnt=p2*(r-l-1);
for(int k=0;k<cnt;k++)t+='*';
}
if(p3==2)reverse(t.begin(),t.end());
ans+=t;
}
else ans+='-';
}
wr(ans);
}
哈希,排序技巧
void solve(){
int n;read(n);
st A;
vector<st>ALL,FBZ,a;
for(int i=0;i<n;i++){
read(A.name,A.duty,A.w,A.age);A.id=i;
if(A.duty=="BangZhu")ALL.push_back(A);
else if(A.duty=="FuBangZhu")FBZ.push_back(A);
else a.push_back(A);
}
for(int i=0;i<(int)a.size();i++){
for(int j=i;j>0;--j){
if(a[j-1].w<a[j].w)swap(a[j],a[j-1]);
else break;
}
}
for(int i=0;i<(int)a.size();++i){
if(i<2)a[i].duty="HuFa";
else if(i<6)a[i].duty="ZhangLao";
else if(i<13)a[i].duty="TangZhu";
else if(i<38)a[i].duty="JingYing";
else a[i].duty="BangZhong";
}
for(int i=0;i<(int)FBZ.size();++i){
for(int j=i;j>0;--j){
if(FBZ[j-1].age<FBZ[j].age)swap(FBZ[j],FBZ[j-1]);
else break;
}
}
for(auto x:FBZ)ALL.push_back(x);
for(auto x:a)ALL.push_back(x);
unordered_map<string,int>rank={
{"BangZhu", 7}, {"FuBangZhu", 6}, {"HuFa", 5},
{"ZhangLao", 4}, {"TangZhu", 3}, {"JingYing", 2}, {"BangZhong", 1}
};
sort(ALL.begin(),ALL.end(),[&](st a,st b){
if(rank[a.duty]!=rank[b.duty])return rank[a.duty]>rank[b.duty];
if(a.age!=b.age)return a.age>b.age;
return a.id<b.id;
});
for(auto x:ALL)wr(x.name,x.duty,x.age,'\n');
}
- 哈希判断死循环
- 扩图,简化判断
vector<vector<char>>M(12,vector<char>(12,'*'));
struct p{
int x,y,d;
}f,c;
void move(p& cur){
int x=cur.x,y=cur.y;
if(cur.d==0){
if(M[x-1][y]=='*')cur.d=1;
else cur.x--;
}
else if(cur.d==1){
if(M[x][y+1]=='*')cur.d=2;
else cur.y++;
}
else if(cur.d==2){
if(M[x+1][y]=='*')cur.d=3;
else cur.x++;
}
else{
if(M[x][y-1]=='*')cur.d=0;
else cur.y--;
}
}
int h(p f,p c){
return f.x+f.y*10+f.d*10000+c.x*100+c.y*1000+c.d*40000;
}
bool nomeet(p f,p c){
if(f.x==c.x&&f.y==c.y)return 0;
return 1;
}
void solve(){
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
read(M[i][j]);
if(M[i][j]=='F')f.x=i,f.y=j;
if(M[i][j]=='C')c.x=i,c.y=j;
}
}
f.d=0;
c.d=0;
int t=0;
bitset<2000000>vis;
while(nomeet(f,c)){
t++;
if(vis[h(f,c)]){
wr(0);
return;
}
vis[h(f,c)]=1;
move(f);
move(c);
}
wr(t);
}
题目好长,需要一点耐心
void solve(){
int m,n;
read(m,n);
vector<int>o(m*n);
for(int i=0;i<n*m;++i)read(o[i]);
vector<vector<int>>nm(n+1,vector<int>(m+1));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
read(nm[i][j]);
vector<vector<int>>nt(n+1,vector<int>(m+1));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;++j)
read(nt[i][j]);
vector<bitset<100000000>>mt(m+1);
vector<int>nstep(n+1,1);
vector<int>npre(n+1);
int ans=0;
for(int x:o){
int step=nstep[x]++;
int mar=nm[x][step];
int cost=nt[x][step];
int i=npre[x];
while(1){
while(mt[mar][i])i++;
bool ok=1;
for(int j=0;j<cost;++j){
if(mt[mar][i+j]){
ok=0;
i+=j+1;
break;
}
}
if(ok){
for(int j=0;j<cost;j++){
mt[mar][i+j]=1;
}
npre[x]=i+cost;
ans=max(ans,npre[x]);
break;
}
}
}
wr(ans);
}

浙公网安备 33010602011771号