【8.30校内测试】【找规律模拟】【DP】【二分+贪心】

对于和规律或者数学有关的题真的束手无策啊QAQ
首先发现两个性质:
1、不管中间怎么碰撞,所有蚂蚁的相对位置不会改变,即后面的蚂蚁不会超过前面的蚂蚁或者落后更后面的蚂蚁。
2、因为所有蚂蚁速度一样,不管标号的话两只蚂蚁的碰撞相当于直接互相穿过,所以最初有多少蚂蚁方向向左,最后就有多少蚂蚁从左落下,向右同理。
总结一下又可以发现,比如有$cntl$只蚂蚁最初向左,$cntr$只蚂蚁最初向右,那么最后就是原位置的左边连续$cntl$只从左落下,原位置右边连续$cntr$只从右落下。我们将所有方向向左和向右的蚂蚁落下的时间分别排序,和原序列上一一对应即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#define LL long long
using namespace std; int n, b[], cntl, cntr;
LL a[], L;
double ans[], l[], r[]; int main ( ) {
freopen ( "ant.in", "r", stdin );
freopen ( "ant.out", "w", stdout );
scanf ( "%I64d%d", &L, &n );
for ( int i = ; i <= n; i ++ ) scanf ( "%I64d", &a[i] );
for ( int i = ; i <= n; i ++ ) scanf ( "%d", &b[i] );
for ( int i = ; i <= n; i ++ )
if ( !b[i] )
l[++cntl] = a[i];
else r[++cntr] = L - a[i];
sort ( l + , l + + cntl );
sort ( r + , r + + cntr );
for ( int i = ; i <= cntl; i ++ )
ans[i] = l[i];
for ( int i = ; i <= cntr; i ++ )
ans[n - i + ] = r[i];
for ( int i = ; i <= n; i ++ )
printf ( "%.2lf ", ans[i] );
return ;
}
见8.20校内测试,题目转换一下就一模一样了。

