终于回来整理了,这两场比赛我也是醉了,第一场-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. [MicroPython]TPYBoard v102炫彩跑马灯WS2812B

    一.实验目的 了解ws2812b的工作原理 学习ws2812b的驱动方法 二.实验器材 TPYBoard v102 1块 ws2812b RGB-Ring-8 1个 micro USB数据线 1条 杜 ...

  2. 如何在同一台电脑上启动多个Tomcat服务器

    安装第二个tomcat完成后,到安装目录下的conf子目录中打开server.xml文件,查找以下三处: (1)修改http范围端口(默认为8080端口) <Connector port=&qu ...

  3. Java函数式编程和lambda表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...

  4. 【出错记录】Tomcat非root用户启动无法拥有权限读写文件

    简单记录下,如有必要,将深入补充: 一.非root用户运行Tomcat及原因 由于项目中,为了安全需要,Tomcat将禁止以root形式启动,原因很简单,举个例子,一旦有人恶意将jsp文件透过某个别的 ...

  5. 企业IT架构转型之道,阿里巴巴中台战略思想与架构实战

    前言: 晚上11点多闲来无事,打开QQ技术群,发现有关 '中心化与引擎化' 的话题,本着学习的心态向大佬咨询,大佬推荐一本书,我大概看了有四分之一的样子,对于我这种对架构迷茫的人来说,如鱼得水,于是特 ...

  6. 《React Native 精解与实战》书籍连载「React Native 底层原理」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  7. Codeforces Round #486 (Div. 3)-C. Equal Sums

    C. Equal Sums time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  8. 牛客练习赛38 D 出题人的手环

    链接 [https://ac.nowcoder.com/acm/contest/358/D] 题意 链接:https://ac.nowcoder.com/acm/contest/358/D 来源:牛客 ...

  9. Python之缩进块

    pycharm编辑器识别冒号,当换行后下一行默认是缩进块的位置:

  10. 【学习总结】之 3Blue1Brown系列

    刷知乎看到的,各种力荐. YouTube: https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw/featured B站: https:// ...