首页 » 未分类 » 正文

贝壳找房户外拓展(简单)


链接:https://nanti.jisuanke.com/t/27117

描述

贝壳找房的销售顾问每天要带客户看很多房源,这对他们来说是一件体力活,所以他们要经常进行户外拓展来增强体力。

这一次他们进行的拓展是在一个 n × m 的矩形地图方格地图上玩游戏,最初,地图是空的。

游戏一共进行 q 轮,第 i 轮,会是以下操作之一

假设在这之前有 k-1 次 1 操作,在 (l,y) 到 (r,y) 线段之间每个格子里面摆放一个属于第 k 组的石子,保证操作之前 y 这一行没有其他的棋子。

某人从 (x,l) 沿着直线走到 (x,r),最开始他的愉悦值是 0,每当他遇到组 j 的棋子,他的愉悦值会从 x 变为 pj * x + qj ,输出走完之后这个人的愉悦值。

删除某一组棋子。

所有输出对 323232323(质数)取模。

输入格式

第一行三个整数 n,m,q,分别表示地图的长,宽和游戏的轮数。

接下来 q 行,每行一个操作。

每行首先一个字母表示操作的类型。

如果是’I’,表示一次 1 操作,接下来就五个整数 li,ri,yi,pi,qi,前三个描述摆放的位置,后两个描述对愉悦值的影响。

如果是’Q’,表示一次 2 操作,接下来有三个整数,xi,li,ri, 表示人行走的路径。

如果是’D’,表示一次 3 操作,接下来有一个整数 i,表示将第 i 次摆放的石子移出棋盘。

输出格式

对于每次 22 操作,输出一行一个整数,表示走完后此人的愉悦值。

样例输入

3 3 6
I 1 2 2 1 1
Q 1 1 3
I 1 3 1 1 2
Q 1 1 3
D 1
Q 3 1 3

样例输出

1
3
2
题目来源
2018 计蒜之道 初赛 第三场

思路

分三种情况讨论,逐个处理

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 11000
using namespace std;  
struct Node{
    int pi; 
    int qi;   
    int l,r,y;   
}node[MAXN];

int tol=1;  

int G[1100][1100];  
int main(){
    //freopen("1.txt", "r", stdin);  
    int n,m,q;  
    scanf("%d%d%d", &n, &m, &q);  
    for(int i=1;i<=q;i++){
        char option;  
        scanf(" %c", &option);  
        if(option == 'I'){  //使用tol记录第几次处理
            int l,r,y,pi,qi;  
            scanf("%d%d%d%d%d", &l, &r, &y, &pi, &qi);  
            node[tol].pi=pi;  
            node[tol].qi=qi;  
            node[tol].l=l;  
            node[tol].r=r;  
            node[tol].y=y;  
            for(int i=l;i<=r;i++){
                G[i][y]=tol;  //第几次放的石子
            }
            tol++;  
        }
        else if(option == 'Q'){
            int x,l,r;  
            scanf("%d%d%d", &x, &l, &r);  
            long long int ans=0;  //注意数据会超出int范围
            for(int i=l;i<=r;i++){
                if(G[x][i]){
                    ans = node[G[x][i]].pi*ans + node[G[x][i]].qi*1ll;  
                    ans %= 323232323;  //求余
                }
            }
            printf("%lld\n", ans);  
        }
        else {
            int pos;  
            scanf("%d", &pos);  
            for(int i=node[pos].l;i<=node[pos].r;i++){
                G[i][node[pos].y]=0;  //将该次操作所放的石子全部去掉
            }
        }
    }
} 

发表评论