终于回来整理了,这两场比赛我也是醉了,第一场-1分,第二场被skip,还是太菜啊qaq

CF1041

T1T2过水忽略直接看后面

T3大意:给你一个长度为n的序列a1,a2,a3···an,你需要把这些数分成若干组,使得每组数任意两数之差严格大于d,并且满足组数尽可能少。

sol:有理有据的贪心。开一个小根堆,存入每一组的最大的数,当有一个新的数字时,判断它是否大于堆顶的元素+d,若满足就把当前元素归入哪一组并更新小根堆,否则新开一个编号,压入堆中。

#include <queue>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=;
struct data{int p,q;}a[N];
inline bool cmp(data a,data b){return a.p<b.p;}
struct node{int num,id;};
priority_queue<node>q;
inline bool operator<(const node &p,const node &q){return p.num>q.num;}
int n,m,d,re=,b[N];
int main()
{
int i; scanf("%d%d%d",&n,&m,&d); for(i=;i<=n;i++)scanf("%d",&a[i].p),a[i].q=i;
sort(a+,a+n+,cmp); re=; q.push((node){a[].p,}); b[a[].q]=;
for(i=;i<=n;i++)
{
node tmp=q.top();
if(tmp.num+d<a[i].p)
{
q.pop(); q.push((node){a[i].p,tmp.id}); b[a[i].q]=tmp.id;
}
else
{
re++; q.push((node){a[i].p,re}); b[a[i].q]=re;
}
}printf("%d\n",re); for(i=;i<n;i++)printf("%d ",b[i]); printf("%d",b[n]);
}

T4大意:你当前高度为h,你每往前飞一个单位就会下降一个单位(不能贴地飞行),给出n段气流,在气流中你不会下降,求你可以飞的最远距离(不限制起点)ps:气流从左到右有序给出。

sol:先对1~n段气流做一个前缀和,记录1~i段会下降的距离和会向前滑行的距离,易知起点一定是某段气流的左端点(不然开始就白白下降),所以枚举左端点,二分右端点最远可能的位置,得到答案。

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=;
#define int long long
int n,h,ans=,s[N],su[N];
struct node{int x,y;}a[N];
inline bool jud(int S,int T)
{
if(s[T]-s[S]<h)return true; else return false;
}
signed main()
{
int i,l,r,mid,tmp; scanf("%lld%lld",&n,&h); for(i=;i<=n;i++)scanf("%lld%lld",&a[i].x,&a[i].y),ans=max(ans,a[i].y-a[i].x+h);
for(i=;i<=n;i++)s[i]=s[i-]+a[i].x-a[i-].y; for(i=;i<=n;i++)su[i]=su[i-]+a[i].y-a[i].x;
for(i=;i<=n;i++)
{
l=i,r=n,mid,tmp;
while(l<=r)
{
mid=(l+r)/; if(jud(i,mid))l=mid+,tmp=mid;else r=mid-;
}ans=max(ans,su[tmp]-su[i-]+h);
}printf("%lld\n",ans);
}

T5大意:有一棵树,现在给你每条树边被去掉时,形成的两个联通块中点的最大的编号分别是多少,问满足条件的树存不存在,若存在请构造出这棵树

sol:每条边一定有一端的最大值为n,所以我们就围着n建菊花图就好了,左右两端最大值相同的边就串成一条链接在n上

#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int N=;
int n,in1[N],a[N],b[N],n1=,n2=;
bool G[N][N];
vector<int>V[N];
int main()
{
int i,j,x,y,bo=; scanf("%d",&n); memset(in1,,sizeof in1);
for(i=;i<n;i++)
{
scanf("%d%d",&x,&y); if(y!=n)return *printf("NO\n"); in1[x]++;
}
for(i=;i<n;i++)if(!in1[i])a[++n1]=i;else b[++n2]=i;
for(i=,j=;i<=n2;i++)
{
if(in1[b[i]]>)
{
in1[b[i]]--;
while(in1[b[i]]>&&j<=n1)
{
if(b[i]<a[j]){bo=;break;}
V[b[i]].push_back(a[j]); in1[b[i]]--; j++;
}if(bo)break;
}else G[b[i]][n]=;
}
if(!bo)
{
for(i=;i<n;i++)
{
if(V[i].size())
{
for(j=;j<V[i].size()-;j++)
{
G[V[i][j]][V[i][j+]]=;
}G[i][V[i][]]=; G[V[i][V[i].size()-]][n]=;
}
}printf("YES\n");
for(i=;i<=n;i++)for(j=;j<=n;j++)if(G[i][j])printf("%d %d\n",i,j);
}else return *printf("NO\n");
}

