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的更多相关文章

  1. 汕头市队赛 C KMP codeforces B. Image Preview

    汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> ...

  2. 汕头市队赛 SRM 07 D 天才麻将少女kpm

    这道题放了很久还是回来补了 D 天才麻将少女KPM SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     KPM上周叒打了n场麻将,但她这次又没控分,而且 ...

  3. 汕头市队赛SRM 20 T3 灵魂觉醒

    背景 自从芽衣.布洛妮娅相继灵魂觉醒之后,琪亚娜坐不住了.自己可是第一个入驻休伯利安号的啊!于是她打算去找德丽莎帮忙,为她安排了灵魂觉醒的相关课程. 第一天,第一节课. “实现灵魂觉醒之前,你需要先将 ...

  4. 汕头市队赛SRM 20 T2不净的圣杯

    不净的圣杯 SRM 20 背景 作为一张BUG级别的卡,官方打算把它修改得人畜无害一些…… 虽然名字还没想好,但是能力大概是对敌方所有单位造成d点伤害,d为自己牌组中所有卡的编号的最大公约数.这无疑是 ...

  5. 汕头市队赛SRM 20 T1魔法弹

    T1 背景 “主角光环已经不能忍啦!” 被最强控制AP博丽灵梦虐了很长一段时间之后,众人决定联合反抗. 魂魄妖梦:“野怪好像被抢光了?” 十六夜咲夜:“没事,我们人多.” 然后当然是以失败告终了. 八 ...

  6. 汕头市队赛 SRM19 字符题

    从天上掉下来了个这样的问题: 有一个字符串 从中选出两个子串 A,B,求 A+B可以构成的不同串的个数. 还想知道,这么多个串中字典序最大的那一个. 某人捡到了这个问题,并把它扔给了你. [输入] 一 ...

  7. 汕头市队赛 SRM16 T2

    描述 猫和老鼠,看过吧?猫来了,老鼠要躲进洞里.在一条数轴上,一共有n个洞,位置分别在xi,能容纳vi只老鼠.一共有m只老鼠位置分别在Xi,要躲进洞里,问所有老鼠跑进洞里的距离总和最小是多少. 输入格 ...

  8. 汕头市队赛 SRM16

    T3 C-2 SRM 16 描述 给一个数列,给出两种数字, 询问在多少个非空区间中这两种数字出现次数相同. 输入格式 第一行:一个数字n,q,n表示数列长度,q表示q组询问 第二行n个数字表示数列A ...

  9. 汕头市队赛 SRM 07 B 好玩的麻将

    B 好玩的麻将 SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     KPM上周又打了n场麻将,又控了分使得自己的排名是1..n的一个排列.     但她 ...

随机推荐

  1. python__高级 : 动态添加 对象属性, 类属性, 对象实例方法, 类静态方法, 类方法

    给对象添加实例属性,可以直接这样  t.age = 18   ( 假设 t = Test() )  给类添加类属性 , 也可以直接这样  Test.age = 18 那给对象添加实例方法,可以在类外面 ...

  2. 13、python中的函数(闭包与装饰器)

    一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函 ...

  3. GPIO基础知识

    STM32 GPIO入门知识 GPIO是什么? 通用输入输出端口,可以做输入,也可以做输出.GPIO端口可通过程序配置成输入或输出. 引脚和GPIO的区别和联系 STM32的引脚中,有部分是做GPIO ...

  4. 顺序查找&二分查找&索引查找

    1.查找技术的分类.如下图: 2.什么是顺序查找呢?(无序表) 顺序查找的原理很简单,就是遍历整个列表,逐个进行记录的关键字与给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录.如 ...

  5. oracle(sql)基础篇系列(三)——数据维护语句、数据定义语句、伪列

    DML语句 insert 向表中插入新的记录 --三种插入方式 --(1)不写字段的名字,直接按照字段的顺序把值逐个往里插 insert into dept2 values(50,'DANAME',' ...

  6. js和CSS3炫酷3D相册展示

    <!doctype html> <html> <head> <meta charset="UTF"> <title>js ...

  7. jQuery监控动画执行完毕事件

    $('#yourElement').one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend' ...

  8. 《Cracking the Coding Interview》——第8章:面向对象设计——题目8

    2014-04-23 23:49 题目:有个棋牌游戏叫Othello,也叫Reversi.请看游戏规则.中文应该叫黑白棋吧,不常玩儿就是了. 解法:既然这题的规则很清楚,也很清楚,我就写了一个命令行的 ...

  9. PC端网站转换为webApp工具

    百度开发云site App:http://siteapp.baidu.com/

  10. cloud-utils

    官方下载:https://launchpad.net/cloud-utils rpm包下载地址:http://rpmfind.net/linux/rpm2html/search.php?query=c ...