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. C++指针之间的赋值与转换规则总结

    C++指针之间的赋值与转换规则总结 Note:以下结论不适用于类的成员函数指针,关于类的成员函数指针会单独讨论. 一.任何类型的指针变量均可直接赋值给const void * 任何类型的非const指 ...

  2. 输入cin对象的用法

    #include<iostream> using namespace std; int main() { int carrots ; cout << "How man ...

  3. Linux YUM (Yellowdog Updater, Modified) Commands for Package Management

    Linux YUM (Yellowdog Updater, Modified) Commands for Package Management In this article, we will lea ...

  4. Samba和NFS文件共享

    SAMBA文件共享服务 通过Yum软件仓库来安装Samba服务程序 [root@zhangjh ~]# yum install samba -y Samba 配置文件注释信息较多,为了便于配置,因此先 ...

  5. Azure Cloud Service - PaaS

    使用Azure Cloud Service有一段时间了,前阵子在公司内部做一个Cloud Service培训的时候就在想,能不能用一幅图把Cloud Service所涉及的概念都罗列出来.于是就有了下 ...

  6. GPIO基础知识

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

  7. linux环境下kettle部署(JDK安装配置,kettle安装配置,资源库配置,定时执行job)

    一.部署准备 1.1 java安装(略) 1.2 JDK配置 1.     命令行键入“cd /etc”进入etc目录 2.     命令行键入“vi profile”打开profile文件 3.   ...

  8. C语言关键词解释

    51单片机关键词 code code的作用是告诉单片机,我定义的数据要放在ROM(程序存储区)里面,写入后就不能再更改

  9. TopCoder SRM 710 Div2 Hard MinMaxMax Floyd最短路变形

    题意: 有一个无向连通图,没有重边没有自环,并给出顶点的权值和边的权值 定义一条路径\(difficulty\)值为该路径上最大的点权乘上最大的边权 定义函数\(d(i,j)\)为\(i,j\)之间的 ...

  10. Android学习记录(8)—Activity的四种加载模式及有关Activity横竖屏切换的问题

    Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance.以下逐一举例说明他们的区别: standard:Activity ...