题面:https://www.cnblogs.com/Juve/articles/11619002.html

merchant:

二分答案,贪心选前m大的

但是用sort复杂度不优,会T掉

我们只是找前m大的,至于前m大的如何排序我们并不关心

所以用nth_element()函数找出前m大的,然后贪心check

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=1e6+5;
int n,m,s,l=0,r=1e9,mid,d[MAXN];
struct node{
int k,b;
}c[MAXN];
int max(int a,int b){
return a>b?a:b;
}
inline bool check(re int x){
re int res=0;
for(int i=1;i<=n;++i) d[i]=c[i].k*x+c[i].b;
nth_element(d+1,d+n-m+1,d+n+1);
for(re int i=n-m+1;i<=n;++i){
res+=max(0,d[i]);
if(res>=s) return 1;
}
return res>=s;
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&s);
for(re int i=1;i<=n;++i) scanf("%lld%lld",&c[i].k,&c[i].b);
while(l<r){
mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
printf("%lld\n",l);
return 0;
}

equation:

我们化减一下就能得出每个$x_i$关于$x_1$的关系:

若设$deep[1]=1$,则:${x_1}\pm{x_i}=t_i$,每个节点i都能表示成这个式子,

$deep[x_i]$是偶数就是加,奇数就是减

把边权放到点权,那么:

$t_i=\sum k*w[j]$,其中j是i到根节点路径上的点,$k=\pm1$,$deep[x_i]$是偶数就是1,奇数就是-1,

对于$t_i$,我们可以用树状数组查询,修改用差分思想,注意deep[i]的正负

询问就是三个未知数三个方程

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=1e6+5;
int n,q,vall,fa[MAXN],w[MAXN];
int to[MAXN<<1],nxt[MAXN<<1],pre[MAXN],cnt=0,val[MAXN<<1];
void add(int u,int v,int ww){
++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt,val[cnt]=ww;
}
int c[MAXN];
int lowbit(int x){
return x&(-x);
}
void update(int pos,int val){
for(int i=pos;i<=n;i+=lowbit(i)){
c[i]+=val;
}
}
int query(int pos){
int res=0;
for(int i=pos;i>0;i-=lowbit(i)){
res+=c[i];
}
return res;
}
int deep[MAXN],dfn=0,rk[MAXN],id[MAXN],idd[MAXN];
void dfs(int x,int f,int dep){
deep[x]=dep;
rk[++dfn]=x;
id[x]=dfn;
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==f) continue;
dfs(y,x,dep+1);
}
idd[x]=dfn;
}
signed main(){
//freopen("test.in","r",stdin);
scanf("%lld%lld",&n,&q);
if(q==0) return 0;
for(int i=2;i<=n;++i){
scanf("%lld%lld",&fa[i],&w[i]);
add(i,fa[i],w[i]),add(fa[i],i,w[i]);
}
dfs(1,0,1);
for(int i=1;i<=n;++i){
if((deep[i]&1)==0) update(id[i],w[i]),update(idd[i]+1,-w[i]);
else update(id[i],-w[i]),update(idd[i]+1,w[i]);
}
while(q--){
int opt;
scanf("%lld",&opt);
if(opt==1){
int u,v,s;
scanf("%lld%lld%lld",&u,&v,&s);
int p=query(id[u]),q=query(id[v]);
if((deep[u]&1)==0&&(deep[v]&1)==0){//x1+xu=p,x1+xv=q;
int t=p+q-s;
if(t&1==1) puts("none");
else printf("%lld\n",t/2);
}
else if((deep[u]&1)==0&&(deep[v]&1)==1){//x1+xu=p,x1-xv=q;
int t=p-q;
if(t==s) puts("inf");
else puts("none");
}
else if((deep[u]&1)==1&&(deep[v]&1)==0){
int t=q-p;
if(t==s) puts("inf");
else puts("none");
}
else{//x1-xu=p,x1-xv=q;
int t=p+q+s;
if((t&1)==1) puts("none");
else printf("%lld\n",t/2);
}
}else{
int u,ww;
scanf("%lld%lld",&u,&ww);
if((deep[u]&1)==0){
update(id[u],ww-w[u]),update(idd[u]+1,w[u]-ww);
}else{
update(id[u],w[u]-ww),update(idd[u]+1,ww-w[u]);
}
w[u]=ww;
}
}
return 0;
}

rectangle:

不会了,只有n4暴力

