T1:loj 6029 市场

题目大意:

维护一个数据结构支持区间加 区间除法 区间求最小值 区间求和

思路:

用线段树维护区间加 区间求最小值 区间和

对于区间除法 注意到除数d很大而加法的w很小

尝试将区间除法变成区间减法

可以转化成减法的情况就是除法的时候减的数相同即区间内所有数相同或最小数和最大数相差为一且最大数为除数的倍数

即维护区间min max 加减法tag sum即可

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#define ll long long
#define inf 2147483611
#define MAXN 100100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,q,g[MAXN];
ll sum[MAXN<<],mn[MAXN<<],tag[MAXN<<],mx[MAXN<<];
void upd(int k) {sum[k]=sum[k<<]+sum[k<<|],mn[k]=min(mn[k<<],mn[k<<|]),mx[k]=max(mx[k<<],mx[k<<|]);}
void build(int k,int l,int r)
{
if(l==r) {sum[k]=mn[k]=mx[k]=g[l];return ;}
tag[k]=;
int mid=(l+r)>>;
build(k<<,l,mid);build(k<<|,mid+,r);
upd(k);
}
void pshd(int k,int l,int r)
{
int mid=(l+r)>>;
tag[k<<]+=tag[k],tag[k<<|]+=tag[k];
mn[k<<]+=tag[k],mn[k<<|]+=tag[k];
mx[k<<]+=tag[k],mx[k<<|]+=tag[k];
sum[k<<]+=(mid-l+)*tag[k],sum[k<<|]+=(r-mid)*tag[k];
tag[k]=;
}
void mdfp(int k,int l,int r,int a,int b,int x)
{
if(a==l&&r==b) {sum[k]+=(r-l+)*x,tag[k]+=x,mn[k]+=x,mx[k]+=x;return ;}
int mid=(l+r)>>;
if(tag[k]!=) pshd(k,l,r);
if(b<=mid) mdfp(k<<,l,mid,a,b,x);
else if(a>mid) mdfp(k<<|,mid+,r,a,b,x);
else {mdfp(k<<,l,mid,a,mid,x);mdfp(k<<|,mid+,r,mid+,b,x);}
upd(k);
}
void mdfd(int k,int l,int r,int a,int b,int x)
{
if(l==a&&r==b&&mn[k]-(ll)floor(1.0*mn[k]/x)==mx[k]-(ll)floor(1.0*mx[k]/x))
{
ll tmp=mn[k]-(ll)floor(1.0*mn[k]/x);
sum[k]-=tmp*(r-l+),mn[k]-=tmp,mx[k]-=tmp,tag[k]-=tmp;
return ;
}
int mid=(l+r)>>;
if(tag[k]!=) pshd(k,l,r);
if(b<=mid) mdfd(k<<,l,mid,a,b,x);
else if(a>mid) mdfd(k<<|,mid+,r,a,b,x);
else {mdfd(k<<,l,mid,a,mid,x);mdfd(k<<|,mid+,r,mid+,b,x);}
upd(k);
}
ll querys(int k,int l,int r,int a,int b)
{
if(a==l&&r==b) return sum[k];
int mid=(l+r)>>;
if(tag[k]!=) pshd(k,l,r);
if(b<=mid) return querys(k<<,l,mid,a,b);
else if(a>mid) return querys(k<<|,mid+,r,a,b);
else return querys(k<<,l,mid,a,mid)+querys(k<<|,mid+,r,mid+,b);
}
ll querym(int k,int l,int r,int a,int b)
{
if(a==l&&r==b) return mn[k];
int mid=(l+r)>>;
if(tag[k]!=) pshd(k,l,r);
if(b<=mid) return querym(k<<,l,mid,a,b);
else if(a>mid) return querym(k<<|,mid+,r,a,b);
else return min(querym(k<<,l,mid,a,mid),querym(k<<|,mid+,r,mid+,b));
}
int main()
{
n=read(),q=read();int a,b,c;
for(int i=;i<=n;i++) g[i]=read();
build(,,n);
while(q--)
{
a=read();
if(a==) {a=read(),b=read(),c=read();mdfp(,,n,a+,b+,c);}
else if(a==) {a=read(),b=read(),c=read();mdfd(,,n,a+,b+,c);}
else if(a==) {a=read(),b=read();printf("%lld\n",querym(,,n,a+,b+));}
else if(a==) {a=read(),b=read();printf("%lld\n",querys(,,n,a+,b+));}
}
}

