NOI2012 Day1

随机数生成器

题目描述:给出数列\(X_{n+1}=(aX_n+c)mod m\),求\(X_n mod g\)

solution

矩阵乘法,但数有可能在运算时爆\(long long\),可以将一个数拆成两个\(long long\)存储,也可以用大数乘法\((b*c)mod m\):

LL get_mod(LL b, LL c)
{
LL ans=0;
while (b)
{
if (b & 1) ans=(ans+c)%m;
c=c*2%m;
b>>=1;
}
return ans;
}

时间复杂度:\(O(n)\)或\(O(nlogn)\)

骑行川藏

题目描述:给出\(n\)段路,每段路有三个参数\(s_i, k_i, v_i'\),分别表示这段路的长度,风阻系数以及风速,若某段路用匀速\(v\)通过,则受到的风阻的大小为\(F=k_i(v-v_i')^2\),消耗能量为\(E=k_i(v-v_i')^2s_i\),保证\(\sum_{i=1}^n E \leq E_U\)的前提下,求最短时间。

solution:

虽然在同一段路上的速度可以随时变化,但从微积分的角度分析,这是没必要的,他可以对应一个匀速的方案,所以每一段路应该各自匀速。设第\(i\)段路的速度为\(v_i\),为题转化为:

\[\sum_{i=1}^n k_i(v_i-v_i')^2s_i \leq E_U,求lim \sum_{i-1}^n \frac{s_i}{v_i}
\]

运用贪心思想,不等式取等是最好的。

\[\sum_{i=1}^n k_i(v_i-v_i')^2s_i = E_U,求lim \sum_{i-1}^n \frac{s_i}{v_i}
\]

把\(v_i\)看成\(n\)个变量,则约束条件为\(g\),目标函数为\(f\)

\[g(v_1, v_2, \cdots, v_n)=\sum_{i=1}^n k_i(v_i-v_i')^2s_i=E_U
\]

\[f(v_1, v_2, \cdots, v_n)=\sum_{i=1}^n \frac{s_i}{v_i}
\]

拉格朗日乘数法

\[\frac{s_i}{v_i^2}=\lambda k_is_i \cdot 2(v_i-v_i')
\]

\[\frac{1}{\lambda}=2k_iv_i^2(v_i-v_i')
\]

二分\(2k_iv_i^2(v_i-v_i')\),因为\(v_i>0\),所以该函数递增,二分可求出\(v_i\),判断是否满足约束条件,若满足,则求到最优解。

时间复杂度:\(?\)(难以计算, 精度要求高)

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <deque>
#include <queue>
#include <vector>
#include <map>
#include <complex>
using namespace std; const int maxn=int(1e4)+100;
const double eps=1e-10; int n;
double E, lambda;
double s[maxn], k[maxn], vf[maxn], v[maxn];
double ans; void init()
{
scanf("%d%lf", &n, &E);
for (int i=1; i<=n; ++i)
scanf("%lf%lf%lf", &s[i], &k[i], &vf[i]);
}
void calc_v()
{
for (int i=1; i<=n; ++i)
{
double L=0, R=1e4;
while (L<R)
{
double mid=(L+R)/2;
double tmp=2*k[i]*mid*mid*(mid-vf[i]);
if (fabs(tmp-lambda)<eps)
{
v[i]=mid;
break;
}
if (tmp<lambda) L=mid; else R=mid;
}
}
}
bool check()
{
double tmp=0;
for (int i=1; i<=n; ++i)
tmp+=k[i]*(v[i]-vf[i])*(v[i]-vf[i])*s[i];
return tmp<=E;
}
double calc_ans()
{
double tmp=0;
for (int i=1; i<=n; ++i)
tmp+=s[i]/v[i];
return tmp;
}
void solve()
{
double L=0, R=1e5;
while (L+eps<R)
{
lambda=(L+R)/2;
calc_v();
if (check()) L=lambda; else R=lambda;
}
lambda=L;
calc_v();
ans=calc_ans();
}
int main()
{
freopen("bicycling.in", "r", stdin);
freopen("bicycling.out", "w", stdout);
init();
solve();
printf("%lf", ans);
return 0;
}

魔幻棋盘

题目描述:给出一个矩阵与其中的一个格\(P(x, y)\),支持两种操作:1、询问子矩阵的最大公约数,子矩阵包含\(P\). 2、让子矩阵加上一个整数。

solution

恶心的处理题。

对于任意的两个数,它们的最大公约数等于它们的差与其中一个数求最大公约数。而且询问一定包含\(P\),所以可以采用作差的方法。如图:





因为询问一定包含\(P\),所以可以向内(\(P\)),作差,使得每个数与内相关,图中为箭头尾减头,只是相邻格子作差,先做图一,处理好图一后,用结果作差,即图二所示,也只是相邻格子作差。所以图一和图二作差时都要按箭头方向枚举。

将作差后的最后结果用二维线段树优化,询问时直接在二维线段树询问最大公约数,然后再跟\(P\)求一下就可以了。

如果没有修改,这题就算是做完了,但现在有修改,作差法就展现出它的优势了。因为不可能对整段数的最大公约数进行修改,作差法给予了单点修改的可能。

首先对于一个修改,有四个位置是一定要改的。



图中表示的是如果整个矩形都在一个象限,那么要修改哪些点,如果跨象限了,那么就要判断四个角的点在哪个象限。矩形覆盖了\(P\)的行或列的,也要对相应位置进行修改。



这里的处理比较恶心,自行脑补。

NOI2012 Day1的更多相关文章

  1. 高等数学(拉格朗日乘子法):NOI 2012 骑行川藏

    [NOI2012] 骑行川藏 输入文件:bicycling.in   输出文件:bicycling.out   评测插件 时间限制:1 s   内存限制:128 MB NOI2012 Day1 Des ...

  2. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  3. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

  4. day1

    day1.py ][][: ][: ): : ]['lock'] = 0 json.dump(userlist_message, open(userlist, 'w')) break #输错次数到3次 ...

  5. day1作业--登录入口

    作业概述: 编写一个登录入口,实现如下功能: (1)输入用户名和密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 流程图: readme: 1.程序配置文件: 黑名单文件blacklist.t ...

  6. luogu1003铺地毯[noip2011 提高组 Day1 T1]

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  7. Python学习路程day1

    变量起名: 变量名如果太长,推荐使用下划线来分开,让人看得清晰明白.例:nums_of_alex_girl=19 .或者是驼峰写法,即首字母大写.例:NumOfAlexGf=18 注意:不合法的变量起 ...

  8. 团队项目——站立会议 DAY1

    团队项目--站立会议 DAY1        团队成员介绍(5人):张靖颜.何玥.钟灵毓秀.赵莹.王梓萱        今日(2016/5/6)为站立会议的第一天,一起对团队项目进行讨论,并对每个人的 ...

  9. Day1 login

    使用流程: 1.程序启动后,显示欢迎信息,提示用户输入用户名: 2.判断用户是否存在,不存在则提示重新输入,或者关闭程序:客户存在则提示客户输入密码: 3.判断密码是否正确,如果不正确则提示用户重新输 ...

随机推荐

  1. struct2(四)编写Struct2 的Action

    简介: 1.映射一个Action到一个类上面 2.把结果返回到view展示 3.编写Action对应的控制逻辑   1. Action Mapping <action name="he ...

  2. debuggap,移动端调试新方式

    最近发现了一个移动端调试的新技能,这里简单描述一下基本情况. 移动端调试常遇到的问题 手机访问只能看到页面的展现,除此之外看不到任何其他信息 无法像调试PC页面那么方便的查看js.dom.networ ...

  3. Java实现一致性Hash算法深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中”一致性Hash算法”部分,对于为什么要使用一致性Hash算法和一致性Hash算法的算法原 ...

  4. ext3中xtype属性汇总

    基本组件: xtype Class 描述 button Ext.Button 按钮 splitbutton Ext.SplitButton 带下拉菜单的按钮 cycle Ext.CycleButton ...

  5. 第25讲 UI组件之 AlertDialog 的各种实现

    第25讲 UI组件之AlertDialog 的各种实现 对话框(Dialog)是程序运行中的弹出窗口,例如当用户要删除一个联系方式时,会弹出一个对话框. Android提供了多种对话框:警告对话框(A ...

  6. Java IO 概述

    输入和输出-数据源和目标媒介 术语“输入”和“输出”有时候会有一点让人疑惑.一个应用程序的输入往往是另一个应用程序的输出.那么OutputStream流到底是一个输出到目的地的流呢,还是一个产生输出的 ...

  7. HTML5新增的一些属性和功能之六——拖拽事件

    拖放事件的前提是分为源对象和目标对象,你鼠标拖着的是源对象,你要放置的位置是目标对象,区分这两个对象是因为HTML5的拖放事件对两者是不同的. 被拖动的源对象可以触发的事件: 1).ondragsta ...

  8. oracle日期计算

    查询某月有多少天.代码例如以下: select to_number(add_months( trunc(to_date('2014-11-4 11:13:53','yyyy-mm-dd hh24:mi ...

  9. 巧记--Css选择器

    love  ------>   hate 即: a:link   -->  a:visited  -->  a:hover   -->  a:active a:link     ...

  10. artDialog Error: document.compatMode === "BackCompat 报错原因

    今天在使用artDialog的时候报错了提示artDialog Error: document.compatMode === "BackCompat 查了网上说 可以设置<!DOCTY ...