数据比较水,写的$O(nlog_nlog_h)$完全够了。
二分最小值,$check$的时候贪心修改区间,我用的线段树,判断一下就好了。实际上差分复杂度更优。写线段树的时候无聊写了区间求和??
#include<iostream>
#include<cstdio>
#include<algorithm>
#define LL long long
using namespace std; int n, K;
LL T, a[]; LL TR[], tag[], vc[]; void update ( int nd ) {
TR[nd] = TR[nd << ] + TR[nd << | ];
} void push_down ( int nd, int l, int r ) {
if ( tag[nd] ) {
int mid = ( l + r ) >> ;
TR[nd << ] += tag[nd] * ( mid - l + );
TR[nd << | ] += tag[nd] * ( r - mid );
tag[nd << ] += tag[nd];
tag[nd << | ] += tag[nd];
tag[nd] = ;
}
} void build ( int nd, int l, int r ) {
TR[nd] = ; tag[nd] = ;
if ( l == r ) {
TR[nd] = a[vc[l]];
return ;
}
int mid = ( l + r ) >> ;
build ( nd << , l, mid );
build ( nd << | , mid + , r );
update ( nd );
} void add ( int nd, int l, int r, int L, int R, LL d ) {
if ( l >= L && r <= R ) {
TR[nd] += ( r - l + ) * d;
tag[nd] += d;
return ;
}
push_down ( nd, l, r );
int mid = ( l + r ) >> ;
if ( L <= mid ) add ( nd << , l, mid, L, R, d );
if ( R > mid ) add ( nd << | , mid + , r, L, R, d );
update ( nd );
} LL query ( int nd, int l, int r, int pos ) {
if ( l == r ) return TR[nd];
push_down ( nd, l, r );
int mid = ( l + r ) >> ;
if ( pos <= mid ) return query ( nd << , l, mid, pos );
else return query ( nd << | , mid + , r, pos );
} bool check ( LL mid ) {
int tot = ; LL sum = ;
for ( int i = ; i <= n; i ++ )
if ( a[i] < mid ) vc[++tot] = i;
build ( , , tot );
vc[++tot] = 0x7f7f7f7f7f7f7f;
for ( int i = ; i < tot; i ++ ) {
LL now = query ( , , tot - , i );
if ( now >= mid ) continue;
if ( mid - now + sum > T ) { sum = T + ; break; }
int to = vc[i] + K - ;
int pos = upper_bound ( vc + , vc + + tot, to ) - vc - ;
add ( , , tot - , i, pos, mid - now );
sum += mid - now;
}
if ( sum <= T ) return ;
return ;
} LL MI = 0x3f3f3f3f, MA;
LL erfen ( ) {
LL l = MI, r = MA + T, ans;
while ( l <= r ) {
int mid = ( l + r ) >> ;
if ( check ( mid ) ) l = mid + , ans = mid;
else r = mid - ;
}
return ans;
} int main ( ) {
freopen ( "watering.in", "r", stdin );
freopen ( "watering.out", "w", stdout );
scanf ( "%d%d%I64d", &n, &K, &T );
for ( int i = ; i <= n; i ++ ) scanf ( "%I64d", &a[i] ), MI = min ( MI, a[i] ), MA = max ( MA, a[i] );
LL ans = erfen ( );
printf ( "%I64d", ans );
return ;
}
【8.30校内测试】【找规律模拟】【DP】【二分+贪心】的更多相关文章
- 找规律/数位DP HDOJ 4722 Good Numbers
题目传送门 /* 找规律/数位DP:我做的时候差一点做出来了,只是不知道最后的 is_one () http://www.cnblogs.com/crazyapple/p/3315436.html 数 ...
- Codeforces D. Little Elephant and Interval(思维找规律数位dp)
题目描述: Little Elephant and Interval time limit per test 2 seconds memory limit per test 256 megabytes ...
- 洛谷 P1014 Cantor表【蛇皮矩阵/找规律/模拟】
题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … ...
- 2017年icpc西安网络赛 Maximum Flow (找规律+数位dp)
题目 https://nanti.jisuanke.com/t/17118 题意 有n个点0,1,2...n-1,对于一个点对(i,j)满足i<j,那么连一条边,边权为i xor j,求0到n- ...
- Codeforces Round #260 (Div. 2) A , B , C 标记,找规律 , dp
A. Laptops time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- hdu 1998 奇数阶魔方(找规律+模拟)
应该不算太水吧. 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 ...
- 【8.17校内测试】【模拟】【set】【网络流】
为什么每次想的最久的题得的分数最低!!!qwqwq 再也不在noip上尝试A*叻!! 模拟题,先把能消的消掉,双指针从两端向中间扫描,如果头尾合并可以消,就把它消掉,最后判断一下.因为消完过后num保 ...
- PAT 甲级 1049 Counting Ones (30 分)(找规律,较难,想到了一点但没有深入考虑嫌麻烦)***
1049 Counting Ones (30 分) The task is simple: given any positive integer N, you are supposed to co ...
- Codeforce-CodeCraft-20 (Div. 2)-B. String Modification (找规律+模拟)
Vasya has a string s of length n. He decides to make the following modification to the string: Pick ...
随机推荐
- H5调试工具 - weinre远程调试工具
weinre 简介 weinre 是一款类似于firebug 和Web Inspector的网页调试工具, 它的不同之处在于可以用于进行远程调试,比如调试手机上面的网页. 安装 weinre(运行在n ...
- uboot1.1.6 start.s分析
.Stage1 start.S代码结构 u-boot的stage1代码通常放在start.S文件中,他用汇编语言写成,其主要代码部分如下:(1)定义入口.由于一个可执行的Image必须有一个入口点,并 ...
- oracle数据库只查询前n条
select * from (select * from tablename order by createdate desc) aaa -- 按创建时间倒排序 where rownum &l ...
- 安装 Google BBR 加速VPS网络
Google BBR就是谷歌公司提出的一个开源TCP拥塞控制的算法.详情可以看这儿:https://lwn.net/Articles/701165.https://blog.sometimesnaiv ...
- Entity Framework 5.0 Code First全面学习 (转)
原文地址:感谢原文作者 http://blog.csdn.net/gentle_wolf/article/details/14004345 不贴图片了,太累. Code First 约定 借助 Cod ...
- 关于DataTable.Select不到数据的一种解决方案
网上有很多说的,试过,都没用.自己研究了一下,解决方案如下: 建立dataview,用dv.rowfilter,就可以取到了,然后TOTABLE即可. 代码如下:(只看中间那几句即可) private ...
- 如何删除git远程分支(转)
1,在开发过程中,大家在远程创建了许多分支,有些是无用的,该如何删除呢,可以参考下面的方法. 如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master 分支(或任何其他存放 稳 ...
- java中常见异常汇总(根据自己遇到的异常不定时更新)
1.java.lang.ArrayIndexOutOfBoundsException:N(数组索引越界异常.如果访问数组元素时指定的索引值小于0,或者大于等于数组的长度,编译程序不会出现任何错误,但运 ...
- acm专题---最小生成树
kruscal(eloge): 题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Problem Description There are N ...
- 保存进程的pid 文件目录/var/run/
http://blog.ddup.us/?p=110 http://blog.csdn.net/fyinsonw/article/details/4113124 首先声明这不是愚人节消息,事实上这个消 ...