FJWC2019 全连
题目描述
有n个音符,第i个音符会在第i个时刻来临
令第 i 个音符的准备时间为 ti 个单位时间,如果选择去点击第 i 个音符,那么就没法点击所有到来时刻在 (i−ti ,i+ti)中的音符。
每一个音符有一个权值,求一种点击方法使得权值和最高(N<=1e6)
Solution
首先先考虑最暴力的dp,令dp[i]表示我点到第i个时刻时,可以达到的最大权值
那么转移就很显然了
dp[i]=max(dp[j=1..i])+a[j](j+t[j]<=i&&i-t[i]>=j)
这个dp显然是O(n^2)的这时候我们发现每次循环1..i的过程十分的浪费时间所以我们来考虑优化这个过程
可以发现这是个二维偏序问题,一般的套路是一维排序另一维用数据结构去维护
因为i是递增的,这时候我们把所有的音符按照i+t[i]排序,并且用一个线段树维护区间内dp的最大值
为了满足j+t[j]<=i 我们在当前时刻>当前最小的i+t[i]的时候才把最小的i给modify进线段树里
每次查询的时候就只要查询1..i-t[i]的最大dp值然后只用最大dp值转移过来就可以了
这是一个O(N log N)的效率[因为评测姬跑的很快所以O(N log^2 N)跑过去了…]
Code
- //考场代码...结果脑子一抽考场上用了堆维护第一维关系... 所以这个代码效率是O(N log^2 N)
- #include <bits/stdc++.h>
- #define pa pair<long long,long long>
- using namespace std;
- inline long long read(){
- long long s=0,w=1;
- char ch=getchar();
- while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
- while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
- return s*w;
- }
- int N;
- long long Tree[4005005];
- void Change(int Now,int K,int l,int r,long long Ned)
- {
- int mid=(l+r)/2;
- if (l==r&&l==K)
- {
- Tree[Now]=Ned;
- return;
- }
- if (K<=mid)
- Change(Now*2,K,l,mid,Ned);
- if (mid<K)
- Change(Now*2+1,K,mid+1,r,Ned);
- Tree[Now]=max(Tree[Now*2],Tree[Now*2+1]);
- }
- long long query(int Now,int L,int R,int l,int r)
- {
- int mid=(l+r)/2;
- if (L<=l&&r<=R)
- return Tree[Now];
- long long qwqq=0;
- if (L<=mid)
- qwqq=max(query(Now*2,L,R,l,mid),qwqq);
- if (mid<R)
- qwqq=max(query(Now*2+1,L,R,mid+1,r),qwqq);
- return qwqq;
- }
- long long dp[1000005],a[1000005],t[1000005],Score[1000005];
- priority_queue<pa,vector<pa>,greater<pa> > qwqq;
- int main()
- {
- freopen("fc.in","r",stdin);
- freopen("fc.out","w",stdout);
- N=read();
- for (int i=1;i<=N;i++)
- t[i]=read();
- for (int i=1;i<=N;i++)
- a[i]=read();
- for (int i=1;i<=N;i++)
- Score[i]=a[i]*t[i];
- for (int i=1;i<=N;i++)
- {
- pa r;
- if (!qwqq.empty()) r=qwqq.top();
- while (!qwqq.empty()&&r.first<=i)
- {
- Change(1,r.second,1,N,dp[r.second]);
- qwqq.pop();
- r=qwqq.top();
- }
- long long R=0;
- if (i-t[i]>0)
- R=query(1,1,i-t[i],1,N);
- dp[i]=R+Score[i];
- pa Now;
- Now.first=i+t[i];
- Now.second=i;
- qwqq.push(Now);
- }
- long long ans=0;
- for (int i=1;i<=N;i++)
- ans=max(ans,dp[i]);
- printf("%lld",ans);
- return 0;
- }
FJWC2019 全连的更多相关文章
- fjwc2019 D1T1 全连(dp+树状数组)
#178. 「2019冬令营提高组」全连 显然我们可以得出一个$O(n^2)$的dp方程 记$f(i)$为取到第$i$个音符时的最大分数,枚举下一个音符的位置$j$进行转移. 蓝后我们就可以用树状数组 ...
- fjwc2019
机房搬迁.......再加上文化课.......咕了十几天才有空补上....... day0听一个教授讲理论......在学长的带领下咕掉了..... D1 T1:#178. 「2019冬令营提高组」 ...
- test20190320 全连(fc)
题意 全连(fc) [题目背景] 还记得若干年前那段互相比较<克罗地亚狂想曲>的分数的日子吗? [题目描述] E.Space 喜欢打音游. 但是他技术不好,总是拿不到全连(Full Com ...
- SQL 表连接,内联、外联、全连
内连接,join 或 inner join 两个表中符合条件的集合 外连接,left join 或 right join 以left左边或right右边的表为数据集合行,根据条件,另一侧没有的数 ...
- fjwc2019 D6T1 堆(组合数+打表)
#193. 「2019冬令营提高组」堆 但是每个点都遍历一遍,有些点的子树完全相同却重复算了 忽然记起完全二叉树的性质之一:每个非叶节点的子树中至少有一个是满二叉树 那么我们预处理满二叉树的那一块,剩 ...
- fjwc2019 D6T2 密文(trie+贪心)
#194. 「2019冬令营提高组」密文 设$s[i]$表示前$i$个密文的异或和 容易发现,只要知道$s[0]~s[n](s[0]=0)$就可以知道每一位的值. 转化一下,就变成了在完全图上求最小生 ...
- fjwc2019 D4T1 循环流
#187. 「2019冬令营提高组」循环流 假的网络流,其实是O(1)算法 手画n个图后,你会发现只要分成几种情况讨论讨论就得了. 当$a==1$时显然不存在. 当$a!=1$时 如果$n==2$,显 ...
- fjwc2019 D3T2 送分题
#185. 「2019冬令营提高组」送分题 这是原题..... P3615 如厕计划 手推一推你发现,显然男性不能多于女性. 然后你或许可以发现一个神奇的性质. 对于每个序列,我们记$M$为$1$,$ ...
- fjwc2019 D3T1 签到题 (贪心)
#184. 「2019冬令营提高组」签到题 每次询问接近O(1).......考虑贪心 怎么贪心呢? 对于相邻的两个数,我们要保证异或x后单调不降 我们找到两个数二进制上最高的相异位 当左边的数相异位 ...
随机推荐
- PBYTE
typedef BYTE near *PBYTE;
- android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法](转)
http://blog.csdn.net/xudongdong99/article/details/8857173 Android上面TreeView效果 http://blog.csdn.net/g ...
- GCT英语口语复试中的常见问题总汇
英语口语复试中常见的问题: 1. Where do you come from? 2. What kind of landscape surrounds your hometown? 3. What ...
- LVS初步
LVS初步 一见 目录 目录 1 1. 前言 2 2. 思考 2 3. 名词解释 2 4. OSI参考模型 3 5. LVS架构 4 5.1. 负载均衡器(Load Balancer) 4 5.2. ...
- 疯狂JAVA讲义---第十五章:输入输出(上)流的处理和文件
在Java中,把这些不同类型的输入.输出抽象为流(Stream),而其中输入或输出的数据称为数据流(Data Stream),用统一的接口来表示,从而使程序设计简单明了. 首先我要声明下:所谓的输入输 ...
- HRBUST1313 火影忍者之~静音 2017-03-06 16:11 39人阅读 评论(0) 收藏
火影忍者之-静音 传说中的火之国一年一度的公务员选拔又开始了!木叶忍者村此次也要从中选拔出5人来,作为即将上任的新火影纲手的小弟-,可是报考公务员的人数实在是太--多啦!所以纲手的贴身随从-静音小姐, ...
- lambda distinct
public ActionResult Index() { IList<RegisterModel> regList = new List<RegisterModel>() { ...
- Android-bindService本地服务-音乐播放-上
播放音乐的行为写在服务里,Activity去调用Service里面到方法,进行音乐播放,当Activity结束后,音乐播放器停止播放 界面: MainActivity: package liudeli ...
- 安装配置BITS上传服务
IIS 6.0和IIS 7.0 支持安装BITS上传组件. 下面以IIS7.0为例安装配置bits上传服务. 1.安装 首先确定服务器已经按装IIS服务.依次打开服务管理器->功能->添加 ...
- 更改SQL Server中默认备份文件夹
当你安装SQL Server时,安装路径一般如下:C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL.在这个目录下也有数据文件的文件夹和备份文件的文 ...