20180513模拟赛
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模拟赛相关推荐
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- 2017.6.11 校内模拟赛
题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...
- 2020年蓝桥杯模拟赛2020.3.25直播笔记
2020年蓝桥杯模拟赛解题报告(CPP版本) 第八题 长草的bfs写法[我想暴力模拟O kmn] 深搜会爆 bfs像投到水里的涟漪 问题: const int dx[] = {1, 0, -1, 0} ...
- 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...
- 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...
- 蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载【2013年(第4届)~2021年(第12届)】
蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载[2013年(第4届)~2021年(第12届)] 百度网盘-CSDN蓝桥杯资料(真题PDF+其它资料) 提取码:6666 2013年 ...
- 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】
蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...
- 10.30 NFLS-NOIP模拟赛 解题报告
总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...
- 模拟赛-20190114-新魔法(distance)
前言 第一篇模拟赛题思路总结 题目相关 题目链接 题目大意 给定一个长度为nnn序列,每一个位置iii都有一种颜色aia_iai 现在有mmm次操作,操作分两种: 第一种操作,将所有颜色xxx都替换 ...
最新文章
- struts2上传图片的全过程
- 我自己为我自己定制的文章模板
- (Mark)操作系统原理
- Jquery中获取选中的select的值
- 《Java程序设计》实验报告——Java的对象与类
- javascript好文---深入理解定位父级offsetParent及偏移大小
- php引入odbc模块,php如何用odbc调用存储过程?
- 第二篇 Python数据类型、字符编码、文件处理
- RCE 0day影响数万台QNAP SOHO NAS 设备
- java后台调用SOE时,报异常java.io.IOException: Attempted read from closed stream
- 25 个超棒的 HTML5 JavaScript 游戏引擎开发库
- 基于bootstrap的双边栏选择框_iphone自带Dock栏美化功能,你out了
- xcode连接iphone调试_电脑操作手机?iPhone,安卓通吃?手机还能这么玩!
- Springboot
- android word文档预览(支持doc/docx两种格式)
- 什么是云服务器ECS
- 【沃顿商学院学习笔记】商业基础——Financing:02 年金 Annuity
- C语言画直线~Bresenham方法
- Elasticsearch——分页查询FromSize VS scroll
- Linux 操作系统安装盘的定制