T1/Codeforces 975C

很简单,直接前缀和然后二分找答案即可,注意超过最大挡箭数的时候会“全员复活” ······

#include<bits/stdc++.h>
using namespace std;
inline long long read(){long long x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 200005
int n,q;
long long a[MN],k[MN];
int main(){n=read(),q=read();for(int i=1;i<=n;i++) a[i]=read()+a[i-1];for(int i=1;i<=q;i++) k[i]=read(),k[i]=k[i]+k[i-1]>=a[n]?0:k[i]+k[i-1];for(int i=1;i<=q;i++){cout<<n-(upper_bound(a+1,a+n+1,k[i])-a-1)<<endl;}return 0;
}

T2/POJ 1704

~博弈论,题意是有一行的棋格,Bob和Georgia比赛玩,没人每次可以把任意棋子像左边移动任意的长度,问先手胜还是后手胜。

怎么说,这是最基础的博弈论了吧,把相邻的两个棋子分成同一组,将它们之间的间隔当作SG值,直接^在一起,当结果为0时是必败态,否则是必胜态。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MP 10005
int a[MP],n,T;
int main(){T=read();while(T--){n=read();for(int i=1;i<=n;i++) a[i]=read();sort(a+1,a+n+1);int sum=0;for(int i=n;i>0;i-=2) sum^=a[i]-a[i-1]-1;printf("%s\n",sum?"Georgia will win":"Bob will win");}return 0;
}

T3/POJ 3709

~斜率优化。

题意:给你一堆数,你可以随意的减小它们数值,使得每个数的出现次数不少于k的情况下,问最小的代价是多少。

其实也很少打斜率的题,而且dp本来就是我的弱项,能够A掉这道题,只能说是lucky吧。。。

显然可以得到如下递推式:
       f[i]=min{f[j]+a[j+2]-a[j+1]+a[j+3]-a[j+1]+...+a[i]-a[j+1],0<=j<=i-k+1} O(n^3) 
用前缀和优化,得到:
  f[i]=min{f[j]+S[i]-S[j]-(i-j)*a[j+1],0<=j<=i-k+1} O(n^2)

考虑对于两个数 x 和 y ,(x<y),如果x优于y,我们必须要满足的条件是:

  f[x]-S[x]-(i-x)*a[x+1]<f[y]-S[y]-(i-y)*a[y+1]

整理可得:

  f[x]-f[y]-S[x]+S[y]+x*a[x+1]-y*a[y+1]<i*(a[x+1]-a[y+1])

所以呢,随着i的增加,等式右边的值会越来越小,队首的元素可能会不再优于后面的元素,所以我们需要先排除队首的元素问题:

ll get(int x){while(top>tail&&dy(q[tail],q[tail+1])>x*dx(q[tail],q[tail+1])) tail++;return q[tail];
}

然后我们继续,此时的f[i]值等于,当j等于队首元素值时上式的值。

单调队列的进队操作很显然,令对尾两数为top-1 和 top,将入队的为x,如果x优于top的程度比top优于top-1的程度还厉害,即x会比top更早的优于前一个元素,那么直接--top吧。

void ins(int x){while(top>tail&&dy(q[top-1],q[top])*dx(q[top],x)>=dy(q[top],x)*dx(q[top-1],q[top]))--top;q[++top]=x;
}

本质上呢,就是一个斜率优化。

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 500005
#define ll long long
ll T,k,n,f[MN];
struct sq{ll sm,a;}l[MN];
ll top,tail,q[MN];
ll dx(int x,int y){return l[x+1].a-l[y+1].a;}
ll dy(int x,int y){return f[x]-f[y]-l[x].sm+l[y].sm+x*l[x+1].a-y*l[y+1].a;}
ll get(int x){while(top>tail&&dy(q[tail],q[tail+1])>x*dx(q[tail],q[tail+1])) tail++;return q[tail];
}
void ins(int x){while(top>tail&&dy(q[top-1],q[top])*dx(q[top],x)>=dy(q[top],x)*dx(q[top-1],q[top]))--top;q[++top]=x;
}
int main(){T=read();while(T--){n=read(),k=read();for(int i=1;i<=n;i++) l[i].a=read(),l[i].sm=l[i].a+l[i-1].sm;q[top=tail=1]=0;for(int i=1;i<=n;i++){int from=get(i),to=i-k+1;f[i]=f[from]+l[i].sm-l[from].sm-1LL*(i-from)*l[from+1].a;if(to>=k) ins(to);}cout<<f[n]<<endl;}return 0;
}

T4/POJ 2932

题目的意思很好懂吖。一些不会相交也不相切的圆,找到所有不内含于其他圆的圆。

因为题目内的圆不存在相交的情况, 所以直接储存每个圆的左端点和右端点的x坐标,然后从左扫到右。

我们在从左向右平移与y轴平行的直线的同时,维护与扫面线相交的最外层的圆的集合。从左到右移动中,只有扫面线移动到圆的左右两端时,

圆与扫描线的相交关系才会发生变化,因此我们先将所有这样的x坐标枚举出来并排好序。如果满足是最外面的圆,就储存在set里面。

如何判断满足呢,就是对每一个x,如果是左端点的x坐标就来判断其对应的圆,是否是在set中储存的圆内,如果不是 ,就存到set中。如果是右端点的x坐标,就pop出该圆。

好像:是不是很难呢?

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;const int N = 40005;
int n;
double x[N],y[N],r[N];bool inside(int i, int j){double dx = x[i]-x[j];double dy = y[i]-y[j];return dx*dx+dy*dy <= r[j]*r[j];
}void solve(){vector<pair<double,int> > events;//圆的左右两端的x坐标for(int i = 0; i < n; i++){events.push_back(make_pair(x[i]-r[i],i));//圆的左端events.push_back(make_pair(x[i]+r[i],i+n));//圆的右端
    }sort(events.begin(), events.end());//平面扫描set<pair<double, int> > outers;//与扫面线相交的最外层的圆的集合vector<int>ans;//最外层圆的列表for(int i = 0; i < events.size(); i++){int id = events[i].second % n;if(events[i].second < n){//扫描到左端set<pair<double, int> >::iterator it = outers.lower_bound(make_pair(y[id],id));if(it != outers.end() && inside(id, it->second)) continue;if(it != outers.begin() && inside(id, (--it)->second)) continue;ans.push_back(id);outers.insert(make_pair(y[id], id));}else{//扫描到右端
            outers.erase(make_pair(y[id], id));}}sort(ans.begin(), ans.end());int len = ans.size();printf("%d\n", len);for(int i = 0; i < len; i++){printf("%d%c",ans[i]+1,i+1 == len?'\n' : ' ');}
}int main(){while(~scanf("%d",&n)){for(int i = 0; i < n; i++)scanf("%lf%lf%lf", &r[i],&x[i],&y[i]);solve();}return 0;
}

