CodeForces 669C Little Artem and Matrix GNU

模拟。

把操作记录一下,倒着复原回去。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-6;
void File()
{
    freopen("D:\\in.txt","r",stdin);
    freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
    char c=getchar(); x=0;
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) {x=x*10+c-‘0‘; c=getchar();}
}

const int maxn=110;
int n,m,q;
int ans[maxn][maxn];
int op[10010],r[10010],c[10010],v[10010];

int main()
{

    scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=q;i++)
    {
        scanf("%d",&op[i]);
        if(op[i]==1) scanf("%d",&r[i]);
        else if(op[i]==2) scanf("%d",&c[i]);
        else scanf("%d%d%d",&r[i],&c[i],&v[i]);
    }

    for(int i=q;i>=1;i--)
    {
        if(op[i]==3) ans[r[i]][c[i]]=v[i];
        else if(op[i]==1)
        {
            for(int j=m;j>1;j--)
                swap(ans[r[i]][j],ans[r[i]][j-1]);
        }
        else
        {
            for(int j=n;j>1;j--)
                swap(ans[j][c[i]],ans[j-1][c[i]]);
        }
    }

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
            printf("%d ",ans[i][j]);
        printf("\n");
    }
    return 0;
}
时间: 2024-10-16 15:08:04

CodeForces 669C Little Artem and Matrix GNU的相关文章

codeforces 442C C. Artem and Array(有深度的模拟)

题目 感谢JLGG的指导! 思路: //把数据转换成一条折线,发现有凸有凹 //有凹点,去掉并加上两边的最小值//无凹点,直接加上前(n-2)个的和(升序)//数据太大,要64位//判断凹与否,若一边等于,一边大于,那中间这个也算是凹进去的,所以判断时要加上等于 //有凹点,去掉并加上两边的最小值 //无凹点,直接加上前(n-2)个的和(升序) //数据太大,要64位 //判断凹与否,若一边等于,一边大于,那中间这个也算是凹进去的,所以判断时要加上等于 #include<stdio.h> #i

Codeforces 669D Little Artem and Dance (胡搞 + 脑洞)

题目链接: Codeforces 669D Little Artem and Dance 题目描述: 给一个从1到n的连续序列,有两种操作: 1:序列整体向后移动x个位置, 2:序列中相邻的奇偶位置互换. 问:q次操作后,输出改变后的序列? 解题思路: 刚开始只看了第一组样例,发现相邻的奇偶位一直在一起,于是乎就开始writing code,写完后发现并不是正解!!!!就去推了一下第三个样例,总是这组实例通过,那组实例卡死,,,,,,,最后终于成功的Mengbility.今天突然想起来,其实整体

CodeForces 669C

链接:http://codeforces.com/problemset/problem/669/C 题意: 给你一个N*M的矩阵,有三种操作: 1 r 代表把第r行整体左移一位,第一个到最后一个位置. 2 l  代表把第l列整体上移一位,第一个到最底下的位置. 3 x y v 代表此刻第 x 行第 y 列的值为 v. 给你一系列的操作,让你给出满足要求的原始矩阵,如果有多个答案,其中任意一个都可以. 思路: 既然一个矩阵 Q 经过一系列的操作 p1, p2, p3, p4, ..., pn 变成

CodeForces 669D Little Artem and Dance

模拟. 每个奇数走的步长都是一样的,每个偶数走的步长也是一样的. 记$num1$表示奇数走的步数,$num2$表示偶数走的步数.每次操作更新一下$num1$,$num2$.最后输出. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #i

CodeForces - 1016D Vasya And The Matrix

题面在这里! 很明显二进制每一位都是无关的,所以可以先把原问题简化:给矩阵中的每个位置填入0/1,使得特定行/列有奇数个1,其他行/列有偶数个1. 一个比较好想的方法是对行和列 列出 n+m 个异或方程,其中有 n*m 个变量,随便求出一组解就好了(如果有的话). 但这个貌似并不是很好写... 可以把解异或方程转化成 在一个完全二分图(左n个点,右m个点)上选边,每个点可以是黑的(对应行/列要求有奇数个1)或者白的(反之),每选一条边就要把两端的点的黑白性颠倒. 然后发现这是一个经典问题,显然选

Codeforces Round #557 B. Double Matrix

题面: 传送门 题目描述: 给出两个n*m的矩阵,问:是否能通过交换两个矩阵“对应”位置的元素,使两个矩阵都为“递增”矩阵. “递增”矩阵定义:每行和每列都要“递增”. 题目分析: 这道题就是个贪心水题,但是我刚开始就是胡思乱想,思路根本不对,再加上放假后的懒惰,就...进入正题: 我们可以想出这样一种贪心策略:让前面的值尽可能小,后面才有更大的机会成为“递增”矩阵.我们根据这个贪心策略,可以推出一些东西: 注:下面的a,b是两个题目给出的矩阵 假设我要让a(i, j)尽可能小,也就是:如果a(

codeforces 的20道C题

A - Warrior and Archer CodeForces - 595C n  偶数  然后n个数字 A B 轮流取一个 A让差变小B让差变大 直到最后2 个   求的是最小剩下的差 最后剩下的 L R  相距 n/2    求一下最小的就行 #include <iostream> #include <cstdio> #include <cmath> #include <map> #include <algorithm> #include

Codeforces Round #348

A. Little Artem and Presents 题意:Artem想将自己的n个糖果送给Masha,他想送尽量多的次数而不在乎数量,不顾每次送的数量不能和上次相同. 题解:只要第一次送一个,第二次送两个这样一次送就可以保证送的次数最多, 代码: 1 /*A*/ 2 #include<cstdio> 3 using namespace std; 4 5 int main() 6 { 7 int n; 8 while(scanf("%d",&n)!=EOF) 9

Codeforces Round #348(VK Cup 2016 - Round 2)

A - Little Artem and Presents (div2) 1 2 1 2这样加就可以了 #include <bits/stdc++.h> typedef long long ll; const int N = 1e5 + 5; int main() { int n; scanf ("%d", &n); int ans = n / 3 * 2; if (n % 3) { ans++; } printf ("%d\n", ans);