CF1042

T3大意:给出一个长度为n的序列,每次可以合并两个数ax,ay(ax会消失,ay变成ax*ay),你还有一个机会可以删除一个数,使得最后得到的数最大

sol:大力高精 想都别想 于是乎发现:如果负数有奇数个,那么要删除绝对值最小的那个,如果有0的话,先把0合成一个,以上两样如都有,则合在一起去掉反之则去掉存在的那个,(与此同时要注意,如果只剩一个数,是万万不能删掉的,不要问为什么,全删了答案是什么qaq)

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=;
int n,m,a[N],cnt=,v[N];
int main()
{
int i,j,po=,bo=; scanf("%d",&n); m=n; for(i=;i<=n;i++)scanf("%d",&a[i]); if(n==)return ;
for(i=;i<=n;i++)
{
if(a[i]<) {bo++; if(!po)po=i; else if(a[po]<a[i])po=i;}
else if(a[i]==)v[++cnt]=i;
}i=;
while(i<cnt)
{
printf("1 %d %d\n",v[i],v[i+]); i++; m--; if(m==) return ;
}
if(bo&)
{
if(cnt)
{
printf("1 %d %d\n",min(po,v[cnt]),max(po,v[cnt])); m--; if(m!=)printf("2 %d\n",max(po,v[cnt])); else return ;
}
else
{
printf("2 %d\n",po);
}j=;
for(i=;i<=n&&j<=n;)
{
while((a[i]==||i==po)&&i<=n)i++; j=i+; while((a[j]==||j==po)&&j<=n)j++; if(j>n)return ;
printf("1 %d %d\n",i,j); i=j; j=i+; m--; if(m==)return ;
}
}
else
{
po=;
if(cnt)
{
printf("2 %d\n",v[cnt]);
}j=;
for(i=;i<=n&&j<=n;)
{
while((a[i]==||i==po)&&i<=n)i++; j=i+; while((a[j]==||j==po)&&j<=n)j++; if(j>n)return ;
printf("1 %d %d\n",i,j); i=j; j=i+; m--; if(m==)return ;
}
}
}

T4大意:给出一个长度为n的序列和一个数d,找出所有连续的子串使得其和小于d,求子串个数

sol:树状数组加二分,先计算前缀和,离散一下,从1~n枚举每个前缀和,统计比s[i]-d大的个数,最后算一下有几个前缀和小于d,加入答案就完了,似乎比T3要水

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N=;
int n,m,t,tot=,s[N],tr[N],pre[N];
struct node{int w,id,nid;}a[N];
inline bool cmp(node a,node b){return a.w<b.w;}
inline bool cmp1(node a,node b){return a.id<b.id;}
#define lowbit(x) ((x)&(-x))
inline void ins(int x){while(x>){tr[x]++;x-=lowbit(x);}}
inline int que(int x){int re=;while(x<=tot){re+=tr[x];x+=lowbit(x);}return re;}
inline int ask(int v)
{
int l=,r=tot+,mid,tmp=tot+;
while(l<=r)
{
mid=(l+r)>>;if(pre[mid]>=v)r=mid-,tmp=mid;else l=mid+;
}if(pre[tmp]==v)return tmp+;else return tmp;
}
signed main()
{
int i,x,ans=,po; scanf("%lld%lld",&n,&t);
for(i=;i<=n;i++)
{
scanf("%lld",&x); s[i]=s[i-]+x; a[i].w=s[i]; a[i].id=i;
}sort(a+,a+n+,cmp); tot=; pre[]=a[].w; a[].nid=;
for(i=;i<=n;i++)
{
if(a[i].w!=a[i-].w){tot++;pre[tot]=a[i].w;} a[i].nid=tot;
}sort(a+,a+n+,cmp1);
for(i=;i<=n;i++)
{
po=ask(pre[a[i].nid]-t); ans+=que(po); ins(a[i].nid);
}
for(i=;i<=n;i++)if(s[i]<t)ans++; printf("%lld\n",ans);
}

