T1:loj 6029 市场

题目大意:

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

思路:

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

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

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

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

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

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<map>
 9 #define ll long long
10 #define inf 2147483611
11 #define MAXN 100100
12 using namespace std;
13 inline int read()
14 {
15     int x=0,f=1;char ch=getchar();
16     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
17     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
18     return x*f;
19 }
20 int n,q,g[MAXN];
21 ll sum[MAXN<<2],mn[MAXN<<2],tag[MAXN<<2],mx[MAXN<<2];
22 void upd(int k) {sum[k]=sum[k<<1]+sum[k<<1|1],mn[k]=min(mn[k<<1],mn[k<<1|1]),mx[k]=max(mx[k<<1],mx[k<<1|1]);}
23 void build(int k,int l,int r)
24 {
25     if(l==r) {sum[k]=mn[k]=mx[k]=g[l];return ;}
26     tag[k]=0;
27     int mid=(l+r)>>1;
28     build(k<<1,l,mid);build(k<<1|1,mid+1,r);
29     upd(k);
30 }
31 void pshd(int k,int l,int r)
32 {
33     int mid=(l+r)>>1;
34     tag[k<<1]+=tag[k],tag[k<<1|1]+=tag[k];
35     mn[k<<1]+=tag[k],mn[k<<1|1]+=tag[k];
36     mx[k<<1]+=tag[k],mx[k<<1|1]+=tag[k];
37     sum[k<<1]+=(mid-l+1)*tag[k],sum[k<<1|1]+=(r-mid)*tag[k];
38     tag[k]=0;
39 }
40 void mdfp(int k,int l,int r,int a,int b,int x)
41 {
42     if(a==l&&r==b) {sum[k]+=(r-l+1)*x,tag[k]+=x,mn[k]+=x,mx[k]+=x;return ;}
43     int mid=(l+r)>>1;
44     if(tag[k]!=0) pshd(k,l,r);
45     if(b<=mid) mdfp(k<<1,l,mid,a,b,x);
46     else if(a>mid) mdfp(k<<1|1,mid+1,r,a,b,x);
47     else {mdfp(k<<1,l,mid,a,mid,x);mdfp(k<<1|1,mid+1,r,mid+1,b,x);}
48     upd(k);
49 }
50 void mdfd(int k,int l,int r,int a,int b,int x)
51 {
52     if(l==a&&r==b&&mn[k]-(ll)floor(1.0*mn[k]/x)==mx[k]-(ll)floor(1.0*mx[k]/x))
53     {
54         ll tmp=mn[k]-(ll)floor(1.0*mn[k]/x);
55         sum[k]-=tmp*(r-l+1),mn[k]-=tmp,mx[k]-=tmp,tag[k]-=tmp;
56         return ;
57     }
58     int mid=(l+r)>>1;
59     if(tag[k]!=0) pshd(k,l,r);
60     if(b<=mid) mdfd(k<<1,l,mid,a,b,x);
61     else if(a>mid) mdfd(k<<1|1,mid+1,r,a,b,x);
62     else {mdfd(k<<1,l,mid,a,mid,x);mdfd(k<<1|1,mid+1,r,mid+1,b,x);}
63     upd(k);
64 }
65 ll querys(int k,int l,int r,int a,int b)
66 {
67     if(a==l&&r==b) return sum[k];
68     int mid=(l+r)>>1;
69     if(tag[k]!=0) pshd(k,l,r);
70     if(b<=mid) return querys(k<<1,l,mid,a,b);
71     else if(a>mid) return querys(k<<1|1,mid+1,r,a,b);
72     else return querys(k<<1,l,mid,a,mid)+querys(k<<1|1,mid+1,r,mid+1,b);
73 }
74 ll querym(int k,int l,int r,int a,int b)
75 {
76     if(a==l&&r==b) return mn[k];
77     int mid=(l+r)>>1;
78     if(tag[k]!=0) pshd(k,l,r);
79     if(b<=mid) return querym(k<<1,l,mid,a,b);
80     else if(a>mid) return querym(k<<1|1,mid+1,r,a,b);
81     else return min(querym(k<<1,l,mid,a,mid),querym(k<<1|1,mid+1,r,mid+1,b));
82 }
83 int main()
84 {
85     n=read(),q=read();int a,b,c;
86     for(int i=1;i<=n;i++) g[i]=read();
87     build(1,1,n);
88     while(q--)
89     {
90         a=read();
91         if(a==1) {a=read(),b=read(),c=read();mdfp(1,1,n,a+1,b+1,c);}
92         else if(a==2) {a=read(),b=read(),c=read();mdfd(1,1,n,a+1,b+1,c);}
93         else if(a==3) {a=read(),b=read();printf("%lld\n",querym(1,1,n,a+1,b+1));}
94         else if(a==4) {a=read(),b=read();printf("%lld\n",querys(1,1,n,a+1,b+1));}
95     }
96 }

View Code

T2:loj 6030 矩阵

