「雅礼集训 2017 Day1」市场

挺神仙的一题。涉及区间加、区间除、区间最小值和区间和。虽然标算就是暴力,但是复杂度是有保证的。

我们知道如果线段树上的一个结点,\(max=min\) 或者 \(max=min+1\) 并且 \(d|max\),是可以直接剪掉的。

我们定义线段树上一个结点的势能为 \(\log(max-min)\),那么我们每执行一次区间除,都会引起势能的减小。

但是执行区间加时我们涉及 \(\log n\) 个结点,最差情况下会将它们的势能恢复为 \(\log(max-min)\)

所以总时间复杂度就是势能总和,不难分析为 \(O(n\log d+q\log n\log d)\)

类似的,我们可以分析区间开根区间加的时间复杂度,在此就不赘述了。

\(Code\ Below:\)

#include <cstdio>
#include <iostream>
#define int long long
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace std;
const int maxn=100000+10;
const int inf=1e18;
int n,m,a[maxn],sum[maxn<<2],Max[maxn<<2],Min[maxn<<2],add[maxn<<2]; inline int read(){
register int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return (f==1)?x:-x;
} inline void pushup(int rt){
sum[rt]=sum[lson]+sum[rson];
Max[rt]=max(Max[lson],Max[rson]);
Min[rt]=min(Min[lson],Min[rson]);
} inline void pushtag(int rt,int C,int len){
sum[rt]+=C*len;
Max[rt]+=C;Min[rt]+=C;add[rt]+=C;
} inline void pushdown(int rt,int len){
if(add[rt]){
pushtag(lson,add[rt],len-(len>>1));
pushtag(rson,add[rt],len>>1);
add[rt]=0;
}
} void build(int l,int r,int rt){
if(l == r){
sum[rt]=Max[rt]=Min[rt]=a[l];
return ;
}
int mid=(l+r)>>1;
build(l,mid,lson);
build(mid+1,r,rson);
pushup(rt);
} void update_plu(int L,int R,int C,int l,int r,int rt){
if(L <= l && r <= R){
sum[rt]+=(r-l+1)*C;
Max[rt]+=C;Min[rt]+=C;add[rt]+=C;
return ;
}
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
if(L <= mid) update_plu(L,R,C,l,mid,lson);
if(R > mid) update_plu(L,R,C,mid+1,r,rson);
pushup(rt);
} void update_div(int L,int R,int C,int l,int r,int rt){
if(L <= l && r <= R){
int A,B;
if(Max[rt]<0) A=(Max[rt]-C+1)/C;
else A=Max[rt]/C;
if(Min[rt]<0) B=(Min[rt]-C+1)/C;
else B=Min[rt]/C;
if(Max[rt]-A==Min[rt]-B){
pushtag(rt,A-Max[rt],r-l+1);
return ;
}
}
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
if(L <= mid) update_div(L,R,C,l,mid,lson);
if(R > mid) update_div(L,R,C,mid+1,r,rson);
pushup(rt);
} int query_min(int L,int R,int l,int r,int rt){
if(L <= l && r <= R){
return Min[rt];
}
pushdown(rt,r-l+1);
int mid=(l+r)>>1,ans=inf;
if(L <= mid) ans=min(ans,query_min(L,R,l,mid,lson));
if(R > mid) ans=min(ans,query_min(L,R,mid+1,r,rson));
return ans;
} int query_sum(int L,int R,int l,int r,int rt){
if(L <= l && r <= R){
return sum[rt];
}
pushdown(rt,r-l+1);
int mid=(l+r)>>1,ans=0;
if(L <= mid) ans+=query_sum(L,R,l,mid,lson);
if(R > mid) ans+=query_sum(L,R,mid+1,r,rson);
return ans;
} signed main()
{
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
build(1,n,1);
int op,l,r,k;
for(int i=1;i<=m;i++){
op=read(),l=read(),r=read();l++;r++;
if(op==1) k=read(),update_plu(l,r,k,1,n,1);
if(op==2) k=read(),update_div(l,r,k,1,n,1);
if(op==3) printf("%lld\n",query_min(l,r,1,n,1));
if(op==4) printf("%lld\n",query_sum(l,r,1,n,1));
}
return 0;
}

「雅礼集训 2017 Day1」矩阵

构造题。

发现无解的情况就是全空的情况,特判掉即可。

现在考虑怎么算出最少步数。

发现只要第 \(i\) 行有黑色,那么第 \(i\) 列会在 \(tot_{white}\) 步变成全黑,所以我们来构造一行全黑的,然后将整个棋盘染成黑色。

那么每行取个最小值即可,累加一下。

\(Code\ Below:\)

#include <bits/stdc++.h>
using namespace std;
const int maxn=1000+10;
int n,m,h[maxn],l[maxn],ans,sum;
char s[maxn][maxn]; int main()
{
scanf("%d%d",&n,&m);
int flag=0;
for(int i=1;i<=n;i++){
scanf("%s",s[i]+1);
for(int j=1;j<=n;j++)
if(s[i][j]=='#'){
flag=1;
h[i]++;l[j]++;
}
}
if(!flag){
printf("-1\n");
return 0;
}
ans=n;
for(int i=1;i<=n;i++) ans=min(ans,n-h[i]+!l[i]);
for(int i=1;i<=n;i++) sum+=l[i]!=n;
printf("%d\n",ans+sum);
return 0;
}

