分析:考虑记录每个坐标上每个颜色出现了几次,并由此算出每个颜色在这个坐标上的贡献。答案肯定是原图的答案扣去矩形的答案,再加上那个矩形同种颜色的贡献,这里的答案指的是Σdis.我们先要记录每个颜色在各个位置出现的次数,因为每一次都是区间操作嘛,所以我们用二维差分可以很好地维护,前缀和求出出现的次数. 然后求出每个位置原本图的和副本的差距,求一下前缀和就得到原本图整体的答案.

最后再用一个前缀和数组求出每个位置覆盖为颜色x后的贡献,就可以了.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath> #define s(u,i,j,k,l) (u[k][l] - u[i-1][l] - u[k][j-1] + u[i - 1][j-1])
using namespace std; const int maxn = ,maxm = ;
int n, m, kk, rubbish,a[maxn][maxn],sum[][maxn][maxn],col[maxm];
int x3[maxm], y3[maxm], x4[maxm], y4[maxm];
long long ans[maxn][maxn],b[][maxn][maxn],ret = 1LL << ,pi;
char s[maxn]; long long S1(int x, int y, int x2, int y2)
{
return ans[x2][y2] - ans[x - ][y2] - ans[x2][y - ] + ans[x - ][y - ];
} long long S2(int cur, int x, int y, int x2, int y2)
{
return b[cur][x2][y2] - b[cur][x - ][y2] - b[cur][x2][y - ] + b[cur][x - ][y - ];
} int main()
{
scanf("%d%d%d%d", &n, &m, &kk, &rubbish);
for (int i = ; i <= n; i++)
{
scanf(" %s", s + );
for (int j = ; j <= m; j++)
a[i][j] = s[j] - 'a';
}
for (int i = ; i <= kk; i++)
{
scanf("%d%d%d%d %c", &x3[i], &y3[i], &x4[i], &y4[i], &col[i]);
col[i] -= 'a';
++sum[col[i]][x3[i]][y3[i]]; //二维差分修改每种颜色出现的次数
--sum[col[i]][x3[i]][y4[i] + ];
--sum[col[i]][x4[i] + ][y3[i]];
++sum[col[i]][x4[i] + ][y4[i] + ];
}
for (int k = ; k < ; k++)
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
sum[k][i][j] += sum[k][i - ][j] + sum[k][i][j - ] - sum[k][i - ][j - ];//统计每个点每种颜色出现的次数
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
for (int k = ; k < a[i][j]; k++)
ans[i][j] += sum[k][i][j] * (a[i][j] - k);//每一位对dis的贡献值
for (int k = ; k > a[i][j]; k--)
ans[i][j] += sum[k][i][j] * (k - a[i][j]);
ans[i][j] += ans[i - ][j] + ans[i][j - ] - ans[i - ][j - ];//记录整个图的dis
}
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
int t = ;
for (int k = ; k < ; k++)
t += sum[k][i][j];
sum[a[i][j]][i][j] += kk - t;//之前记录的是副本上出现的次数,现在记录原有的出现次数
}
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
int s1 = , s2 = ;
for (int k = ; k < ; k++)
{
s1 += sum[k][i][j] * k;
s2 += sum[k][i][j];
b[k][i][j] = s2 * k - s1; //如果我把每个副本(i,j)上的点全部变成k的贡献
}
s1 = s2 = ;
for (int k = ; k >= ; k--)//相当于计算ans,倒着计算一次
{
s1 += sum[k][i][j] * k;
s2 += sum[k][i][j];
b[k][i][j] += s1 - s2 * k;
}
for (int k = ; k < ; k++)
b[k][i][j] += b[k][i - ][j] + b[k][i][j - ] - b[k][i - ][j - ];
}
for (int i = ; i <= kk; i++)
{
long long temp = ans[n][m] - s(ans, x3[i], y3[i], x4[i], y4[i]) + s(b[col[i]], x3[i], y3[i], x4[i], y4[i]);
if (temp < ret)
{
ret = temp;
pi = i;
}
}
printf("%lld %d\n", ret, pi);return ;
}

 

