汕头市队赛SRM15
T1——czl SRM 15
众所周知,czl家养了一只可♂爱的***(已屏蔽),那只东西很贪吃,所以czl家很多零食仓库,然而这些仓库里有很多老鼠。
为了心爱的***,czl决定点燃纯艾条,用烟熏老鼠。
共有N个仓库,编号1-N。
假设陵陵在第i个仓库点燃艾条,烟雾就会充满该仓库,并向左右扩散Ai 的距离,接着所有|i-j|<=Ai 的仓库 j 的老鼠被消灭。
陵陵是个爱护环境的人,他想知道最少需要多少支艾条,才可以消灭所有老鼠。
【输入格式】
第一行:一个正整数,代表 N。
第二行:N 个非负整数,第 i 个数代表 A i 。
【输出格式】
第一行:一个整数,代表答案。
【样例】
Inout:
5
2 3 3 3 3
Output:
1
【数据范围】
20%的数据:N <= 20
60%的数据:N <= 10^3
100%的数据:N <= 5*10^5 ,Ai<=N
——————————————————————————
这道题就是用最少的线段覆盖整个区间
这题我写的贪心 把被包含的区间去掉之后 贪心做
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int M=1e6+,inf=0x3f3f3f3f;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int cnt,n,ans,f[M],h[M],q[M];
struct node{int l,r;}e[M];
bool cmp(node a,node b){return a.l!=b.l?a.l<b.l:a.r>b.r;}
int main()
{
int k;
n=read();
for(int i=;i<=n;i++) k=read(),e[i].l=max(,i-k),e[i].r=min(i+k,n);
sort(e+,e++n,cmp); q[++cnt]=;
for(int i=;i<=n;i++) if(e[i].r>e[q[cnt]].r) q[++cnt]=i;
k=; ans=;
int now=e[q[]].r;
while(k<=cnt){
while(k<cnt&&e[q[k+]].l<=now+) k++;
ans++; now=e[q[k]].r; k++;
}printf("%d\n",ans);
return ;
}
T2——sxt SRM 15
为了加快社会主义现代化,建设新渔村,sxt决定给小渔村里每座建筑都连上互联网,方便未来随时随地网购西瓜肥料。
小渔村很大,有 N 座建筑,但地理位置偏僻,网络信号很差。
一座建筑有网,当且仅当满足以下至少一个条件:
1、给中国移动交宽带费,直接连网,花费为 A。
2、向另外一座有网的建筑,安装共享网线,花费为 B×两者曼哈顿距离。
现在,腾腾已经统计出了所有建筑的坐标。他想知道最少要多少费用才能达到目的。
【输入格式】
第一行:三个正整数,代表 N、A、B。
接下来 N 行:每行两个整数 X i 、Y i ,第 i 行代表第 i 座建筑的坐标。
【输出格式】
第一行:一个整数,代表答案。
【样例】
Input
3 3 2
1 1
0 1
0 0
Output
7
【数据范围】
30%的数据:N <= 3,A <= 50,B <= 5
60%的数据:N <= 100,A <= 1000,B <= 20
100%的数据:N <= 10^3 ,A <= 10^4 ,B <= 50,|Xi |,|Y i | < 2^15
——————————————————————————————————
这是道很裸的最小生成树了 直接加一个点 向其他1-n连大小为A的边就好了
我写的prim可能会快点
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=1e3+;
const LL inf=1e15;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,S,A,B,vis[M];
LL x[M],y[M],map[M][M],d[M],ans;
LL pabs(LL x){return x>=?x:-x;}
LL calc(int s1,int s2){return pabs(x[s1]-x[s2])+pabs(y[s1]-y[s2]);}
void prim(){
d[S]=; vis[S]=;
for(int i=;i<=n;i++) d[i]=map[S][i];
for(int i=;i<=n;i++){
double mn=inf;
int h=;
for(int j=;j<=n;j++) if(!vis[j]&&mn>d[j]) mn=d[j],h=j;
ans+=mn; d[h]=; vis[h]=;
for(int j=;j<=n;j++) if(!vis[j]&&map[h][j]<d[j]) d[j]=map[h][j];
}
} int main()
{
n=read(); A=read(); B=read(); S=;
for(int i=;i<=n;i++) x[i]=read(),y[i]=read();
for(int i=;i<=n;i++) map[S][i]=map[i][S]=A;
for(int i=;i<=n;i++) for(int j=i+;j<=n;j++) map[i][j]=map[j][i]=B*calc(i,j);
prim();
printf("%lld\n",ans);
return ;
}
T3——yyl SRM 15

