Codeforces Round 546 (Div. 2)


layout: post
title: Codeforces Round 546 (Div. 2)
author: "luowentaoaa"
catalog: true
tags:
mathjax: true
- codeforces
- 贪心
- 数学
- 线段树


传送门

A - Nastya Is Reading a Book (签到)

题意

给出每一章的页数范围,然后告诉你当前看到那一页,求还没看完的章节数目

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=2e5+50;
const ll inf=1e17;
typedef unsigned long long ull;
int l[maxn],r[maxn];
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&l[i],&r[i]);int k;scanf("%d",&k);int num=n+1;for(int i=1;i<=n;i++){if(k>r[i])continue;else{num=i;break;}}cout<<n-num+1<<endl;return 0;
}

B - Nastya Is Playing Computer Games (模拟)

题意

一排井盖,井盖下面有金币,你需要拿走所有金币,拿走井盖下的金币需要井盖上没有石头

一开始井盖上面都有一个石头。

每一秒你可以进行以下一种操作

1:向左走或者向右走,

2:把一个石头扔到其他任意一个井盖上面

3:取走金币

现在给你起始位置和井盖个数

问你把所有金币取走需要多少步

思路

很明显的一个贪心策略,可以把所有石头都扔到一个不需要的井盖上面 但是第一个扔的还需要再扔回去

然后因为可能要会出生在中间点,所以可以贪心的选择先向左还是向右走

首先 扔石头肯定需要扔n+1次 ,金币也需要捡n次,走路也需要走n-1次 然后就是重复走的距离min(n-k,k-1)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=2e5+50;
const ll inf=1e17;
typedef unsigned long long ull;int main()
{int n,k;scanf("%d%d",&n,&k);if(n==1||n==k)printf("%d\n",n*3);else{int sum=3*n;sum+=min((k-1),(n-k));printf("%d\n",sum);}return 0;
}

C - Nastya Is Transposing Matrices (神奇)

题意

矩阵a和b 每次可以把a的一个子矩阵按照左对角线翻转,问你能否使a变成b

思路

一开始题目的反转理解错了没想到,

后来发现 如果对于一个2*2的矩阵一次反转就相当于把左下和右上对调。所以只需要保证这一条线的值都相同就肯定可以通过反转变成B

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=2e5+50;
const ll inf=1e17;
typedef unsigned long long ull;
vector<int>v1[500*500+5];
vector<int>v2[500*500+5];
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){int a;scanf("%d",&a);v1[i+j].push_back(a);}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){int a;scanf("%d",&a);v2[i+j].push_back(a);}}for(int i=1;i<=n+m;i++){sort(v1[i].begin(),v1[i].end());sort(v2[i].begin(),v2[i].end());if(v1[i]!=v2[i])puts("NO"),exit(0);}puts("YES");return 0;
}

D - Nastya Is Buying Lunch (贪心)

题意

给出一个1-n的数列,然后给你m个关系 如果前面的数正好在后面的数前面一个位置,那么就可以把这两个数交换位置

问你最多可以让最后一个数(a[n])向前走多少步

思路

首先我们可以把点分成两类。

1:可以让n和她交换位置

2:不可以让n和她交换位置

那么题目就是让n最后能有多少个连续的1类点

所以我们考虑贪心能不能把经可能多的一类点向后移动

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=6e5+50;
const ll inf=1e17;
typedef unsigned long long ull;int a[maxn];
map<int,int>mp[maxn];
int vis[maxn];
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);mp[u][v]=1;if(v==a[n])vis[u]=1;}for(int i=n-1;i>=1;i--){if(vis[a[i]]){for(int j=i+1;j<n;j++){if(mp[a[j-1]].find(a[j])!=mp[a[j-1]].end()){swap(a[j],a[j-1]);}else break;}}}int ans=0;for(int i=n-1;i>=1;i--){if(vis[a[i]])ans++;else break;}printf("%d\n",ans);return 0;
}

E - Nastya Hasn't Written a Legend (线段树)

题意

给你两个序列 \(a_1,a_2\dots a_n\) 和 $ k_1,k_2,\dots k_{n-1}\(,输入保证\) a_{i}+k_{i}<=a_{i-1}$.

两种操作:

1:区间求$ \sum_{i=l}^{r}a_i$

2:给单点$ a_i\(加\)x$ 同时会有连锁反应,若\(a_p+k_p>a_{p+1}\),则\(a_{p+1}\) 更新为$ a_p+k_p$ ,同理更新到\(a_p+2\) 知道不能更新

思路

来自群友的做法 (感谢这位巨佬)

首先根据题意会发现一个式子
\[ a_1\leq a_2-k_1\leq a3-k_2-k_2 \dots \leq a_n-\sum_{i=1}^{n-1}k_i \]
\(p\)位置加上值\(x\) 之后,\(a_p-\sum_{i=1}^{p-1}k_i\)也增加了x。更新之前已知\(a_p-\sum_{i=1}^{p-1}k_i\leq a_{p+1}-\sum_{i=1}^{p}k_i\) 如果\(a_p+k_p+x >a_{p+1}\)

那么\(a_{p+1}=a_p+k_p+x\) 并且\(a_{p+1}-\sum_{i=1}^{p}k_i=a_p-\sum_{i=1}^{p}k_i+x\) $a_{p+2} $同理

最后:

我们令\(b_x=a_x-\sum_{i=1}^{x-1}k_i\),我们给\(p\)单点加上\(x\)之后的效果:就是把\(i\in[p+1,n]\) 内所有小于\(b_p+x\)的值赋值为\(b_p+x\)

