% Day1 Solution

% Wearry

% Stay determined!

养花

  

考虑当 kkk 确定的时候如何求答案,

显然对于所有形如 [ak,(a+1)k)[ak, (a+1)k)[ak,(a+1)k) 的值域区间, 最大值一定是最优的.

  

进一步观察发现, 这样的区间总个数只有 kln⁡kk \ln kklnk 个.

考虑分块, 那么我们可以在 O(n+kln⁡k)O(n + k \ln k)O(n+klnk) 的时间复杂度内处理出一个块对于任意 kkk 的答案.

询问时复杂度是 O(mS)O(mS)O(mS) 的, 取 S=kln⁡kS = \sqrt{k \ln k}S=klnk​ 可以达到最优复杂度 O(nkln⁡k)O(n \sqrt{k \ln k})O(nklnk​).

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000;
const int B = 1000;
int n, m, A[MAXN+5], ans[MAXN/B+5][MAXN+5], b[MAXN+5];
int main ()
{
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++)
scanf("%d", &A[i]);
int blks = (n-1)/B+1;
for(int i = 0; i < blks; i++)
{
memset(b, 0, sizeof b);
for(int j = i*B; j < B*(i+1) && j < n; j++) b[A[j]] = A[j];
for(int j = 1; j <= MAXN; j++) if(!b[j]) b[j] = b[j-1];
for(int j = 1; j <= MAXN; j++) for(int k = 0; k <= MAXN; k += j) ans[i][j] = max(ans[i][j], b[min(k+j-1,MAXN)]-k);
}
int x, y, z, a, b, Ans;
while(m--)
{
scanf("%d%d%d", &x, &y, &z), x--, y--;
a = x/B + 1, b = y/B, Ans = 0;
if(a > b) for(int i = x; i <= y; i++) Ans = max(Ans, A[i]%z);
else
{
for(int i = x; i < a*B; i++) Ans = max(Ans, A[i]%z);
for(int i = b*B; i <= y; i++) Ans = max(Ans, A[i]%z);
for(int i = a; i < b; i++) Ans = max(Ans, ans[i][z]);
}
printf("%d\n", Ans);
}
}

折射

  

若将所有点按照 yiy_iyi​ 的顺序转移, 有上界和下界两个限制, 难以优化.

  

考虑按照 xix_ixi​ 排序转移, 并记录 fi,0/1f_{i, 0/1}fi,0/1​ 表示以第 iii 个点为顶端接下来向左或向右的折线方案数.

从左到右加点, 考虑前 iii 个点构成的包含 iii 点的折线. 由于新点横坐标最大, 所以只可能在折线的第一位或第二位:

  1. ∀yj&lt;yi,fi,0←fj,1\forall y_j &lt; y_i, f_{i, 0} \leftarrow f_{j, 1}∀yj​<yi​,fi,0​←fj,1​

  2. ∀yj&gt;yi,fj,1←fk,0∣xk&gt;xj&ThinSpace;&ThinSpace;and&ThinSpace;&ThinSpace;yk&lt;yi\forall y_j &gt; y_i, f_{j, 1} \leftarrow f_{k, 0} \mid x_k &gt; x_j \,\, \mathrm{and} \,\, y_k &lt; y_i∀yj​>yi​,fj,1​←fk,0​∣xk​>xj​andyk​<yi​

  

第二种情况可以前缀和优化, 复杂度 O(n2)O(n^2)O(n2).

#include <bits/stdc++.h>
using namespace std;
#define file(x) freopen(x".in", "r", stdin);freopen(x".out", "w", stdout);
#define pii pair<int,int>
namespace IO
{
inline void read(int &num)
{
char ch; int flag = 1;
while(!isdigit(ch=getchar()))if(ch=='-')flag=-flag;
for(num=ch-'0';isdigit(ch=getchar());num=num*10+ch-'0');
num *= flag;
}
}
using namespace IO;
const int MAXN = 100005;
const int mod = 1e9+7;
int n, dp[MAXN][2];
pii p[MAXN];
int main ()
{
read(n);
for(int i = 1; i <= n; i++)
read(p[i].first), read(p[i].second);
sort(p + 1, p + n + 1);
int Ans = 0;
for(int i = 1; i <= n; i++)
{
dp[i][0] = dp[i][1] = 1;
for(int j = i-1; j; j--)
if(p[j].second < p[i].second)
(dp[i][0] += dp[j][1]) %= mod;
else (dp[j][1] += dp[i][0]) %= mod;
}
for(int i = 1; i <= n; i++) (Ans += (dp[i][0] + dp[i][1]) % mod) %= mod;
printf("%d\n", (Ans+mod-n)%mod);
}