先考虑横坐标互不相同的情况。枚举矩形的右边界R和左边界L,假设左边界上的点的坐
标为(L, y 1 ),右边界上的点的坐标为(R, y 2 ),不妨设y 1 ≤ y 2 ,考虑怎么一次计算所有左边界
为L右边界为R的矩形的面积和。
由于这些矩形的面积可以表示为(R − L) × (y max − y min ),可以发现我们只需要知道在
所有L ≤ x ≤ R的点中,满足y ≤ y 1 的不同的y有多少个,以及它们的和;相应地还有满
足y ≥ y 2 的信息。枚举右边界后,从大到小地枚举左边界,在移动左边界时用树状数组维护
信息即可。
现在考虑一般情况,以相同的方式枚举左右边界,此时横坐标为L或R的点可能有很多,
这些点的纵坐标会划分出若干个区间,此时再枚举上边界的纵坐标所在的区间,即可得到对
应的可行的下边界的区间,仍然可以用树状数组维护和查询。
复杂度为O(nm log m),其中m为坐标范围。树状数组常数非常优秀,因此可以快速通
过。
bonus: 找到一个复杂度为O(nm)的做法。

csp-s模拟测试56Merchant, Equation,Rectangle题解的更多相关文章

  1. [CSP模拟测试43、44]题解

    状态极差的两场.感觉现在自己的思维方式很是有问题. (但愿今天考试开始的一刻我不会看到H I J) A 考场上打了最短路+贪心,水了60. 然而正解其实比那30分贪心好想多了. 进行n次乘法后的结果一 ...

  2. [7.18NOIP模拟测试5]砍树 题解(数论分块)

    题面(加密) 又考没学的姿势……不带这么玩的…… 考场上打了个模拟 骗到30分滚粗了 稍加思考(滑稽)可将题面转化为: 求一个最大的$d$,使得 $\sum \limits _{i=1}^n {(\l ...

  3. [20190727NOIP模拟测试9]单(single) 题解(树上dp)

    啊啊啊啊啊啊啊啊考场上差一点就A掉了5555 千里之堤溃于蚁穴……鬼知道最后一步那么显然的柿子我为什么没考虑用上…… 观察数据范围可知,出题人期望我们想出一个$O(n)$的做法 当然也有可能是$O(n ...

  4. [NOIP模拟测试9]题(Problem) 题解 (组合数全家桶+dp)

    达哥送分给我我都不要,感觉自己挺牛批. $type=0:$ 跟visit那题类似,枚举横向移动的步数直接推公式: $ans=\sum C_n^i \times C_i^{\frac{i}{2}} \t ...

  5. [NOIP模拟测试3] 建造游乐园 题解(欧拉图性质)

    Orz 出题人石二队爷 我们可以先求出有n个点的联通欧拉图数量,然后使它删或增一条边得到我们要求的方案 也就是让它乘上$C_n^2$ (n个点里选2个点,要么删边要么连边,选择唯一) 那么接下来就是求 ...

  6. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  7. [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania

    [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...

  8. noi2019模拟测试赛(四十七)

    noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...

  9. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

随机推荐

  1. class5_Radiobutton 选择按钮(选项选择)

    最终的运行效果图(程序见序号4) #!/usr/bin/env python# -*- coding:utf-8 -*-# -------------------------------------- ...

  2. Python3 From Zero——{最初的意识:000~Initial consciousness}

    http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 a.编码 默认情况下,Python ...

  3. 剑指offer——18打印从1到最大的n位数

    题目: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数999. 题解: 注意大数溢出问题,故使用字符串更靠谱 class Solution { pu ...

  4. 2.1_springboot2.x消息介绍&RabbitMQ运行机制

    1.概述 1.大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力 2.消息服务中两个重要概念: ​ 消息代理(message broker)即消息服务器 和目的地(destination ...

  5. java-day13

    异常 指的是程序在执行过程中,出现的非正常情况,最终会导致JVM的非正常停止 异常分类:编译异常,运行期异常 异常的产生过程分析 throw关键字:指方法中抛出指定异常 使用格式:throw new ...

  6. rtsp+rtmp多路流媒体播放

    一.前言 之前博主有写过 一篇博文,讲的是使用videojs在谷歌浏览器网页上播放rtmp流媒体,具体可参考我之前的博客:https://www.cnblogs.com/FHC1994/p/99814 ...

  7. 网页开发人员收藏的16款HTML5工具

    本文收集的20款优秀的 HTML5 Web 应用程序,值得添加到您的 HTML5 的工具箱中,他们能够帮助你开发前端项目更快.更容易. Initializr Initializr 是一个可以让你创建 ...

  8. Vue——组件上使用v-model

    一.最近在工作过程中要实现一个搜索模糊匹配功能,考虑到组件的复用,就单独把搜索框抽出来作为一个子组件.在以往的开发中,我一般会在input框中的值变化时向父组件emit一个事件,并带上一些父组件中需要 ...

  9. C 常见字符串操作函数

    头文件 <string.h> 1. char *strstr(const char *str1, const char *str2);      判断str2是否为str1的子串  //s ...

  10. 清空资源管理器访问过FTP的账号、密码

    修改注册表,删除HKEY_CURRENT_USER\SOFTWARE\Microsoft\FTP\Accounts下相对应的项即可,即为xxx.xxx.xxx.xxx项. 如下图所示: