【8.17校内测试】【模拟】【set】【网络流】
为什么每次想的最久的题得的分数最低!!!qwqwq
再也不在noip上尝试A*叻!!
模拟题,先把能消的消掉,双指针从两端向中间扫描,如果头尾合并可以消,就把它消掉,最后判断一下。因为消完过后num保留的是中间的个数,要把两端加上(实际就是一个循环节的长度
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std; ll n, m, k, a[];
ll color[], num[], cnt, tot; int main ( ) {
freopen ( "guass.in", "r", stdin );
freopen ( "guass.out", "w", stdout );
scanf ( "%I64d%I64d%I64d", &n, &m, &k );
for ( int i = ; i <= n; i ++ ) {
scanf ( "%I64d", &a[i] );
if ( !cnt || a[i] != color[cnt] ) {
cnt ++;
color[cnt] = a[i];
num[cnt] = ;
} else num[cnt] ++;
if ( num[cnt] == k ) num[cnt] = , cnt --;
}
for ( int i = ; i <= cnt; i ++ )
tot += num[i];
int h = , t = cnt;
while ( h < t && color[h] == color[t] ) {
if ( ( num[h] + num[t] ) % k == ) h ++, t --;
else {
num[h] = ( num[h] + num[t] ) % k;
num[t] = ;
break;
}
}
ll ans = ;
if ( h < t ) {
for ( int i = h; i <= t; i ++ ) ans += num[i];
ans *= ( m - );
ans += tot;
} else if ( h == t ) {
if ( m * num[h] % k == ) ans = ;
else {
ans = tot + num[h] * ( m - );
ans -= num[h] * m - num[h] * m % k;
}
}
printf ( "%I64d", ans );
return ;
}
/*
49 3 10 2
50 1 2 1
51 */
stl太强大了!!!这完全就是$set$模板题qwqwqwqwq。
发现行数很小,m=1时直接一遍扫,m=2时枚举第一行到第二行的断点,用前缀和直接计算,也是$O(n)$复杂度。
m=3时怎么做?在set中维护$pre[3][i]-pre[2][i]$,在枚举枚举1到2的断点时,在set中查找最优的2到3的断点,设此时只有1到2断点时答案为tmp,要使最终答案在$mod p$下最优,即尽量靠近$p-tmp-1$,在set中可以直接用lower_bound查找大于等于$p-tmp$的第一个位置,减一即为所求值的位置。还有一种情况,因为tmp和set中的值都mod了p,所以加起来不大于$2p$,直接查找最大值。两个值相比较更新答案。
#include<iostream>
#include<cstdio>
#include<set>
#define ll long long
using namespace std; set < ll > s;
int n, m;
ll pre[][], a[][], p, dp[][], S; int main ( ) {
freopen ( "candy.in", "r", stdin );
freopen ( "candy.out", "w", stdout );
scanf ( "%d%d%I64d", &n, &m, &p );
for ( int i = ; i <= m; i ++ )
for ( int j = ; j <= n; j ++ ) {
scanf ( "%I64d", &a[i][j] );
S += a[i][j];
pre[i][j] = ( pre[i][j-] + a[i][j] ) % p;
}
if ( m == ) {
printf ( "%I64d", pre[][n] );
} else if ( m == ) {
ll ans = ;
for ( int i = ; i <= n; i ++ )
ans = max ( ans, ( ( ( pre[][i] + pre[][n] ) % p - pre[][i-] ) % p + p ) % p );
printf ( "%I64d", ans );
} else if ( S < p ) {
for ( int i = ; i <= m; i ++ )
for ( int j = ; j <= n; j ++ )
dp[i][j] = max ( dp[i-][j]+a[i][j], dp[i][j-]+a[i][j] );
printf ( "%I64d", dp[m][n] );
} else {
ll ans = ;
for ( int i = n; i >= ; i -- ) {
ll tmp = ( ( ( pre[][i] + pre[][n] ) % p - pre[][i-] ) % p + p ) % p;
ll pp = ( ( ( ( pre[][n] - pre[][i-] ) % p + p - pre[][n] ) % p + p ) % p + pre[][i-] ) % p;
s.insert ( pp );
set < ll > :: iterator it, itt;
it = s.lower_bound ( p - tmp );
if ( it != s.begin ( ) ) it --;
itt = s.end ( );
if ( itt != s.begin ( ) ) itt --;
ans = max ( ans, max ( ( tmp + *it ) % p, ( tmp + *itt ) % p ) );
}
printf ( "%I64d", ans );
}
return ;
}
又是一道无脑最小割...所有点拆成出点和入点,之间正常建边,出点连向起点,流量为wi-,入点连向终点,流量为wi+,最小割即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define inf 0x3f3f3f3f
using namespace std; int n, m, ru[], chu[], s, t; int stot = , nex[], tov[], f[], h[], hh[];
void add ( int u, int v, int ff ) {
tov[++stot] = v;
f[stot] = ff;
nex[stot] = h[u];
h[u] = stot; tov[++stot] = u;
f[stot] = ;
nex[stot] = h[v];
h[v] = stot;
} queue < int > q;
int dis[], vis[]; bool bfs ( ) {
memset ( dis, , sizeof ( dis ) );
memset ( vis, , sizeof ( vis ) );
q.push ( s ); vis[s] = ;
while ( !q.empty ( ) ) {
int u = q.front ( ); q.pop ( );
for ( int i = h[u]; i; i = nex[i] ) {
int v = tov[i];
if ( !vis[v] && f[i] ) {
dis[v] = dis[u] + ;
vis[v] = ;
q.push ( v );
}
}
}
return vis[t];
} int dfs ( int u, int delta ) {
if ( u == t ) return delta;
int res = ;
for ( int i = hh[u]; i && delta; i = nex[i] ) {
int v = tov[i];
if ( dis[v] == dis[u] + && f[i] ) {
int dd = dfs ( v, min ( delta, f[i] ) );
res += dd;
f[i] -= dd;
f[i^] += dd;
delta -= dd;
hh[u] = i;
}
}
return res;
} int main ( ) {
freopen ( "game.in", "r", stdin );
freopen ( "game.out", "w", stdout );
scanf ( "%d%d", &n, &m );
s = , t = n * + ;
for ( int i = ; i <= n; i ++ ) {
int w;
scanf ( "%d", &w );
add ( i + n, t, w );
}
for ( int i = ; i <= n; i ++ ) {
int w;
scanf ( "%d", &w );
add ( s, i, w );
}
for ( int i = ; i <= m; i ++ ) {
int u, v;
scanf ( "%d%d", &u, &v );
add ( u, v + n, inf );
}
int ans = ;
while ( bfs ( ) ) {
for ( int i = s; i <= t; i ++ )
hh[i] = h[i];
ans += dfs ( s, inf );
}
printf ( "%d", ans );
return ;
}
【8.17校内测试】【模拟】【set】【网络流】的更多相关文章
- 2017.9.17校内noip模拟赛解题报告
预计分数:100+60+60=220 实际分数:100+60+40=200 除了暴力什么都不会的我..... T1 2017.9.17巧克力棒(chocolate) 巧克力棒(chocolate)Ti ...
- 【10.17校内测试】【二进制数位DP】【博弈论/预处理】【玄学(?)DP】
Solution 几乎是秒想到的水题叻! 异或很容易想到每一位单独做贡献,所以我们需要统计的是区间内每一位上做的贡献,就是统计区间内每一位是1的数的数量. 所以就写数位dp辣!(昨天才做了数字统计不要 ...
- 【8.30校内测试】【找规律模拟】【DP】【二分+贪心】
对于和规律或者数学有关的题真的束手无策啊QAQ 首先发现两个性质: 1.不管中间怎么碰撞,所有蚂蚁的相对位置不会改变,即后面的蚂蚁不会超过前面的蚂蚁或者落后更后面的蚂蚁. 2.因为所有蚂蚁速度一样,不 ...
- 基于iCamera测试模拟摄像头-TVP5150模块小结
基于iCamera测试模拟摄像头-TVP5150模块小结 首先先认识下模拟摄像头,相信大家都不陌生, CCD模拟摄像头 CMOS模拟摄像头 可以看到,ccd摄像头电路较复杂,接口少,而cmos摄像头, ...
- 【11.9校内测试】【倒计时1天】【ak欢乐赛】【多项式计算模拟】
然而AK失败了,就是因为这道摸你题:(最后一篇题解了吧?QAQ) Solution 模拟多项式乘法,其中的运算处理很像高精度,不过第$i$位代表的就是$x^i$前面的系数了. 好像去年的时候就讲了表达 ...
- 【11.8校内测试】【倒计时2天】【状压DP】【随机化?/暴力小模拟】
Solution 数据范围疯狂暗示状压,可是一开始发现状态特别难受. 将每一层的奇偶性状压,预处理所有状态的奇偶性.每一层的输入代表的其实可以是下一层某个点可以被从这一层哪些点转移到. 所以枚举每个状 ...
- 【11.1校内测试】【快速幂DP】【带权并查集】【模拟】
Solution $jzy$大佬用了给的原根的信息,加上矩阵快速幂150行QAQ 然而$yuli$大佬的做法不仅好懂,代码只有50行! 快速幂的思想,把m看成要组成的区间总长度,每次将两段组合得到新的 ...
- 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】
一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...
- 【9.2校内测试】【开学祭】【exgcd】【树规(背包】【模拟】
比较裸的$exgcd$的应用? $exgcd$可以算出在$x$和$y$分别是最小正整数时的解.注意在这里因为有$a(x+\frac{b}{d})+b(y-\frac{a}{d})=c$,$d=gcd( ...
随机推荐
- Batch Gradient Descent vs. Stochastic Gradient Descent
梯度下降法(Gradient Descent)是用于最小化代价函数的方法. When $a \ne 0$, there are two solutions to \(ax^2 + bx + c = 0 ...
- PyCharm 自定义文件和代码模板
PyCharm提供了文件和代码模板功能,可以利用此模板来快捷新建代码或文件.比如在PyCharm中新建一个html文件,新的文件并不是空的,而是会自动填充了一些基础的必备的内容,就像这样: <! ...
- selenium滚动到顶部与底部
#coding=utf-8 from selenium import webdriver #滚动到浏览器顶部 js_top = "var q=document.documentElement ...
- 清理oracle的用户中的日志垃圾以及修改sys用户的密码
清理oracle的用户中的日志垃圾1.进入:/opt/oracle/product/11g/network/admin目录2.注释掉listener.ora文件中的TRACE_LEVEL_LISTEN ...
- LFM隐语义模型Latent Factor Model
实际应用 LFM 模型在实际使用中有一个困难,就是很难实现实时推荐.经典的 LFM 模型每次训练都需要扫描所有的用户行为记录,并且需要在用户行为记录上反复迭代来优化参数,所以每次训练都很耗时,实际应用 ...
- (一) Mysql 简介及安装和配置
第一节:Mysql 简介 百度百科 第二节:Mysql 安装及配置 1,Mysql5.1 下载及安装 2,Mysql 数据库编码配置 utf-8 3,Mysql 图形界面 Sqlyog 下载及安装
- jmeter-----用户参数和用户定义变量的区别
在调试脚本的时候,可以使用前置处理器中的用户参数组件进行数据的提供,在该数据中可以使用固定值也可以使用变量值. 如果是固定不变的一些配置项,不需要多个值的时候,也可以使用用户已定义的变量组件. 一.界 ...
- rmdir命令
rmdir命令用来删除空目录.当目录不再被使用时,或者磁盘空间已到达使用限定值,就需要删除失去使用价值的目录.利用rmdir命令可以从一个目录中删除一个或多个空的子目录.该命令从一个目录中删除一个或多 ...
- python快速教程-vamei
2016年10月26日 12:00:53 今天开始着手python的学习,希望能高效快速的学完! Python基础(上)... 7 实验简介... 7 一.实验说明... 8 1. 环境登录... 8 ...
- js对小数的操作
1.丢弃小数部分,保留整数部分 js:parseInt(7/2) 2.向上取整,有小数就整数部分加1 js: Math.ceil(7/2) 3,四舍五入. js: Math.round(7/2) 4, ...