打满暴力好像是一种挑战,已经连续几天考试最后一个小时自闭了,因为自以为打完了暴力,然而,结果往往差强人意

大概是考试的策略有些问题


T1:

我们设$g[x]$为在x时取小于等于m个物品的最大价值,下面要证明的是$g$的单调性

1.若k都小于0,那么$g$是单调减的,这种情况下特判0就好

2.若k都大于0,那么$g$是单调增的,这种情况下显然可以二分

3.有的k大于0,有的k小于0,这种情况下$g$先单调减后单调增。为什么?考虑选择的过程,x确定的时候,我们选当前取值>0的前m个(不够的话就不取)。那么随着x的增大,在已取集合中k<0的会不断减小到0,之后被我们删去;集合外的k>0的会不断增大最终大于0,之后可能被我们加入集合。考虑在某个横坐标之前单位减少量大于增加量,这个横坐标之后单位减少量小于增加量,那么之后单位减少量会恒小于增加量,联系上述的过程理解(已经加入集合的单增的直线只会不断增大,或者被更大代替,而单减的直线不会一直减小,而是会减小到0后被丢出去。也就是单位增加的导函数单增,单位减少的导函数单减(非严格))

那么情况3我们如何处理呢?很简单,我们特判一下0,如果满足条件直接输出即可,否则我们就在单增上二分(在代码中表现的是我们在整个函数上二分,因为单见你呢的那部分显然全部都<S,而<S时我们会把横坐标右移到单增处,实际和上面的情况1和情况2操作完全一样)

