【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( ...
随机推荐
- html 中的列表
html 中列表可以分为 1. 无序列表(ul--li 的形式) 2. 有序列表(ol li的形式) 3. 定义列表(dl 的形式) 下面来看几种列表的具体内容: 1.无序列表. 无序列表的格式 ...
- fileIO和OS操作文件和目录
1.FileIO操作文件 # 文件IO,读取文件和创建文件 # 1.读取键盘输入 x=input("please input number") print("您输入的是& ...
- python实战===python程序打包成exe
推荐PyInstaller项目www.pyinstaller.org 安装方法: 先跑pip install pywin32再跑pip install pyinstaller即可 可用一句命令打包 ...
- 理解HTTP幂等性(转)
原文链接:http://www.cnblogs.com/weidagang2046/archive/2011/06/04/2063696.html
- Maven核心概念
一.坐标 在平面几何中,坐标(x,y)可以标识平面中唯一的一个点.在maven中,坐标是为了定位一个唯一确定的jar包.Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范:拥有了 ...
- MySQL 操作总结
1. 数据库级别操作 1.1 创建数据库 CREATE DATABASE db1 default charset utf8 collate utf8_general_ci; 1.2 删除数据库 DRO ...
- 配置Tomcat、maven远程部署调试总结。
注意:可以搞两个环境,一个本地tomcat 一个服务器上的tomcat ,然后都采用如下配置.这样就可以 在本地调试,调试好后,再发布到服务器端.非常方便. ==================== ...
- 720P、1080P、4K是什么意思?
什么是像素? 中文全称为图像元素.像素仅仅只是分辨率的尺寸单位,而不是画质. 从定义上来看,像素是指基本原色素及其灰度的基本编码. 像素是构成数码影像的基本单元,通常以像素每英寸PPI(pixels ...
- 洛谷P1876开灯 题解
题目传送门 这道题目是道数学题(下面也写了),所以仔细研究发现:N轮之后,只有是小于N的完全平方数的灯能亮着.所以接下来就好办了: #include<bits/stdc++.h> usin ...
- int类中的方法
我们知道在python中,一切对象都是类,对象的方法都封装在类中,现在来探讨一下int类中的方法: 我们可以通过help(int)和dir(int)来查看int类中都封装了那些方法: 1.bi ...