https://codeforces.com/gym/102082

题意

两个人玩n轮游戏,每次两个人各取一个数,并且已知对手的取数顺序,如果你取的数比他大就算赢一轮,求能赢最多轮次的取法,如果有多种取法输出字典序最大的取法

题解

如果不规定字典序最大随意输出一种那我们可以排下序搞一搞就行了,但现在要保证字典序最大,怎么办呢?有经验的选手就知道,像保证什么最小的情况下求最大以及什么最大的情况求最小这种套路很有可能是二分。对本题来说,我们现在就是要保证当前取法满足条件的情况下字典序最大,我们贪心取当前数最大看后面是否满足,而且数越大后面越不容易满足,换句话说这种取数其实是单调的,所以我们可以二分来做。首先我们要先求出最大可以赢的轮次ans,然后从前往后扫一遍,看当前最多可以拿到多大的bi满足赢的轮次为ans。时间复杂度n^2。

 1 #define IO std::ios::sync_with_stdio(0);
 2 #include <bits/stdc++.h>
 3 #define iter ::iterator
 4 using namespace  std;
 5 typedef long long ll;
 6 typedef pair<ll,ll>P;
 7 #define pb push_back
 8 #define se second
 9 #define fi first
10 #define rs o*2+1
11 #define ls o*2
12 const int N=5e3+5;
13 vector<int>a,b,tmp;
14 int ans,n;
15 int check(int start,int v,vector<int>s){
16     int res=(v>a[start]);
17     int flag=0;
18     int p=s.size()-1;
19     for(int i=start+1;i<n;i++){
20         if(s[p]==v&&!flag){
21             flag=1;
22             p--;
23         }
24         if(s[p]>a[i]){
25             p--;
26             res++;
27         }
28     }
29     return res==ans;
30 }
31 int main(){
32     scanf("%d",&n);
33     a.resize(n);
34     b.resize(n);
35     tmp.resize(n);
36     for(int i=0;i<n;i++){
37         scanf("%d",&a[i]);
38         tmp[i]=a[i];
39     }
40     for(int i=0;i<n;i++){
41         scanf("%d",&b[i]);
42     }
43     sort(b.begin(),b.end());
44     sort(a.begin(),a.end(),greater<int>());
45     multiset<int>s;
46     for(int i=0;i<n;i++){
47         s.insert(b[i]);
48     }
49     multiset<int>iter it;
50     for(int i=0;i<n;i++){
51         it=--s.end();
52         if(*it>a[i])ans++;
53         else it=s.begin();
54         s.erase(it);
55     }
56     for(int i=0;i<n;i++){
57         copy(tmp.begin(),tmp.end(),a.begin());
58         sort(a.begin()+i+1,a.end(),greater<int>());
59         int l=upper_bound(b.begin(),b.end(),a[i])-b.begin()-1;
60         int r=b.size()-1;
61         while(l<r){
62             int m=l+(r-l+1)/2;
63             if(check(i,b[m],b))l=m;
64             else r=m-1;
65         }
66         if(check(i,b[r],b)){
67             if(b[r]>a[i])ans--;
68             printf("%d ",b[r]);
69             b.erase(b.begin()+r);
70         }
71         else{
72             int l=0,r=upper_bound(b.begin(),b.end(),a[i])-b.begin()-1;
73             while(l<r){
74                 int m=l+(r-l+1)/2;
75                 if(check(i,b[m],b))l=m;
76                 else r=m-1;
77             }
78             printf("%d ",b[r]);
79             b.erase(b.begin()+r);
80         }
81     }
82     printf("\n");
83 }

转载于:https://www.cnblogs.com/ccsu-kid/p/10604817.html