$nth_element(val+1,val+n-m+1,val+n)$将$[1,n+1)$第$n-m+1$大的元素放在第$n-m+1$小的位置,满足前面的元素比他小,后面的元素比他大

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll; const int N=1e6+;
const ll inf=1e9;
ll n,m,S;
ll k[N],b[N],val[N];
inline ll read()
{
char ch=getchar();
ll s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
bool check(ll x)
{
for (int i=;i<=n;i++) val[i]=k[i]*x+b[i];
nth_element(val+,val+n-m+,val+n+);
ll re=;
for (int i=n;i>=n-m+;i--)
{
if (val[i]>) re+=val[i];//不保证前m个是按顺序的,因此<0不能break
if (re>=S) return ;
}
return re>=S;
}
int main()
{
n=read();m=read();S=read();
for (int i=;i<=n;i++) k[i]=read(),b[i]=read();
if (check()) {puts("");return ;}
ll l=,r=inf;
while (l<r)
{
int mid=l+r>>;
if (check(mid)) r=mid;
else l=mid+;
}
printf("%lld\n",l);
return ;
}

T2:

考虑到,一开始的形如$x_i+x_{fa}=w$形成一棵以1为根节点的树,也就是说任意的点都可以用$x_1$表示

设1为偶数点,那么奇数点都可以表示成形如$k-x_1$的形式,偶数点都可以表示为形如$k+x_1$的形式

考虑操作1:我们假设已知$x_u,x_v$用$x_1$的表示和$u,v$是奇数点还是偶数点,分以下情况讨论

1.两个都是奇数点,那么有$k_u-x_1+k_v-x_1=s$,移项得到$2x_1=s+k_u+k_v$,计算答案就好

2.两个都是偶数点,那么有$k_u+x_1+k_v+x_1=s$,移项得到$2x_1=s-k_u-k_v$,计算答案就好

3.一个是奇数点,一个是偶数点,这样的话$x_1$就会消掉,判断得到的结果与给定的s是否相同即可

显然初始化一遍dfs每个点的表示和奇偶都可以轻易得到

考虑操作2如何维护?

我们发现改变一个点与其父亲的$w$值最终改变表达的只是这个点子树里的点,我们把奇数点和偶数点分情况讨论,用树状数组维护区间加就好

如当前点已知表达为$x$,接下来的表达分别为$w_1-x,w_2-w_1+x,w_3-w_2+w_1-x$

总结起来就是奇到奇是+,偶到偶是+,奇到偶和偶到奇都是-(这个主要是方便笔者自己理解...可能有点抽象,感性理解一下)

std用了很神奇的一个树状数组同时解决了奇点和偶点的修改,用的就是上述的性质

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll; const int N=1e6+;
int n,q,tot,tim;
int head[N],dep[N],dfn[N],edfn[N],t[N],w[N];
struct EDGE
{
int to,nxt,ww;
}edge[N];
inline int read()
{
char ch=getchar();
int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void ad(int u,int v,int ww)
{
edge[++tot]=(EDGE){v,head[u],ww};
head[u]=tot;
}
void dfs(int x)
{
dfn[x]=++tim;
for (int i=head[x];i;i=edge[i].nxt)
{
int y=edge[i].to;
dep[y]=dep[x]^;
dfs(y);
}
edfn[x]=tim;
}
void add(int x,int y)
{
while (x<=n)
{
t[x]+=y;
x+=x&-x;
}
}
int sum(int x)
{
int re=;
while (x)
{
re+=t[x];
x-=x&-x;
}
return re;
}
int main()
{
// freopen("equation.in","r",stdin);
// freopen("equation.out","w",stdout);
n=read();q=read();
for (int i=,u;i<=n;i++)
{
u=read();w[i]=read();
ad(u,i,w[i]);
}
dfs();
for (int i=;i<=n;i++) if (!dep[i]) w[i]=-w[i];
for (int i=;i<=n;i++) {add(dfn[i],w[i]);add(edfn[i]+,-w[i]);}
while (q--)
{
int opt=read();
if (opt==)
{
int u=read(),v=read(),s=read();
int x=sum(dfn[u]),y=sum(dfn[v]);
if (dep[u]&&dep[v])
{
ll rt=1ll*x+y-s;
if (rt%!=) puts("none");
else printf("%lld\n",rt/);
}
else if (!dep[u]&&!dep[v])
{
ll rt=1ll*x+y+s;
if (rt%!=) puts("none");
else printf("%lld\n",rt/);
}
else
{
if (!dep[u]) swap(u,v),swap(x,y);
if (x-y==s) puts("inf");
else puts("none");
}
}
if (opt==)
{
int u=read(),ww=read();
if (!dep[u]) ww=-ww;
add(dfn[u],ww-w[u]);add(edfn[u]+,w[u]-ww);
w[u]=ww;
}
}
return ;
}

T3:

待填

[雅礼NOIP2018集训] day6的更多相关文章

  1. [雅礼NOIP2018集训 day4]

    感觉状态极差啊,今天居然爆零了 主要是以下原因: 1.又是T1看错题肝了两个小时,发现题意理解错误瞬间心态爆炸 2.T2交错了文件名 3.T3暴力子任务和正解(假的)混在一起,输出了两个答案 都想为自 ...

  2. [雅礼NOIP2018集训 day1]

    现在才来填坑,之后还要陆续补其他几天的,可能前几天真的太颓了 T1: 题目大意:给定一个长度为n的序列,m次询问每次询问给出l,r,询问区间l到r的元素在模k意义下的最大值 数据范围当然是你暴力写不过 ...

  3. [雅礼NOIP2018集训 day3]

    考试的时候刚了T1两个小时线段树写了三个子任务结果发现看错了题目,于是接下来一个半小时我自闭了 result=历史新低 这告诉我们,打暴力要端正态度,尤其是在发现自己之前出锅的情况下要保持心态的平和, ...

  4. 雅礼 noip2018 模拟赛 day3 T3

    典型树形dp 这里,我们应该看到一些基本性质: ①:如果这个边不能改(不是没有必要改),我们就不改,因为就算改过去还要改回来,显然不是最优的 注意:"不能改"是指边的性质和要求的相 ...

  5. 雅礼 noip2018 模拟赛day3 T2

    典型的状压思想 设0表示黑球,1表示白球,用一串01序列代表剩下的球的状态,记f[i]表示在i状态下取球的最大期望 那么可以利用记忆化搜索更新,每一层枚举可能拿走的球然后向下搜索,同时记忆化即可 在状 ...

  6. [雅礼NOIP集训 2017] number 解题报告 (组合数+二分)

    题解: 令$S(i)={i+1,i+2,...,i<<1}$,f(i,k)表示S(i)中在二进制下恰好有k个1的数的个数 那么我们有$f(i,k)=\sum_{x=1}^{min(k,p) ...

  7. 20190817-T1-LOJ6322「雅礼国庆 2017 Day6」Star Way To Heaven

    写这篇题解是因为作者太蒻已经忘了最小生成树了. <题面> 这个题还真是想不到最小生成树. $80\%$算法 复杂度:$\Theta(k^2 \log N )$ 用了二分答案(明显答案具有单 ...

  8. LOJ_6045_「雅礼集训 2017 Day8」价 _最小割

    LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...

  9. 雅礼集训【Day6-1】字符串

    雅礼集训[Day6-1]字符串 假设我们有串\(a\),我们设\(a'\)为\(a\)翻转后按为取反过后的串. 我们只考虑前一半的,长为\(m\)的串.如果前半截匹配了\(a\)或者\(a'\),则\ ...

随机推荐

  1. 英语发音规则---V字母

    英语发音规则---V字母 一.总结 一句话总结: 1.V发[v]? voice [vɒɪs] n. 声音 love [lʌv] n. 恋爱 leave [liːv] vt. 离开 very ['ver ...

  2. php静态函数的使用场景

    php静态函数的使用场景 场景 代码 <?php class Conductor{ public static $i = 100; public function sold(){ $a = se ...

  3. 如何使用github来展示自己的网页

    项目文档或者单纯的html页面怎么用github来展示呢? 第一步:新建库 第二步: 上传自己的页面(index.html需在根目录下) 先把git库克隆下来 进入lineShop文件夹,拷贝自己的页 ...

  4. python黏包解决方案

    解决方案 # 我们可以借助一个模块,这个模块可以把要发送的数据长度转换成固定长度的字节.这样客户端每次接 # 收消息之前只要先接受这个固定长度字节的内容看一看接下来要接收的信息大小,那么最终接受的数据 ...

  5. Git 学习笔记(一)

    某大牛曾经说过,版本控制的最大好处就是让你可以永远后悔,而 Git 无疑是众多版本控制软件当中的佼佼者,在开源社区更是备受青睐,那么它为何会诞生,和其他的版本控制软件项目又有什么不同?且让我们慢慢来看 ...

  6. Spring学习笔记(一) 简介

    版权声明 本文是摘自IBM上Naveen Balani的一篇文章,原文请点击此处:http://www.ibm.com/developerworks/cn/java/wa-spring1/ Sprin ...

  7. 制作ubuntu的U盘启动盘

    在制作U盘启动盘之前,请各位先格式化你的U盘. 制作U盘启动盘的工具有很多种,我们这里为大家介绍的是用软碟通制作.所有我们需要有这个软件,如果大家没有可以百度“软碟通”,下载安装一个.然后点击打开.在 ...

  8. 依赖注入Unity框架

    依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同.依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源:而控制反转是 ...

  9. week5_notebooke1

    大纲: 01 装饰器进阶 02 函数的有效信息 03 可迭代对象.迭代器 04 生成器 列表生成式 生成器表达式 05 内置函数 06 二分查找 01 装饰器进阶 #多个装饰器装饰同一个函数: ## ...

  10. MEF example code

    public interface IObjectResolver { } public class ObjectResolver:IObjectResolver { private Compositi ...