CF 1041 1042整理的更多相关文章

  1. CF 1041 F. Ray in the tube

    F. Ray in the tube 链接 题意: 有两条平行于x轴的直线A,B,每条直线上的某些位置有传感器.你需要确定A,B轴上任意两个整点位置$x_a$,$x_b$,使得一条光线沿$x_a→x_ ...

  2. 【转】T-SQL 教程

    USE [test] GO /****** Object: StoredProcedure [dbo].[PageIndex] Script Date: 12/07/2011 10:26:36 *** ...

  3. 最全的Java面试宝典

    一. 前言部分 从享受生活的角度上来说:“程序员并不是一种最好的职业,我认为两种人可以做程序员,第一,你不做程序员,你就没有什么工作可做,或者说是即使有可以做的工作但是你非常不愿意去做:第二,你非常痴 ...

  4. Linux命令学习总结:dos2unix - unix2dos

    命令简介: dos2unix是将Windows格式文件转换为Unix.Linux格式的实用命令.Windows格式文件的换行符为\r\n ,而Unix&Linux文件的换行符为\n. dos2 ...

  5. 为什么operator>>(istream&, string&)能够安全地读入长度未知的字符串?

    一般而言,实现"读入用户输入的字符串",程序中自然不能对用户输入的长度有所限定.这在C++中很容易实现,而在C中确没那么容易. 这一疑问,我在刚学C++的时候也在脑中闪现过:不过很 ...

  6. AutoCAD安装失败

    问题一: Installing .NET Framework Runtime 4.0: D:\安装包\CAD\cad2012(x64)\Map3D2012(x64)\3rdParty\NET\4\wc ...

  7. Bzoj索引

    1001 : http://ideone.com/4omPYJ1002 : http://ideone.com/BZr9KF1003 : http://ideone.com/48NJNh1004 : ...

  8. CAD2012安装错误

    安装CAD2012总是会出现各种错误,不能安装,特别是.NET Framework Runtime 4.0安装错误. 单独安装dotNetFx40_Full_x86_x64.exe会提示更高级的版本已 ...

  9. java中常用的工具类(一)

    我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...

随机推荐

  1. BZOJ5294 BJOI2018 二进制 线段树

    传送门 因为每一位\(\mod 3\)的值为\(1,2,1,2,...\),也就相当于\(1,-1,1,-1,...\) 所以当某个区间的\(1\)的个数为偶数的时候,一定是可行的,只要把这若干个\( ...

  2. Spring Cloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务

    首先简单解释一下什么是声明式实现? 要做一件事, 需要知道三个要素,where, what, how.即在哪里( where)用什么办法(how)做什么(what).什么时候做(when)我们纳入ho ...

  3. 破解爱奇艺优酷等Vip视频

    现在网络上兴起卖低价Vip会员的,博主在这里介绍一个破解软件,不需要登录,找到视频播放页就可以观看! 软件下载地址:http://zyzpp.cn/ 1.下载软件安装后打开: 2.比如我们要看爱奇艺的 ...

  4. JS判断当前设备是 PC IOS Andriod

    JS判断当前设备是 PC IOS Andriod <script > window.onload = function(){ var isPc = IsPC(); var isAndroi ...

  5. MVC5+EF6入门教程——实现动态创建数据库与登录验证

    详细步骤 创建文件夹,规划好项目目录 创建相关实体类 (Data Model) 创建 Database Context 创建Initializer, 使用EF初始化数据库,插入测试数据 实现数据库登录 ...

  6. Jmeter实例(一)_Beanshell脚本断言Mock接口

    我们在做接口断言的时候,如果遇到复杂的json,可以考虑用beanshell脚本去解析list,同时加入自定义的断言 Mock例:https://www.easy-mock.com/mock/5cb4 ...

  7. docker配置阿里云镜像加速

    一.登录阿里云控制台,并打开镜像加速器页面,复制加速器地址 二.修改daemon配置文件/etc/docker/daemon.json ,将复制的地址按照如下格式写入文件,若存在多行,使用逗号分隔. ...

  8. Let's-Bug修复日志

    Version 1.1 2015/11/16 修复了上传图片画质问题的Bug 修复了搜索功能的部分Bug 增加了下拉刷新的功能 修复了部分界面跳转之间的问题    

  9. Choosing The Commander CodeForces - 817E (01字典树+思维)

    As you might remember from the previous round, Vova is currently playing a strategic game known as R ...

  10. Failure to transfer org.apache.maven:maven-archiver:pom:2.5 from https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval o

    pom.xml报错: Failure to transfer org.apache.maven:maven-archiver:pom:2.5 from https://repo.maven.apach ...