Gym 100851A Adjustment Office (思维)

题意:给定一个 n*n 的矩阵,然后有 m 个询问,问你每一行或者每一列总是多少,并把这一行清空。

析:这个题不仔细想想,还真不好想,我们可以根据这个题意,知道每一行或者每一列都可以求和公式来求,然后再送去变成0的数,由于每一行或者每一列,

都是等差数列,所以我们只要记录每一个的第一个元素就好,再记录有多少个,然后就可以推算出来。

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const double inf = 0x3f3f3f3f3f3f;
const LL LNF = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 1e6 + 5;
const int mod = 1e9 + 7;
const int dr[] = {-1, 0, 1, 0};
const int dc[] = {0, 1, 0, -1};
const char *Hex[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline int Min(int a, int b){ return a < b ? a : b; }
inline int Max(int a, int b){ return a > b ? a : b; }
inline LL Min(LL a, LL b){ return a < b ? a : b; }
inline LL Max(LL a, LL b){ return a > b ? a : b; }
inline bool is_in(int r, int c){
    return r >= 0 && r < n && c >= 0 && c < m;
}
char s[5];
bool row[maxn], col[maxn];

int main(){
    freopen("adjustment.in", "r", stdin);
    freopen("adjustment.out", "w", stdout);
    while(scanf("%d %d", &n, &m) == 2){
        memset(row, false, sizeof row);
        memset(col, false, sizeof col);
        int x = 0;
        LL r = 0, c = 0;
        int cntr = 0, cntc = 0;
        LL ans = 0;
        for(int i = 0; i < m; ++i){
            scanf("%s %d", s, &x);
            if(s[0] == ‘R‘){
                if(row[x])  ans = 0;
                else{
                    r += x;
                    ++cntr;
                    ans = (LL)n*(LL)(x+x+n+1)/2LL - (LL)cntc*x - c;
                }
                row[x] = true;
            }
            else {
                if(col[x]) ans = 0;
                else{
                    c += x;
                    ++cntc;
                    ans = (LL)n*(LL)(x+x+n+1)/2LL - (LL)cntr*x - r;
                }
                col[x] = true;
            }
            printf("%I64d\n", ans);
        }
    }
    return 0;
}
时间: 2024-10-29 19:11:30

Gym 100851A Adjustment Office (思维)的相关文章

Gym - 100851A Adjustment Office(O(1)求行列和)

Adjustment Office Gym - 100851A 2       3       4 3       4       5 4       5       6 n<=10^6,q<=10^5 每个坐标点的值为x+y. q次查询,每次求某行或某列的和,然后清空. in                   out 3 7                 12R 2                 10C 3                 0R 2                 5R

Gym100851A Adjustment Office 思维+模拟

网址:https://codeforces.com/gym/100851 题意: 给你一个$n*n$的网格图,格子$(x,y)$的值是$x+y$,有两种操作: $R$ $c$:输出第$R$列的和,然后这一列所有的数置零. $C$ $c$:输出第$C$行的和,然后这一行所有的数置零. 一共$q$次操作. $n \leq 1e6,q \leq 1e5$. 题解: 这个题我们考虑先预处理出这个网格图每一行每一列的和,逐个暴力求$O(n^2)$必超时,考虑求出了第一行第一列的和,显然下一行的和为这一行的

【模拟】NEERC15 A Adjustment Office (2015-2016 ACM-ICPC)(Codeforces GYM 100851)

题目链接: http://codeforces.com/gym/100851 题目大意: 一个N*N的矩阵A,Ai,j=i+j,Q次操作,每次分两种,R r取出第r行还未被取的所有数,并输出和.C c取出第c列还未被取出的所有数并输出和. 题目思路: [模拟] 首先Ai,j=i+j这个很关键.预处理每一行(=列)的值. 只要记录当前取得时候前面已经取过的所有行数的和.次数,所有列数的和.次数,就能推算出这次取数会少掉多少值. 并记录这一行或这一列被取过没有. 1 // 2 //by coolxx

Secret Project Gym - 101972(组合数大数+思维)

题目:有 n 个人,x把锁,(每个人有y把钥匙),要求最少有 m 个人在场才能打开这所有的x把锁,问 x y 的最小值分别是多少. 分析: 1.公式:https://blog.csdn.net/SunMoonVocano/article/details/84137160 2.组合数大数求解,因为涉及到模运算,所以需要用到乘法逆元:也即边打阶乘的表,边求阶乘关于mod的逆元. 代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 type

Flying Squirrel --- Gym - 102091A(RMQ + 思维)

题目 https://vjudge.net/problem/Gym-102091A 题意 从左到右给出 n 个位置固定机场和 m 个询问,每个机场有自己的高度 H,每个飞机只能向高度比原高度小的地方飞,并且途中不能经过大于等于原高度的位置.询问给出两个参数 u,v. 当 v ! = 0 时,从 u,v 中较高处向较低出飞,最多途径几个机场(包括终点)飞到终点. 当 v == 0 时,从 u 起飞,不固定终点,问最多途径几个机场(包括终点)飞到终点. 题解 对于每个机场,若是想要飞的多,肯定是要飞

ACM: Gym 101047K Training with Phuket&#39;s larvae - 思维题

Gym 101047K Training with Phuket's larvae Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Practice Description standard input/output Thai cuisine is known for combining seasonings so that every dish has flavors that are s

思维题 Gym 100553A Alter Board

题目传送门 1 /* 2 题意:一个n×m的矩形,相邻的颜色不同,黑或白.问最少的翻转次数,每次翻转可指定任意一个子矩形 3 思维题:最少要把偶数行和列翻转,也就是n/2+m/2次 4 */ 5 #include <cstdio> 6 using namespace std; 7 8 int main(void) //Gym 100553A Alter Board 9 { 10 // freopen ("A.in", "r", stdin); 11 fr

Gym 100971A Treasure Island BFS 思维题

A - Treasure Island Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Description standard input/output Announcement Statements Pirate John Silver has found a map depicting exactly one island in a sea. The ma

codeforces gym #101987B -Cosmetic Survey(建图+bfs思维)

题目链接: https://codeforces.com/gym/101987/attachments 题意: 给出$n$个节点,$m$条边 对于所有$(a,b)$,求出$a$到$b$路径中最小边的最大值 注意两个隐藏条件 1.不存在环 2.如果$a$到$b$,$b$到$c$,那么$len(a,b)>len(b,c)$ 数据范围: $1\leq n \leq 500$ $1\leq m \leq 250000$ 分析: 一条路径最小值 AC代码: #include<bits/stdc++.h&