画作

  

不难证明猜到一个这样的结论: 存在一种最优方案使得每次操作的区域是上一次的子集且颜色与上一次相反.

  

考虑归纳证明, 记 SSS 为当前所有操作区域的并, TTT 为接下来一步的操作区域, 我们有:

  1. TTT 与 SSS 有交的情况一定可以转化成 TTT 被 SSS 包含的情况.

  2. TTT 与 SSS 交集为空时, 可以找一个连接 SSS 和 TTT 的集合 MMM 并操作 S∪T∪MS \cup T \cup MS∪T∪M,

    并将之前的所有操作连接到更外的层以及外层的连接部分同时操作, 特殊处理最外层和第二层的情况.

  3. TTT 被 SSS 包含时, TTT 落在某个完整区域内时等价于情况二,

    否则一定连接若干个同色块, 这些块可以同时处理, 步数一定不会更劣.

  

知道这个结论就比较好做了, 我们可以枚举最后被修改的区域,

这时答案就是将同色边边权当作 000, 异色边边权当作 111 后距离这个点最远的黑色点的距离, 对所有点取最小值即可.

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 55, MAXM = 55;
#define pii pair<int,int>
#define mp make_pair
#define X first
#define Y second
int dx[4] = { 0, 0, 1, -1 };
int dy[4] = { 1, -1, 0, 0 };
char s[MAXN][MAXM];
int dis[MAXN][MAXM], n, m;
deque<pii>q; inline bool chkmin(int &A, int B) { return B < A ? A = B, 1 : 0; }
inline bool chkmax(int &A, int B) { return B > A ? A = B, 1 : 0; } int bfs(int u, int v)
{
memset(dis, -1, sizeof dis);
int ret = -1;
dis[u][v] = 0; q.push_back(mp(u, v));
while(!q.empty())
{
pii tp = q.front(); q.pop_front();
if(s[tp.X][tp.Y] == '1') chkmax(ret, dis[tp.X][tp.Y]);
for(int i = 0; i < 4; i++)
if((u=tp.X+dx[i]) >= 1 && (v=tp.Y+dy[i]) >= 1 && u <= n && v <= m && dis[u][v] == -1)
{
if(s[tp.X][tp.Y] == s[u][v])
dis[u][v] = dis[tp.X][tp.Y], q.push_front(mp(u, v));
else dis[u][v] = dis[tp.X][tp.Y] + 1, q.push_back(mp(u, v));
}
}
return ret;
} int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%s", s[i]+1);
int Ans = 0x7f7f7f7f;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
chkmin(Ans, bfs(i, j));
printf("%d\n", Ans+1);
}

