[POI2009]ARC-Architects
[POI2009]ARC-Architects
题意:
给定一个序列,从中挑选k个数,满足下标单调递增,并且字典序最小;
思路:
由于字典序最小,所以考虑贪心,即前面的数尽可能大,所以用单调队列维护最大值;
细节:
注意单调队列对头应该是上次选的数的下一个数,另外要满足k个数,所一直以维护队尾;
因为是交互题,注意变量名重复;
代码
/*************************************************************************}
{* *}
{* XVI Olimpiada Informatyczna *}
{* *}
{* Zadanie: Architekci (ARC) *}
{* Plik: carclib.c *}
{* Autor: Bartosz Gorski *}
{* Opis: Biblioteka do wczytywania danych wejsciowych i wypisywania *}
{* wyniku *}
{* *}
{*************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define MAGIC_BEGIN -435634223
#define MAGIC_END -324556462
#define MIN_K 1
#define MAX_K 1000000
#define MAX_N 15000000
#define MIN_A 1
#define MAX_A 1000000000
#define MIN_TYP 1
#define MAX_TYP 3
#define MIN_PAR 0
#define MAX_PAR 1000000000
#define ERROR 0
#define CORRECT 1
#define unlikely(x) __builtin_expect(!!(x), 0)
static int init = 0; // czy zostala juz wywolana funkcja inicjuj()
static int lib_n; // ile biblioteka podala juz liczb
static int con_k; // ile zawodnik podal liczb
static int N, K, A, TYP, PAR; // parametry testu wczytywane z pliku
static int bre, len_sub, bou, is_end; // zmienne pomocnicze
static int rand2_status = 198402041;
static inline int rand2(int a, int b){
rand2_status = rand2_status * 1103515245 + 12345;
int x = rand2_status;
if (x < 0) x = -x; // -2^31 sie nie zdarza :D
x >>= 1;
x = a + x % (b - a + 1);
return x;
}
/* test losowy */
static inline int random_test()
{
return rand2(1, A);
}
/* test z dlugim podciagiem nierosnacym */
static inline int decreasing_test()
{
int tmp;
if(bre == 0) {
bre = rand2(0, (N - lib_n + 1 - len_sub));
tmp = A;
A -= rand2(0, (A - 1) / len_sub);
len_sub--;
}
else {
bre--;
tmp = rand2(1, A);
}
return tmp;
}
/* test z dlugim podciagiem niemalejacym */
static inline int increasing_test()
{
return bou - decreasing_test();
}
static void finish(int res, char *com)
{
if(res == ERROR)
printf("%s\n", com);
exit(0);
}
/* Inicjuje dane wejsciowe i zwraca liczbe projektow */
int inicjuj()
{
if(init == 1)
finish(ERROR, "Program zawodnika moze wywolac funkcje inicjuj tylko raz!!!");
init = 1;
scanf("%d", &K);
if (K > 0){
TYP = 0;
N = MAX_N + 2;
return K;
}
int magic_begin, magic_end;
scanf("%d%d", &magic_begin, &TYP);
if(magic_begin != MAGIC_BEGIN || TYP < MIN_TYP || TYP > MAX_TYP)
finish(ERROR, "Program zawodnika nie moze korzystac z stdin!!!");
scanf("%d%d%d%d", &N, &K, &A, &PAR);
if(N < 1 || N > MAX_N || N < K || K > MAX_K || A < MIN_A || A > MAX_A
|| PAR < MIN_PAR || PAR > MAX_PAR)
finish(ERROR, "Program zawodnika nie moze korzystac z stdin!!!");
scanf("%d", &magic_end);
if(magic_end != MAGIC_END)
finish(ERROR, "Program zawodnika nie moze korzystac z stdin!!!");
con_k = 0;
lib_n = 0;
is_end = 0;
if(TYP == 2 || TYP == 3) {
len_sub = PAR;
bre = 0;
}
if(TYP == 2)
bou = A--;
return K;
}
/* Sluzy do wczytania ciagu reprezentujacego jakosci projektow */
int wczytaj()
{
if(unlikely(init == 0))
finish(ERROR, "Program zawodnika nie wywolal funkcji inicjuj!!!");
if(unlikely(lib_n > N || is_end == 1))
finish(ERROR, "Program zawodnika wywolal funkcje wczytaj po otrzymaniu informacji o koncu ciagu!!!");
if(unlikely(lib_n == N))
return 0;
lib_n++;
switch (TYP) {
case 0:
scanf("%d", &A);
if(A == 0)
is_end = 1;
return A;
break;
case 1: return random_test(); break;
case 2: return increasing_test(); break;
case 3: return decreasing_test(); break;
default:
finish(ERROR, "Nieznany typ testu");
}
return -1;
}
/* Sluzy do wypisania wyznaczonego podciagu */
void wypisz(int jakoscProjektu)
{
if(init == 0)
finish(ERROR, "Program zawodnika nie wywolal funkcji inicjuj!!!");
printf("%d\n", jakoscProjektu);
if(++con_k == K)
finish(CORRECT, "");
}
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=2e7+7;
int n,k,h1=1,h2=0,t=1;
int a[MAXN],q[MAXN];
int main(){
k=inicjuj();
while(1) {
a[++n]=wczytaj();
if(a[n]==0)break;
}
n--;
// cout<<n<<" "<<k<<" "<<h1<<" "<<h2<<" "<<t<<" "<<q[1]<<"\n";
for(int i=1;i<=k;i++){
while(t<=n-k+i){
while(h2>=h1&&q[h2]<a[t]){
h2--;
}
q[++h2]=a[t];
t++;
}
// cout<<q[h1]<<"\n";
int jakoscProjektu=q[h1];
wypisz(jakoscProjektu);
// wypisz('\n');
h1++;
}
}
[POI2009]ARC-Architects的更多相关文章
- bzoj1136: [POI2009]Arc
Description 给定一个序列{ai | 1 <= ai <= 1000000000 且 1 <= i <= n 且 n <= 15000000}和一个整数 k ( ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Convert BSpline Curve to Arc Spline in OpenCASCADE
Convert BSpline Curve to Arc Spline in OpenCASCADE eryar@163.com Abstract. The paper based on OpenCA ...
- 黑马程序员——ARC机制总结和用ARC建立模型
ARC 全称:Automatic Reference Counting 使用ARC 只需要在建立一个新的项目的时候把 下面的√打上 Xcode5以后都会默认建议开发者使用ARC机制 新的项目中如果有部 ...
- JSONKit在项目中使用设置(ARC与方法更新)
在项目中经常会遇到解析json的情况,如果有同学想要解析JSON,那么JSONKit可以是一个不错的选择. git中JSONKit 的地址为:https://github.com/johnezang/ ...
- MRC迁移ARC之__block
今日帮着同事把老项目从MRC迁移至ARC,大部分工作无非是删除release,[super dealloc]等方法,只要关闭了MRC编译选项后,编译器能自动帮你检查,block就有一些不一样了,发现许 ...
- Arc GIS engine10.2与VS2012的安装及匹配步骤
本文章已收录于: .embody { padding: 10px 10px 10px; margin: 0 -20px; border-bottom: solid 1px #ededed } ...
- 关于ARC下需要dealloc的相关内容
今天在项目中使用KVO添加观察者模式的时候,在返回上一级的时候竟然崩了.可是,看了很久,代码没有问题.最后,终于知道了需要添加dealloc 防止以后再出错,所以,便纪录下来.关于ARC下需要手动释放 ...
- iOS 中 ARC 项目 兼容 MRC
iOS 项目中MRC 和 ARC 项目的代码兼容问题: 1.ARC 项目中导入 MRC 第三方类的时候要在此类上添加 -objc-arc. 2.MRC 项目中导入 ARC 类的时候要在次类上添加 -f ...
随机推荐
- Selenium 如何复用浏览器【解决扫码登录等问题】
Selenium中复用已经打开的浏览器进行自动化测试,可以辅助我们解决某些登录需要扫二维码之后,才能进行的操作 目前只支持谷歌Chrome浏览器,那需要做哪些准备操作呢?往下看 1.windows和M ...
- 记录Unity的优化tip(不断更新)
大概记录遇到的可以优化的点.1.Mesh.UploadMeshData:预先把网格送到GPU unity是这样的,它对一个网格,先把它搞到内存,然后在第一次渲染它时把它送到GPU.但送GPU经常是个瓶 ...
- 2019 HNCPC D Modulo Nine 数位DP
题意 给定长度n和m个限制(l,r),每一个限制的意义是\(a_l \times a_{l+1} \times ... a_r = 0 \quad mod\ 9\). 问有多少个满足所有条件且长度为n ...
- 【小白学PyTorch】8 实战之MNIST小试牛刀
文章来自微信公众号[机器学习炼丹术].有什么问题都可以咨询作者WX:cyx645016617.想交个朋友占一个好友位也是可以的~好友位快满了不过. 参考目录: 目录 1 探索性数据分析 1.1 数据集 ...
- Mybatis源码学习第七天(插件开发原理)
插件概述: 插件是用来改变或者扩展mybatis的原有功能,mybatis的插件就是通过继承Interceptor拦截器实现的,在没有完全理解插件之前j禁止使用插件对mybatis进行扩展,有可能会导 ...
- 用于测试XmlAnalyzer 1.00版的八个测试用例
XmlAnalyzer 工程目的:将XML的属性和子节点按字母序排列,然后整形输出: 08. 原文=<project xmlns="http://maven.apache.org/PO ...
- Linux:使用SecureCRT来上传和下载文件
SecureCRT自带的有几种上传下载功能,SecureCRT下的文件传输协议有以下几种:ASCII.Xmodem.Ymodem.Zmodem. ASCII:这是最快的传输协议,但只能传送文本文件. ...
- 用命令方式启动、停止appium服务和app
启动appium服务并监听一个端口命令: 命令command==> appium -a {ip} -p {port} -U {deviceName} -g {log} 以shell命令方式执行命 ...
- Java 8 Stream API实例
一.开篇 Stream?其实就是处理集合的一种形式,称之为流,在Java8中被引入,可被Collection中的子类调用. 作用?简化代码,提升你的开发效率. 不会?看完这篇你就能自己上手了! 二.实 ...
- java中双亲委派机制(+总结)
类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段"加载"过程中,需要通过一个类的全限定名来获 ...