题目大意:

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

求最少操作数

思路:

可以先做出一行黑色的

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

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

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<map>
 9 #define ll long long
10 #define inf 2147483611
11 #define MAXN 1010
12 using namespace std;
13 inline int read()
14 {
15     int x=0,f=1;char ch=getchar();
16     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
17     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
18     return x*f;
19 }
20 int ok,n,f[MAXN],cnt1[MAXN],cnt2[MAXN],ans;
21 char maze[MAXN][MAXN];
22 int main()
23 {
24     n=read(),ans=2*n+1;
25     for(int i=1;i<=n;i++)
26     {
27         scanf("%s",maze[i]+1);
28         for(int j=1;j<=n;j++)
29             if(maze[i][j]=='#') f[j]=1,ok++;
30             else cnt1[i]++,cnt2[j]++;
31     }
32     if(!ok) {puts("-1");return 0;}
33     for(int i=1;i<=n;i++)
34         ans=min(ans,cnt1[i]+(!f[i]?1:0));
35     for(int i=1;i<=n;i++)
36         ans+= cnt2[i]?1:0;
37     printf("%d",ans);
38 }

View Code

T3:loj 6031 字符串

转载于:https://www.cnblogs.com/yyc-jack-0920/p/9142216.html

雅礼集训 2017 Day1相关推荐

  1. 数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

    值域线段树+势能线段树+扫描线 KiKi's K-Number ball The Child and Sequence 「雅礼集训 2017 Day1」市场 Atlantis KiKi's K-Num ...

  2. #6029. 「雅礼集训 2017 Day1」市场(势能,区间除)

    #6029. 「雅礼集训 2017 Day1」市场 用线段树维护数列,区间上维护最大最小值,区间和还有标记,修改时,区间加直接做,而区间除时,递归到线段树上某一区间,如果这一操作等价于区间加(也就是最 ...

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

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

  4. LibreOJ#6030. 「雅礼集训 2017 Day1」矩阵

    https://loj.ac/problem/6030 如果矩阵第i列有一个黑色, 那可以用他把第i行全都染黑,也可以使任意一列具有黑色 然后就可以用第i行把矩阵染黑 染黑一列的代价最少是1 染黑一行 ...

  5. ZCUM-1948: #6029. 「雅礼集训 2017 Day1」市场 线段树区间更新

    题目连接:点击打开链接 从前有一个贸易市场,在一位执政官到来之前都是非常繁荣的,自从他来了之后,发布了一系列奇怪的政令,导致贸易市场的衰落. 有 n nn 个商贩,从 0∼n−1 0 \sim n - ...

  6. [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)

    [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿 ...

  7. #6034. 「雅礼集训 2017 Day2」线段游戏 李超树

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统 ...

  8. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 -- 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  9. LOJ#6044. 「雅礼集训 2017 Day8」共(Prufer序列)

    题面 传送门 题解 答案就是\(S(n-k,k)\times {n-1\choose k-1}\) 其中\(S(n,m)\)表示左边\(n\)个点,右边\(m\)个点的完全二分图的生成树个数,它的值为 ...

最新文章

  1. centos运行java图形化界面_CentOS设置默认启动命令行(不启动图形界面)
  2. Linux命令及文件操作
  3. 【vue-number-scroll】数字逐渐增加或者减少的滚动解决方案
  4. ATEN命令--北大青鸟benet课程
  5. jax-rs jax-ws_对状态代码使用JAX-RS异常
  6. Python 中如何解决 asyncio 文件描述符最大数量限制问题
  7. mongodb备份和恢复:mongodump/mongorestore ( 二)
  8. Netty 高性能架构设计
  9. 使用FPM打包工具打rpm包
  10. vscode配置c++11
  11. Linux运维基础入门知识
  12. 单片机常用C代码汇总
  13. LRO -- skb_buff->frags[] skb_buff->frag_list
  14. 有舍有得,解散20个群后 ...
  15. 攻防世界 Web-mfw
  16. 苹果7p最佳系统版本_告别虚拟机和双系统,移动硬盘+Win To Go,苹果笔记本的最佳选择...
  17. 黑马《linux基础编程》学习笔记(从16到20)
  18. 元数据管理系统解决方案及产品调研-数仓系列(一)
  19. 解决TC中Make sure FMS_HOME is set properly
  20. c语言编写简易打飞机游戏

热门文章

  1. CodeForces 543D 树形DP Road Improvement
  2. sharepoint 弹出框
  3. 错误 0xc0202049: 数据流任务 1: 无法在只读列“ID”中插入数据
  4. win8下vs2012加wp8 sdk开发xna4.0PC游戏
  5. VUE 中 使用 iview Form组件 enter键防止页面刷新
  6. Mybatis中输入输出映射和动态Sql
  7. 互联网企业安全高级指南3.6 需要自己发明安全机制吗
  8. swappiness
  9. SQL Server遍历表中记录的2种方法
  10. VMware演示手机虚拟化