At last,

happy rank 1!


来自PaperCloud的博客,未经允许,请勿转载,TKS。

转载于:https://www.cnblogs.com/PaperCloud/p/9032919.html

20180513模拟赛相关推荐

  1. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  2. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  3. 2020年蓝桥杯模拟赛2020.3.25直播笔记

    2020年蓝桥杯模拟赛解题报告(CPP版本) 第八题 长草的bfs写法[我想暴力模拟O kmn] 深搜会爆 bfs像投到水里的涟漪 问题: const int dx[] = {1, 0, -1, 0} ...

  4. 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  5. 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  6. 蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载【2013年(第4届)~2021年(第12届)】

    蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载[2013年(第4届)~2021年(第12届)] 百度网盘-CSDN蓝桥杯资料(真题PDF+其它资料)   提取码:6666 2013年 ...

  7. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  8. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  9. 模拟赛-20190114-新魔法(distance)

    前言 第一篇模拟赛题思路总结 题目相关 题目链接 题目大意 给定一个长度为nnn序列,每一个位置iii都有一种颜色aia_iai​ 现在有mmm次操作,操作分两种: 第一种操作,将所有颜色xxx都替换 ...

最新文章

  1. struts2上传图片的全过程
  2. 我自己为我自己定制的文章模板
  3. (Mark)操作系统原理
  4. Jquery中获取选中的select的值
  5. 《Java程序设计》实验报告——Java的对象与类
  6. javascript好文---深入理解定位父级offsetParent及偏移大小
  7. php引入odbc模块,php如何用odbc调用存储过程?
  8. 第二篇 Python数据类型、字符编码、文件处理
  9. RCE 0day影响数万台QNAP SOHO NAS 设备
  10. java后台调用SOE时,报异常java.io.IOException: Attempted read from closed stream
  11. 25 个超棒的 HTML5 JavaScript 游戏引擎开发库
  12. 基于bootstrap的双边栏选择框_iphone自带Dock栏美化功能,你out了
  13. xcode连接iphone调试_电脑操作手机?iPhone,安卓通吃?手机还能这么玩!
  14. Springboot
  15. android word文档预览(支持doc/docx两种格式)
  16. 什么是云服务器ECS
  17. 【沃顿商学院学习笔记】商业基础——Financing:02 年金 Annuity
  18. C语言画直线~Bresenham方法
  19. Elasticsearch——分页查询FromSize VS scroll
  20. Linux 操作系统安装盘的定制

热门文章

  1. 使用awk获得java进程号,获取进程号并赋值判断进程状态
  2. javascript es6 module 模块 的使用
  3. 解决端口 windows10 端口被占用的问题
  4. django两个服务器之间的通讯
  5. 【ES6】Proxy对象
  6. Sublime搭建Python环境
  7. 三个线程按循序一个打印A一个打印B一个打印C 循环打印?
  8. automaticallyAdjustsScrollViewInsets
  9. 神器推荐,可视化 Python 打包 exe,牛逼
  10. 就是这么牛逼,利用Python绘制炫酷专业插图就是这么简单