csp-s模拟测试56Merchant, Equation,Rectangle题解

题面: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)的做法。

原文地址:https://www.cnblogs.com/Juve/p/11619013.html

时间: 2024-11-26 02:31:43

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

2018-10-25 模拟测试题解

目录 问题 A: 魏传之长坂逆袭 题目描述 输入 输出 样例输入 样例输出 题解 问题 B: 蜀传之单刀赴会 题目描述 [问题描述] 输入 输出 样例输入 样例输出 题解 问题 C: 吴传之火烧连营 [题目背景] [问题描述] 输入 输出 样例输入 样例输出 [样例解释] [数据规模和约定] 题解 本篇题解也发表于zwcblog作者是同一个人 问题 A: 魏传之长坂逆袭 题目描述 众所周知,刘备在长坂坡上与他的一众将领各种开挂,硬生生从曹操手中逃了出去,随后与孙权一起火烧赤壁.占有荆益.成就霸业

2018冬令营模拟测试赛(五)

2018冬令营模拟测试赛(五) [Problem A][UOJ#154]列队 试题描述 picks 博士通过实验成功地得到了排列 \(A\),并根据这个回到了正确的过去.他在金星凌日之前顺利地与丘比签订了契约,成为了一名马猴烧酒. picks 博士可以使用魔法召唤很多很多的猴子与他一起战斗,但是当猴子的数目 \(n\) 太大的时候,训练猴子就变成了一个繁重的任务. 历经千辛万苦,猴子们终于学会了按照顺序排成一排.为了进一步训练,picks 博士打算设定一系列的指令,每一条指令 \(i\) 的效果

2018冬令营模拟测试赛(三)

2018冬令营模拟测试赛(三) [Problem A]摧毁图状树 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 这题没想到贪心 QwQ,那就没戏了-- 贪心就是每次选择一个最深的且没有被覆盖的点向上覆盖 \(k\) 层,因为这个"最深的没有被覆盖的点"不可能再有其它点引出的链覆盖它了,而它又

2018冬令营模拟测试赛(十七)

2018冬令营模拟测试赛(十七) [Problem A]Tree 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 这个数据范围肯定是树上背包了. 令 \(f(i, j, k)\) 表示子树 \(i\) 中选择了 \(j\) 个节点,路径与根的连接情况为 \(k\),具体地: \(k = 0\) 时,路径的两个端点

2018冬令营模拟测试赛(十九)

2018冬令营模拟测试赛(十九) [Problem A]小Y 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 目前未知. 这题目前就能做到 \(O(n \sqrt{M} \log n)\),其中 \(M\) 是逆序对数,然而会被卡 \(T\):当然这题暴力可以拿到和左边那个算法一样的分数,只要暴力加一个剪枝:当左

noip模拟测试21

T1:折纸 这道写崩我也是没话说…… 模拟就完了,记录每次的折叠点,每次将之前的都扫一遍就完了 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cmath> 5 #include<algorithm> 6 #include<cstdlib> 7 #define ll long long 8 using namespace std; 9 con

[考试反思]0929csp-s模拟测试55:沦陷

菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3暴力之后回T1打对拍瞬间爆炸. 于是又重新打了一个2k,WA0.对拍发现. 然后考试就没几分钟了交暴力走了. 不要打完就跑,记得早点对拍改进思路. T1: 的确是挺裸的线段树.离散化或者权值线段树都可以. 但是考场上两个都打出来都死了. 最后用离散化A的. 1 #include<cstdio> 2

模拟测试68,69

68: 32 AlpaCa 41 03:08:20 31 02:46:16 30 02:46:28 102 03:08:20 69: 28 AlpaCa 20 02:51:15 60 03:05:32 0 01:39:45 80 03:05:32 彻底挂掉了呢. 不过也还好吧,至少之后的考试不会有那么大压力了吧(出第一机房是肯定的事了),那利用之后几场考试就调整好状态,下次再来嘛. 但是最近炸了那么多场还是要反思一下,其实不只是心态的问题,自身实力,考试技巧,时间分配等方面好像都有点问题. 69

csp-s模拟测试97

csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 100 00:31:38 10 02:49:26 150 02:49:26 $T1$特判错了希望人品可以++. A. 小盆友的游戏 像题解一样构造一个函数那么这个题就是水题了. B. 花 随手$Dp$. C. 表格 $Dee$树帅但是我咕了. 酷(ひど)いよ 酷(ひど)いよ.もういっそ仆(ぼく)の体(か