常州模拟赛d8t2 绘画的更多相关文章

  1. 常州模拟赛d4t1 立方体

    题目描述 立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草.为了训练奶牛的合作精神,它 们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛. 游戏开始, ...

  2. 常州模拟赛d7t3 水管

    分析:第一问还是很好做的,关键是怎么做第二问.我们可以每次删掉最小生成树上的一条边,然后再求一次最小生成树,看边权和大小和原来的是不是一样的,不过这个做法效率很低. 考虑Kruskal算法的原理,每次 ...

  3. 常州模拟赛d6t3 噪音

    FJ有M个牛棚,编号1至M,刚开始所有牛棚都是空的.FJ有N头牛,编号1至N,这N头牛按照编号从小到大依次排队走进牛棚,每一天只有一头奶牛走进牛棚.第i头奶牛选择走进第p[i]个牛棚.由于奶牛是群体动 ...

  4. bzoj3743 [Coci2015]Kamp 常州模拟赛d6t2

    3743: [Coci2015]Kamp Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 229[Submit][Status ...

  5. 常州模拟赛d5t2 mogician

    分析:一个暴力的思想是枚举g,然后枚举每个数ai,看能不能符合要求,这样复杂度是O(nA)的,直接T掉了.也没什么其他的办法了,在暴力的基础上优化一下,优化的关键是要如何快速统计出不满足要求的数的个数 ...

  6. 常州模拟赛d5t1 journalist

    分析:出题人丧心病狂卡spfa......只能用dijkstar+堆优化. 主要的难点是字典序的处理上,一个想法是在做最短路的时候处理,边松弛边记录,比个大小记录最佳答案.具体的思路大概和最短路计数差 ...

  7. 常州模拟赛d4t3 字符串划分

    题目描述 给你一串由小写字母组成的字符串,希望你把它划分成一些小段,使得每一小段字符串中的字母 都不相同,并且希望分的段数尽量少. 然后,把这些小段按字典序排序后输出,中间由一个空格分隔. 例如:字符 ...

  8. 常州模拟赛d4t2 陶陶摘苹果

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 n 个苹果.苹果成熟的时候,陶陶就会 跑去摘苹果. 陶陶的手不能弯 (他仅能把手伸直),当且仅当陶陶达到的高度与苹果的高度相等的时候,陶陶 ...

  9. 常州模拟赛d3t3 两只怪物心心相印

    题目背景 从前我是一位无名的旅人,旅途中我得到了某样东西:贤者之石.我因此得到悠久的时光和漂泊的生命.1897年冬天,我一时兴起舍弃了旅人的生活. 贤者之石创造出来的,是货真价实的黄金.我的名声传遍了 ...

随机推荐

  1. 第四代增强 源代码增强(ABAP Source Code Enhancements)

    显式代码增强的创建 se38打开你要增强的程序 进入编辑状态 在菜单栏选择: Edit->Enhancement Opreations->Create option. 此时弹出Create ...

  2. [C++ STL] map使用详解

    一.set介绍: Map由红黑树实现,其元素都是"键值/实值"所形成的一个对组(key/value pairs).每个元素有一个键,是排序准则的基础.每一个键只能出现一次,不允许重 ...

  3. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 /* 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 */ #include ...

  4. ACM_求N^N的前5位数和后5位数(数论)

    NNNNN Time Limit: 2000/1000ms (Java/Others) Problem Description: 对于整数N,求N^N的前5位和后5位(1057题加强版) Input: ...

  5. Linux下磁盘分区、挂载、卸载操作记录

    Linux下磁盘分区.挂载.卸载操作记录. 操作环境:CentOS release 6.5 (Final) Last :: from 118.230.194.76 [root@CentOS ~]# [ ...

  6. 常用点击事件(鼠标、光标、键盘、body)

    常用事件: 鼠标: onclick(单击) ondblclick(双击) oncontextmenu(右击) onmouseover onmouseout 光标: onfocus onblur 键盘: ...

  7. 动态属性ExpandoObject

    1.动态创建对象及其属性ExpandoObject 查看ExpandoObject的定义:

  8. python数于字符串

    python数于字符串 1.了解数的类型 2.什么事字符串 3.引号的使用与区别 4.转义符 5.自然字符串 6.字符串的重复 7.子字符串 #了解数的类型 1.python中数的类型主要有五种,分为 ...

  9. java设计模式之代理模式模式总结

    定义:代理模式这种设计模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 解读定义: 1.代理对象和目标对象有共同的接口: 2.使用代理对象执行目标对象中的方法: ...

  10. git分支拉取

    假设你已经配置好了各种SSH Key之类并熟悉基本的git创建分支.提交分支命令.比如共有2个分支,自己在一台未配置origin电脑上想要拉取某个分支(dev)到本地.步骤如下:1.新建git项目 与 ...