为什么每次想的最久的题得的分数最低!!!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】【网络流】的更多相关文章

  1. 2017.9.17校内noip模拟赛解题报告

    预计分数:100+60+60=220 实际分数:100+60+40=200 除了暴力什么都不会的我..... T1 2017.9.17巧克力棒(chocolate) 巧克力棒(chocolate)Ti ...

  2. 【10.17校内测试】【二进制数位DP】【博弈论/预处理】【玄学(?)DP】

    Solution 几乎是秒想到的水题叻! 异或很容易想到每一位单独做贡献,所以我们需要统计的是区间内每一位上做的贡献,就是统计区间内每一位是1的数的数量. 所以就写数位dp辣!(昨天才做了数字统计不要 ...

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

    对于和规律或者数学有关的题真的束手无策啊QAQ 首先发现两个性质: 1.不管中间怎么碰撞,所有蚂蚁的相对位置不会改变,即后面的蚂蚁不会超过前面的蚂蚁或者落后更后面的蚂蚁. 2.因为所有蚂蚁速度一样,不 ...

  4. 基于iCamera测试模拟摄像头-TVP5150模块小结

    基于iCamera测试模拟摄像头-TVP5150模块小结 首先先认识下模拟摄像头,相信大家都不陌生, CCD模拟摄像头 CMOS模拟摄像头 可以看到,ccd摄像头电路较复杂,接口少,而cmos摄像头, ...

  5. 【11.9校内测试】【倒计时1天】【ak欢乐赛】【多项式计算模拟】

    然而AK失败了,就是因为这道摸你题:(最后一篇题解了吧?QAQ) Solution 模拟多项式乘法,其中的运算处理很像高精度,不过第$i$位代表的就是$x^i$前面的系数了. 好像去年的时候就讲了表达 ...

  6. 【11.8校内测试】【倒计时2天】【状压DP】【随机化?/暴力小模拟】

    Solution 数据范围疯狂暗示状压,可是一开始发现状态特别难受. 将每一层的奇偶性状压,预处理所有状态的奇偶性.每一层的输入代表的其实可以是下一层某个点可以被从这一层哪些点转移到. 所以枚举每个状 ...

  7. 【11.1校内测试】【快速幂DP】【带权并查集】【模拟】

    Solution $jzy$大佬用了给的原根的信息,加上矩阵快速幂150行QAQ 然而$yuli$大佬的做法不仅好懂,代码只有50行! 快速幂的思想,把m看成要组成的区间总长度,每次将两段组合得到新的 ...

  8. 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】

    一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...

  9. 【9.2校内测试】【开学祭】【exgcd】【树规(背包】【模拟】

    比较裸的$exgcd$的应用? $exgcd$可以算出在$x$和$y$分别是最小正整数时的解.注意在这里因为有$a(x+\frac{b}{d})+b(y-\frac{a}{d})=c$,$d=gcd( ...

随机推荐

  1. HDU 1256 画8 (找规律)

    题目链接 Problem Description 谁画8画的好,画的快,今后就发的快,学业发达,事业发达,祝大家发,发,发.   Input 输入的第一行为一个整数N,表示后面有N组数据. 每组数据中 ...

  2. 学习Python函数笔记之二(内置函数)

    ---恢复内容开始--- 1.内置函数:取绝对值函数abs() 2.内置函数:取最大值max(),取最小值min() 3.内置函数:len()是获取序列的长度 4.内置函数:divmod(x,y),返 ...

  3. 4-Python数据类型之元组-字符串

    目录 1 元组概念 1.1 元祖的特点 1.2 元组的定义 1.3 元组的访问 1.4 元组的查询 2 命名元组 3 字符串 3.1 字符串的基本操作 3.1.1 字符串的访问 3.1.2 字符串的拼 ...

  4. Django之cfrs跨站请求伪造和xfs攻击

    跨站请求伪造 一.简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防 ...

  5. MySQL删除数据几种情况以及是否释放磁盘空间【转】

    MySQL删除数据几种情况以及是否释放磁盘空间: 1.drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ; 2.truncate table tabl ...

  6. ECNA 2017

    ECNA 2017 Abstract Art 题目描述:求\(n\)个多边形的面积并. solution 据说有模板. Craters 题目描述:给定\(n\)个圆,求凸包的周长. solution ...

  7. Jmeter命令行选项

    示例:jmeter.bat -n -j %tmp%\%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%%time:~ ...

  8. LightOJ - 1297 Largest Box LightOJ(一元三次方程求极大值)

    题目链接:https://vjudge.net/contest/28079#problem/K 题目大意:给你一个长为L,宽为W的纸片,四个角剪掉边长为x的正方形,如下图所示,然后折成一个无盖的纸盒, ...

  9. Linux 用户篇——用户管理的配置文件

    一.用户管理之配置文件的重要性 在Linux系统中,用户账户的相关信息是存放在相关配置文件中.而Linux安全系统的核心是用户账号,用户对系统中各种对象的访问权限取决于他们登录系统时用的账户,并且Li ...

  10. 如何去除decimal后面的零?

    如何去除decimal后面的零? 1.260000m.ToString("G29") 不显示科学记数法? decimal.Parse("0.0000001",S ...