「雅礼集训 2017 Day1」 解题报告的更多相关文章

  1. 「雅礼集训 2017 Day2」解题报告

    「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...

  2. [LOJ 6031]「雅礼集训 2017 Day1」字符串

    [LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...

  3. [LOJ 6030]「雅礼集训 2017 Day1」矩阵

    [LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...

  4. [LOJ 6029]「雅礼集训 2017 Day1」市场

    [LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...

  5. loj#6031. 「雅礼集训 2017 Day1」字符串(SAM 广义SAM 数据分治)

    题意 链接 Sol \(10^5\)次询问每次询问\(10^5\)个区间..这种题第一感觉就是根号/数据分治的模型. \(K\)是个定值这个很关键. 考虑\(K\)比较小的情况,可以直接暴力建SAM, ...

  6. loj#6030. 「雅礼集训 2017 Day1」矩阵(贪心 构造)

    题意 链接 Sol 自己都不知道自己怎么做出来的系列 不难观察出几个性质: 最优策略一定是先把某一行弄黑,然后再用这一行去覆盖不是全黑的列 无解当且仅当无黑色.否则第一个黑色所在的行\(i\)可以先把 ...

  7. loj#6029. 「雅礼集训 2017 Day1」市场(线段树)

    题意 链接 Sol 势能分析. 除法是不能打标记的,所以只能暴力递归.这里我们加一个剪枝:如果区间内最大最小值的改变量都相同的话,就变成区间减. 这样复杂度是\((n + mlogn) logV\)的 ...

  8. 【loj6029】「雅礼集训 2017 Day1」市场&&【uoj#228】基础数据结构练习题

    题解: 这两道题加上区间取min max应该算线段树几道比较不寻常的题目 其实也是挺好理解的 对于区间/d 显然在log次后就会等于0 而我们注意到如果区间中数都相等那么就可以一起除 也就是说每个区间 ...

  9. 【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析

    题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之 ...

随机推荐

  1. wireshark源码分析 一

    因为手头的项目需要识别应用层协议,于是想到了wireshark,打算在项目中集成wireshark协议分析代码.在官网上下了最新版的wireshark源代码,我的天啊,200多M,这么多代码文件怎么看 ...

  2. 关于syslog日志功能详解 事件日志分析、EventLog Analyzer

    关于syslog日志功能详解 事件日志分析.EventLog Analyzer 一.日志管理 保障网络安全 Windows系统日志分析 Syslog日志分析 应用程序日志分析 Windows终端服务器 ...

  3. 27 isinstance与issubclass、反射、内置方法

    isinstance与issubclass issubclass:判断子类是否属于父类,是则返回True,否则返回False isinstance:判断对象是否属于类,是则返回True,否则返回Fal ...

  4. IOS 在一个透明视图上添加不透明的子控件

    环境: 在一个透明的view中添加一个tableview,tableview也变透明了. 解决: 不要这样设置view的透明度 view.backgroundColor = [UIColor clea ...

  5. 2018.11.09 bzoj2165: 大楼(倍增+floyd)

    传送门 先倍增出iii使得2i2^i2i时间时刚好有每个点能够到mmm层及以上. 然后就可以用floyd+floyd+floyd+倍增求出刚好不超过mmm层的时间,最后再补一层就行了. 代码: #pr ...

  6. 牛客训练四:Applese 涂颜色(费马小定理+快速幂)

    题目链接:传送门 思路: 考虑每一列有2种颜色,总共有n行,每一行的第一个格确定颜色,由于左右颜色不相同,后面的行就确定了. 所以总共有2^n中结果. 由于n太大,所以要用到费马小定理a^n%mod= ...

  7. android OkHttpUtils 使用JSON数据作为请求参数

    如果就直接将JSON作为请求字符串,服务端会出现中文乱码.所以只需要将请求的整个JSON参数字符串编码一次,然后服务端解码一次.我这里服务端使用的servlet,下面会两段代码贴出. android: ...

  8. Manacher算法,最长回文串

    给你10000长度字符串,然你求最长回文字串,输出长度,暴力算法肯定超时 #include <iostream> #include <string> #include < ...

  9. wifi adb 的常用命令

    Android 网络调试 adb tcpip 开启方法 2013年05月14日 10:01:03 阅读数:20529 1.连接USB数据线,打开usb调试,使用windows的“运行”命令行方式:(此 ...

  10. docker 搭建 MYSQL并且完成主从复制

    mysql主从复制逻辑: 1.从库执行start slave 开启主从复制. 2.从库请求连接到主库,并且指定binlog文件以及位置后发出请求. 3.主库收到从库请求后,将信息返回给从库,除了信息日 ...