所有修改我们已经搞定了,用线段树或者其他数据结构维护就可以了,求和就是\(\sum_{i=l}^{r}b_i+\sum_{i=l}^{r}\sum_{j=1}^{i-1}k_j\) 更新就是区间赋值了,因为\(b_x\) 满足单调不减性所以直接二分查找右端点

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=2e5+50;
const ll inf=1e17;
typedef unsigned long long ull;int n,m;
ll a[maxn],k[maxn],ks[maxn];
struct SegTree{ll sum[maxn<<2],flag[maxn<<2];void build(int o,int l,int r){flag[o]=inf;if(l==r){sum[o]=a[l]-k[l-1];return;}int mid=(l+r)/2;build(o<<1,l,mid);build(o<<1|1,mid+1,r);sum[o]=sum[o<<1]+sum[o<<1|1];}void push_down(int o,int l,int r){if(flag[o]==inf)return;int mid=(l+r)/2;flag[o<<1]=flag[o<<1|1]=flag[o];sum[o<<1]=flag[o]*(mid-l+1);sum[o<<1|1]=flag[o]*(r-mid);flag[o]=inf;}void update(int o,int l,int r,int ql,int qr,ll v){if(ql<=l&&r<=qr){flag[o]=v;sum[o]=v*(r-l+1);return;}int mid=(l+r)/2;push_down(o,l,r);if(ql<=mid)update(o<<1,l,mid,ql,qr,v);if(qr>mid)update(o<<1|1,mid+1,r,ql,qr,v);sum[o]=sum[o<<1]+sum[o<<1|1];}ll query(int o,int l,int r,int ql,int qr){if(ql<=l&&r<=qr)return sum[o];int mid=(l+r)/2;push_down(o,l,r);ll res=0;if(ql<=mid)res+=query(o<<1,l,mid,ql,qr);if(qr>mid)res+=query(o<<1|1,mid+1,r,ql,qr);return res;}
}segtree;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);for(int i=1;i<n;i++)scanf("%lld",&k[i]);for(int i=2;i<n;i++)k[i]+=k[i-1];for(int i=1;i<n;i++)ks[i]=ks[i-1]+k[i];segtree.build(1,1,n);scanf("%d",&m);while(m--){char op[5];int l,r;scanf("%s%d%d",op,&l,&r);if(op[0]=='s')printf("%lld\n",segtree.query(1,1,n,l,r)+ks[r-1]-(l>=2?ks[l-2]:0));else{int L=l,R=n,mid,ans=l;ll sum=segtree.query(1,1,n,l,l)+r;// cout<<"sum="<<sum<<endl;while(L<=R){mid=(L+R)/2;// cout<<"mid="<<mid<<endl;if(sum>segtree.query(1,1,n,mid,mid)){ans=mid;L=mid+1;}elseR=mid-1;}// cout<<"ans="<<ans<<endl;segtree.update(1,1,n,l,ans,sum);}}return 0;
}

转载于:https://www.cnblogs.com/luowentao/p/10520658.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷 P1219 ---- 八皇后

题目描述 检查一个如下的6 x 6的跳棋棋盘&#xff0c;有六个棋子被放置在棋盘上&#xff0c;使得每行、每列有且只有一个&#xff0c;每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列2 4 6 1 3 5来描述&#xff0c;第i个数字表示在第i行…

PXE(preboot execution environment):【网络】预启动执行环节:引导 live光盘 ubuntu livecd 16.4:成功...

default menu.c32label ubuntu menu label ubuntu (version 16.04) kernel ub1604/casper/vmlinuz append root/dev/nfs bootcasper netbootnfs nfsroot192.168.56.1:/e/_temp/ub1604 initrdub1604/casper/initrd quiet splash --# 关键是搭建nfs相应的服务器器并export解压后的…

PHP实现多文件上传

PHP文件上传流程 单击提交按钮&#xff0c;浏览器用户将包含上传文件的表单数据提交给PHP处理程序Web服务器和PHP预处理器首先判断表单数据的大小是否超过php.ini配置文件中的post_max_size选项设置的上限值。 若超过&#xff0c;PHP处理程序将无法得到任何表单数据&#xff0…

bzoj5324:[Jxoi2018]守卫

传送门 首先考虑定下一个端点&#xff0c;然后剩下的就可以递推了 一开始想的是定下左端点&#xff0c;然后预处理出位置最远能看到的位置&#xff0c;后来发现时间GG了 看题解发现定右端点优秀得多 记录下当前\(r\)最远能看到的位置\(p\)&#xff0c;能看到\([p,r]\)一共需要几…

蓝桥杯第八届省赛JAVA真题----分巧克力

标题&#xff1a; 分巧克力 儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有N块巧克力&#xff0c;其中第i块是Hi x Wi的方格组成的长方形。 为了公平起见&#xff0c;小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克…

蓝桥杯第八届省赛JAVA真题----油漆面积

标题&#xff1a;油漆面积 X星球的一批考古机器人正在一片废墟上考古。 该区域的地面坚硬如石、平整如镜。 管理人员为方便&#xff0c;建立了标准的直角坐标系。 每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。 经过各种测量&#xff0c;每个机器人都会报告…

练习2——顺序表

//实现顺序表基本功能&#xff0c;然两个顺序表相并 #include <iostream> #include <stdlib.h> using namespace std; typedef int T; class SeqList{T *data;int MaxSize;int last; public:SeqList(int sz);~SeqList(){delete [] data;}int Length() const {retur…

docker占满linux磁盘根目录的解决办法

一、磁盘根目录被占满 [testlocalhost docker]$ df -lh Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 50G 50G 0G 100% / devtmpfs 7.7G 0 7.7G 0% /dev tmpfs 7.8G 0 7.8G 0…

蓝桥杯第八届省赛JAVA真题----包子凑数

标题&#xff1a;包子凑数 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼&#xff0c;其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼&#xff0c;可以认为是无限笼。 每当有顾客想买X个包子&#xff0c;卖包子的大叔就会迅速选出若干笼包子来&…

蓝桥杯第八届省赛JAVA真题----字母组串

标题&#xff1a;字母组串 由 A,B,C 这3个字母就可以组成许多串。 比如&#xff1a;”A”,”AB”,”ABC”,”ABA”,”AACBB” …. 现在&#xff0c;小明正在思考一个问题&#xff1a; 如果每个字母的个数有限定&#xff0c;能组成多少个已知长度的串呢&#xff1f; 他请好…

蓝桥杯第八届省赛JAVA真题----9数算式

标题&#xff1a;9数算式 观察如下的算式&#xff1a; 9213 x 85674 789314562 左边的乘数和被乘数正好用到了1~9的所有数字&#xff0c;每个1次。 而乘积恰好也是用到了1~9的所有数字&#xff0c;并且每个1次。 请你借助计算机的强大计算能力&#xff0c;找出满足如上要…

《剑指offer》第五十三题(数组中数值和下标相等的元素)

// 面试题53&#xff08;三&#xff09;&#xff1a;数组中数值和下标相等的元素 // 题目&#xff1a;假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实 // 现一个函数找出数组中任意一个数值等于其下标的元素。例如&#xff0c;在数组{-3, -1, // 1, 3, 5}中…

Mysql 外键创建失败原因

最近在学习PHP&#xff0c;在用mysql创建表的时候总是创建不出来&#xff0c;我用的是Navicat做的&#xff0c;虽然建不出来外键&#xff0c;但是会创建出来一个索引&#xff0c;后来才明白&#xff0c;一定要有了对应的索引才能创建外键。

shiro(1) 介绍

一、什么是shiro&#xff08;1&#xff09;属性&#xff1a;java框架&#xff08;2&#xff09;用途&#xff1a;身份验证、用户授权、加密、会话管理&#xff08;3&#xff09;优点&#xff1a;轻量、易用二、三大组件&#xff08;1&#xff09;subject&#xff1a;代表当前主…

PHP实现简单注册登录系统

目录结构如下&#xff0c;其中function文件夹下包含两个函数文件&#xff0c;uploads文件夹用于存放上传的文件。 注&#xff1a;博主使用的是php5&#xff0c;使用php7的小伙伴运行报错的话有一部分原因是新的语法造成的&#xff0c;修改成新语法就可以了 html页面 登录页面…

代码审计中的文件包含漏洞

0x00 背景 文件包含漏洞是php语言的一大特性。文件包含的意思是&#xff0c;服务器在执行PHP文件时&#xff0c;可以通过文件包含函数加载另一个文件中的PHP代码并执行&#xff0c;这会为开发者节省大量的时间。而文件包含漏洞的出现在于服务器没有对要包含的来源文件进行审查&…

蓝桥杯第九届省赛JAVA真题----螺旋折线

标题&#xff1a;螺旋折线 如图p1.pgn所示的螺旋折线经过平面上所有整点恰好一次。 对于整点(X, Y)&#xff0c;我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。 例如dis(0, 1)3, dis(-2, -1)9 给出整点坐标(X, Y)&#xff0c;你能计算出dis(X, Y)…

JAVA-WEB开发环境和搭建

JAVA Web开发环境与搭建 一、下载安装JDK 1.配置jdk开发环境 JAVA_HOME 2.path 二、下载安装eclipse javaEE版本 三、安装部署tomcat 3.1、安装&#xff1a; 直接解压到指定目录即可。&#xff08;注&#xff1a;目录不要太深&#xff1b;目录不要有中文或空格&#xff09; 3.2…

Vue入门 ---- 简易留言板

##简述 初学vue&#xff0c;比Angular要简单易学一点&#xff0c;基本就是html代码json。这是第一个小的例子&#xff0c;用到了vue的几个常用方法&#xff0c;其中v-for的$index稍微有点迷惑&#xff0c;也影响了完成的速度&#xff0c;网上说是vue2.0已经取消了这种用法&…

Factors of Factorial AtCoder - 2286 (N的阶乘的因子个数)(数论)

Problem Statement You are given an integer N. Find the number of the positive divisors of N!, modulo 10^97. Constraints 1≤N≤10^3Input The input is given from Standard Input in the following format: NOutput Print the number of the positive divisors of N!,…