T2:loj 6030 矩阵

题目大意:

一个黑白矩阵 可以把一行的顺序变成一列

求最少操作数

思路:

可以先做出一行黑色的

然后把所有不是完整一列的黑色变成黑色

做出黑色的最少步数是每一行的白色个数+(如果该行对应的列是否有黑色+1)

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#define ll long long
#define inf 2147483611
#define MAXN 1010
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int ok,n,f[MAXN],cnt1[MAXN],cnt2[MAXN],ans;
char maze[MAXN][MAXN];
int main()
{
n=read(),ans=*n+;
for(int i=;i<=n;i++)
{
scanf("%s",maze[i]+);
for(int j=;j<=n;j++)
if(maze[i][j]=='#') f[j]=,ok++;
else cnt1[i]++,cnt2[j]++;
}
if(!ok) {puts("-1");return ;}
for(int i=;i<=n;i++)
ans=min(ans,cnt1[i]+(!f[i]?:));
for(int i=;i<=n;i++)
ans+= cnt2[i]?:;
printf("%d",ans);
}

T3:loj 6031 字符串

雅礼集训 2017 Day1的更多相关文章

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

    「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...

  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. 矩阵[雅礼集训 2017 Day1]

    SOL 奇奇怪怪的贪心(你也不要问我为什么) #include<bits/stdc++.h> #define N 1007 int f[N][N],sum,ans,Ha,bo,n,Ans; ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 零基础入门学习Python(24)--递归:汉诺塔

    知识点 这节课主要讲解用递归的方法,实现汉诺塔的解答 对于游戏的玩法,我们可以简单分解为三个步骤: 1) 将前63个盘子从X移动到Y上. 2) 将最底下的第64个盘子从X移动到Z上. 3) 将Y上的6 ...

  2. docker push

    一.确保docker hub上有账号 二.确认要提交的镜像的命名空间为自己账号名称 三.在本地登录docker: docker login 四.提交镜像: docker push zhengchuzh ...

  3. ubuntu 16.4 安装mysql-python

    sudo apt-get install python-pip python-dev libmysqlclient-dev pip install MySQL-python

  4. windows 安装 python3

    安装python------------------------------------------------------------ 1,打开连接https://www.python.org/do ...

  5. vue-router 根据路由动态添加目录 控制目录权限

    <template> <el-row class="el-menu" > <el-menu router :default-active='$rout ...

  6. MFC对话框使用CPrintDialog实现打印,指定打印机、后台打印

    推荐下 不错. 对话框打印,网上一搜一大堆,基本分2类: A类: CPrintDialog.DoModal,然后在模态对话框里选打印机.打印配置: B类:GetPrinterDeviceDefault ...

  7. xtu summer individual 6 D - Checkposts

    Checkposts Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Orig ...

  8. Windows Server 2012 防火墙如何添加端口例外的方法(转)

    Windows Server 2012 防火墙如何添加端口例外的方法 Windows Server 2012 防火墙如何添加端口例外的方法 在Windows Server 2012系统中,如果用户想在 ...

  9. CentOS 7.1安装GNOME,开启VNC Server

    版权声明:本文为博主原创文章,未经博主允许不得转载. A.准备: 1.安装GNOME Desktop yum groupinstall 'GNOME Desktop' 2.确认GNOME Deskto ...

  10. HDU1241&POJ2386 dfs简单题

    2道题目都差不多,就是问和相邻所有点都有相同数据相连的作为一个联通快,问有多少个连通块 因为最近对搜索题目很是畏惧,总是需要看别人代码才能上手,就先拿这两道简单的dfs题目来练练手,顺便理一理dfs的 ...