当了集训队爷后的yyl为了当上renying踏上了健身之路,他想让s(你可以认为这个是其他男同学的那啥)的值尽量少,以在妹子面前衬托他的健美。为了达到他的目的,他希望你对序列进行旋转操作,一次旋转操作可以使序列中的所有元素前移一位,并使 s1移动到 sn ,具体来说是这样的:

————————————————————————————————————-
这道题我们可以破环成链 每次相当于把1-n 挪一位相减求和
我们可以发现每个数对答案贡献的函数是线性的不然就是分段函数有个拐点(先递减后递增)
每一位的拐点等于 i+1-v【i】 如果小于0就是一直递增
然后每次移动区间维护一下各种信息就好辣
(zz地比赛没写出来 赛后调了一个多小时.QAQ
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const int M=4e6+;
int read(){
LL ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m;
int v[M],f[M],cnt=;
LL sum,ans,now;
struct node{int pos; LL h;}e[M];
bool cmp(node a,node b){return a.h<b.h;}
int main()
{
n=read(); m=n<<;
for(int i=;i<=n;i++) v[i]=read(),v[i+n]=v[i],sum+=abs(v[i]-i);
for(int i=;i<=m;i++) f[i]=-,e[i].pos=i,e[i].h=i+-v[i];//v[i]==y-x+1
ans=sum; sort(e+,e++m,cmp);
while(e[cnt].h<=&&cnt<=m) f[e[cnt].pos]=,cnt++;
for(int i=;i<=n;i++) now+=f[i];
for(int i=;i<=n;i++){
sum+=now;
sum-=abs(v[i-]-);
sum+=abs(v[i+n-]-n);
now-=f[i];
while(e[cnt].h<=i&&cnt<=m){
int x=e[cnt].pos;
cnt++; f[x]=;
if(i<x&&x<i+n-) now+=;
}
now+=f[i+n-];
ans=min(ans,sum);
}printf("%lld\n",ans);
return ;
}
d
当然因为 v【i】<=n 所以可以利用桶排算出每个值排序后在哪个区间,然后放进那个区间 这样就是o(n)了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const int M=4e6+;
int read(){
LL ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m;
int v[M],f[M],s[M],l[M],r[M],k,cnt=;
LL sum,ans,now;
struct node{int pos; LL h;}e[M],q[M];
bool cmp(node a,node b){return a.h<b.h;}
int main()
{
n=read(); m=n<<;
for(int i=;i<=n;i++) v[i]=read(),v[i+n]=v[i],sum+=abs(v[i]-i);
for(int i=;i<=m;i++) f[i]=-,e[i].pos=i,e[i].h=max(,i+-v[i]),s[e[i].h]++;//v[i]==y-x+1
int last=; for(int i=;i<=m;i++)if(s[i]) l[i]=last+,r[i]=last+s[i],last=r[i];
for(int i=;i<=m;i++) q[l[e[i].h]]=e[i],l[e[i].h]++;
ans=sum; while(q[cnt].h<=&&cnt<=m) f[q[cnt].pos]=,cnt++;
for(int i=;i<=n;i++) now+=f[i];
for(int i=;i<=n;i++){
sum+=now;
sum-=abs(v[i-]-);
sum+=abs(v[i+n-]-n);
now-=f[i];
while(q[cnt].h<=i&&cnt<=m){
int x=q[cnt].pos;
cnt++; f[x]=;
if(i<x&&x<i+n-) now+=;
}
now+=f[i+n-];
ans=min(ans,sum);
}printf("%lld\n",ans);
return ;
}
汕头市队赛SRM15的更多相关文章
- 汕头市队赛 C KMP codeforces B. Image Preview
汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> ...
- 汕头市队赛 SRM 07 D 天才麻将少女kpm
这道题放了很久还是回来补了 D 天才麻将少女KPM SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂. KPM上周叒打了n场麻将,但她这次又没控分,而且 ...
- 汕头市队赛SRM 20 T3 灵魂觉醒
背景 自从芽衣.布洛妮娅相继灵魂觉醒之后,琪亚娜坐不住了.自己可是第一个入驻休伯利安号的啊!于是她打算去找德丽莎帮忙,为她安排了灵魂觉醒的相关课程. 第一天,第一节课. “实现灵魂觉醒之前,你需要先将 ...
- 汕头市队赛SRM 20 T2不净的圣杯
不净的圣杯 SRM 20 背景 作为一张BUG级别的卡,官方打算把它修改得人畜无害一些…… 虽然名字还没想好,但是能力大概是对敌方所有单位造成d点伤害,d为自己牌组中所有卡的编号的最大公约数.这无疑是 ...
- 汕头市队赛SRM 20 T1魔法弹
T1 背景 “主角光环已经不能忍啦!” 被最强控制AP博丽灵梦虐了很长一段时间之后,众人决定联合反抗. 魂魄妖梦:“野怪好像被抢光了?” 十六夜咲夜:“没事,我们人多.” 然后当然是以失败告终了. 八 ...
- 汕头市队赛 SRM19 字符题
从天上掉下来了个这样的问题: 有一个字符串 从中选出两个子串 A,B,求 A+B可以构成的不同串的个数. 还想知道,这么多个串中字典序最大的那一个. 某人捡到了这个问题,并把它扔给了你. [输入] 一 ...
- 汕头市队赛 SRM16 T2
描述 猫和老鼠,看过吧?猫来了,老鼠要躲进洞里.在一条数轴上,一共有n个洞,位置分别在xi,能容纳vi只老鼠.一共有m只老鼠位置分别在Xi,要躲进洞里,问所有老鼠跑进洞里的距离总和最小是多少. 输入格 ...
- 汕头市队赛 SRM16
T3 C-2 SRM 16 描述 给一个数列,给出两种数字, 询问在多少个非空区间中这两种数字出现次数相同. 输入格式 第一行:一个数字n,q,n表示数列长度,q表示q组询问 第二行n个数字表示数列A ...
- 汕头市队赛 SRM 07 B 好玩的麻将
B 好玩的麻将 SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂. KPM上周又打了n场麻将,又控了分使得自己的排名是1..n的一个排列. 但她 ...
随机推荐
- linux 下chown改变隐藏文件夹
chown 在更改隐藏文件的时候,发现无法更改其用户组,如果需要将隐藏文件夹也做一个更改,那么需要加上-h选项. sudo chown ai/node/ * -hR 使用以上命令即可.
- 无序数组中第K大的数
1. 排序法 时间复杂度 O(nlogn) 2. 使用一个大小为K的数组arr保存前K个最大的元素 遍历原数组,遇到大于arr最小值的元素时候,使用插入排序方法,插入这个元素 时间复杂度,遍历是 O( ...
- POJ 2441 状压DP
Arrange the Bulls Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 5289 Accepted: 2033 ...
- Poweroj:来自学长的善意:ZQ的杀龙之旅(状压BFS)
传送门:https://www.oj.swust.edu.cn/problem/show/2794 来自学长的善意:ZQ的杀龙之旅 Time Limit: 15000 MS Memory Limit: ...
- wordCount的执行流程
我们对于wordCount的这个流程,在清晰不过了,不过我们在使用spark以及hadoop本身的mapReduce的时候,我们是否理解其中的原理呢,今天我们就来介绍一下wordCount的执行原理, ...
- Kali2017 Metasploit连接postgresql数据库
msfdb:msf数据库管理命令 1.查看msf数据库连接状态 msf > db_status [*] postgresql selected, no connection //未连接 2.ms ...
- ElasticSearch学习笔记(四)-- 分布式
1. 分布式介绍及cerebro cerebro插件 点击release下载 解压运行 访问9000端口,连接es的9200端口 2. 构建集群 新增一个节点 3. 副本与分片 再加入一个节点 4. ...
- vue计算属性和观察者
1. 计算属性 模板内的表达式非常便利,但在模板中放入太多的逻辑会让模板过重且难以维护,所有就有了计算属性 例子: //html代码 <div id="example"> ...
- Hyper-V中的Linux无法配置网络地址的解决办法
一周碰到2次在Hyper-V 2012中安装了Linux,也安装了IC 3.4.但是却无法配置IP地址的问题.因此造成很多不便,因此找机会把这个原因和解决办法进行了尝试. 这过程中感谢同事的提示,让我 ...
- Managing WMI security
TechNet Library TechNet Archive Windows Server 2003 Product Help Windows Server 2003 Product Help Ad ...