模拟赛20181031 雅礼 Wearry 养花 折射 画作的更多相关文章

  1. 模拟赛20181101 雅礼 Wearry 施工 蔬菜 联盟

    % Day2 Solution % Wearry % Stay determined! 施工    记 fif_{i}fi​ 表示考虑前 iii 个建筑, 并且第 iii 个建筑的高度不变的答案, 每 ...

  2. 雅礼集训 Day1 T3 画作 解题报告

    画作 题目描述 小\(\mathrm{G}\)的喜欢作画,尤其喜欢仅使用黑白两色作画. 画作可以抽象成一个\(r\times c\)大小的\(01\)矩阵.现在小\(\mathrm{G}\)构思好了他 ...

  3. NOIP2018 模拟赛(二十二)雅礼NOI

    Preface 这次的题目都是NOI+的题,所以大家的分数都有点惨烈. 依靠T1大力骗分水到Rank2 所以想看正解的话看这里吧 A. 「雅礼NOI2018模拟赛(一) Day1」树 看一眼题目感觉十 ...

  4. 雅礼集训 Day1 T1 养花

    养花 题目描述 小\(C\)在家种了\(n\)盆花,每盆花有一个艳丽度\(a_i\). 在接下来的\(m\)天中,每天早晨他会从一段编号连续的花中选择一盆摆放在客厅, 并在晚上放回. 同时每天有特定的 ...

  5. 雅礼集训1-9day爆零记

    雅礼集训1-9day爆零记 先膜一下虐爆我的JEFF巨佬 Day0 我也不知道我要去干嘛,就不想搞文化科 (文化太辣鸡了.jpg) 听李总说可以去看(羡慕)各路大佬谈笑风声,我就报一个名吧,没想到还真 ...

  6. [NOIP2018模拟赛10.22]咕咕报告

    闲扯 这是篇咕咕了的博客 考场上码完暴力后不知道干什么,然后忽然发现这个T1好像有点像一道雅礼集训时讲过的CF题目 Rest In Shades ,当时那道题还想了挺久不过思路比较妙,于是我就也\(y ...

  7. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  8. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  9. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

随机推荐

  1. Mysql中的读锁,写锁,乐观锁及事务隔离级别和并发问题

    mysql读锁,写锁,乐观锁 读锁,也叫共享锁(shared lock) SELECT * FROM table_name  WHERE ...  LOCK IN SHARE MODE 写锁,也叫排他 ...

  2. 解决dubbo注册zookeeper默认内网ip注册

    前端时间做新项目的时候遇到一个dubbo的一个问题,在我们项目搭建好后使用了其他同事的支付服务,支付服务架构的方式使用了dubbo服务的方式,使用zookeeper作为注册中心,我们新项目使用dubb ...

  3. Java开发笔记(一百三十)Swing的选择框

    不管是AWT还是Swing,都把选择框分成两类:复选框和单选按钮,这两类控件无论是外观上还是功能上均有显著差异.例如,在外观方面,复选框是在方框内打勾,而单选按钮是在圆圈内画圆点:在功能方面,复选框允 ...

  4. java笔记3

    面向对象的特点:   1.封装:   2.继承   3.多态 好处:   是一种符合人们思考习惯的思想  可以将复杂的事情简单化  将程序员从执行者变为指挥者 二 类与对象 成员变量与局部变量的区别: ...

  5. OSGI.NET插件方式开发你的应用

    之前一直从事C# WEB开发.基本都是业务开发,性能优化. 体力活占比90%吧.模块真的很多很多,每次部署经常出先各种问题.发布经常加班. 今年开始接触winform 开发.发现C# 的事件  委托 ...

  6. spring源码解析前瞻

    很多人有疑问:为什么要读源码?读源码有什么用?我也一直问自己这些问题,读源码非常枯燥,工作中又用不到,慢慢的自己读源码越发现自己知识的不足,无法把知识串起来,形成知识体系.从单系统中常用的Spring ...

  7. UI测试用例设计,场景测试法

    百度一番,没有发现详细的UI测试用例设计方法,只能自己整理一下,学习.改进. 那么正题来了,我们慢慢缕下思路: 1.整理要测实体中的,处理逻辑.触发规则.动作. 2.将场景测试抽象出来 3.到这个时候 ...

  8. tomcat配置外部静态资源映射路径(windows和Linux部署)

    如果你不想用ngnix配置的话,只单独使用tomcat的话可以看看这篇文章,接下来开始 使用场景 1.单机开发有时侯如果放在war下每次clean都会清理当前项目下静态文件特别折腾. 2.只有启动to ...

  9. JDK8-lambda表达式以及接口可以定义默认方法

    一.Lambda表达式 1.Lamdba Lambda 允许把函数作为一个方法的参数,使用Lamdba可以让开发的代码更加简洁,但是易读性差,新人不了解Lamdba表达式或者代码功底有点差,不容易读懂 ...

  10. Matlab图形绘制

    图形绘制 离散函数图形: 例:离散数据和离散函数可视化(离散数据作图方式) X1=[,,,,,,,,,,,,,,,,,,,]; Y1=[,,,,,,,,,,,,,,,,,,,]; figure() p ...