Asia Yokohama Regional Contest 2018 K题 - Sixth Sense(思维加贪心加二分)相关推荐

  1. Asia Yokohama Regional Contest 2018 G题 What Goes Up Must Come Down(树状数组求逆序对)

    https://codeforces.com/gym/102082 题意: 给一个数组大小不超过1e5,每个数的值也是1e5以内,可以交换相邻两个数,求保证它呈现一个非递减再非递增的趋势的最小交换次数 ...

  2. The 2018 ACM-ICPC Asia Qingdao Regional Contest

    The 2018 ACM-ICPC Asia Qingdao Regional Contest 青岛总体来说只会3题 C #include<bits/stdc++.h> using nam ...

  3. 2018 ICPC Asia Jakarta Regional Contest

    2018 ICPC Asia Jakarta Regional Contest 题号 题目 知识点 难度 A Edit Distance B Rotating Gear C Smart Thief D ...

  4. 2018 ACM-ICPC Asia Beijing Regional Contest题解

    以下所有AC题解程序来自"仙客传奇"团队. A. Jin Yong's Wukong Ranking List AC的C++语言程序: #include <iostream& ...

  5. 2018-2019 ACM-ICPC, Asia Nanjing Regional Contest题解

    以下所有AC题解程序来自"仙客传奇"团队. AC题数:6/13 ADGIJK A. Adrien and Austin AC的C++语言程序: #include <iostr ...

  6. The 2014 ACM-ICPC Asia Mudanjiang Regional Contest(2014牡丹江区域赛)

    The 2014 ACM-ICPC Asia Mudanjiang Regional Contest 题目链接 没去现场.做的网络同步赛.感觉还能够,搞了6题 A:这是签到题,对于A堆除掉.假设没剩余 ...

  7. The 2019 ICPC Asia Shanghai Regional Contest

    The 2019 ICPC Asia Shanghai Regional Contest 题号 题目 知识点 A Mr. Panda and Dominoes B Prefix Code C Maze ...

  8. 2018-2019 ACM-ICPC, Asia Jiaozuo Regional Contest题解

    以下所有AC题解程序来自"仙客传奇"团队. A. Xu Xiake in Henan Province AC的C++语言程序: #include<iostream> # ...

  9. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest

    2017-2018 ACM-ICPC, Asia Daejeon Regional Contest 题号 题目 难度 知识点 A Broadcast Stations B Connect3 C Gam ...

最新文章

  1. uniapp 鸿蒙,关于前端:uniapp项目安装运行操作手册
  2. 分析 AIX 和 Linux 性能工具nmon
  3. 学习计算机视觉你需要知道这关键的八点
  4. mongodb数据库磁盘碎片整理。
  5. 十九、I2C驱动及应用
  6. C#中的Using的用法
  7. python傅里叶函数图像_python实现傅里叶级数展开的实现
  8. 中国计算机学会第七届全国Web信息系统及其应用学术会议(WISA2010)征文通知
  9. fc oracle,fc9下oracle sqldeveloper安装日志
  10. 激战2:逐火之路-概念艺术设计
  11. 【Gym-100085 B】Binary Encoding【思维题】
  12. 520用Java制作一个表白app
  13. 苹果12隔空投送显示无法连接服务器,iOS设备隔空投送功能无法使用该如何解决...
  14. kubernets nodeport 无法访问
  15. linux添加菜单栏,Gnome desktop主菜单中添加自己的菜单栏
  16. Pytorch安装找不到指定的模块\torch\lib\asmjit.dll
  17. puppet server升级,puppet 常见错误解决
  18. 微信扫描二维码无法下载文件的解决办法
  19. C语言--数据溢出导致的缓冲区(堆栈)损坏
  20. SoapUI的一些基本设置

热门文章

  1. 工程师软技能6:理财人生精神
  2. 多维度对比5款主流分布式MQ消息队列
  3. Java 并发编程ReentrantLock--源码解析(底层AQS实现)
  4. Spring源码分析-如何获取Bean对象
  5. Docker的镜像基本原理和概念
  6. 一文看懂PHP如何实现依赖注入
  7. IO多路复用中select、poll、epoll之间的区别
  8. 多线程顺序打印的5种解法
  9. [BZOJ2818][P2568]Gcd[欧拉函数]
  10. 安装centos7系统