10-04 NOIP模拟赛
10-04 NOIP模拟赛
喜提80+30+10=120分
T1 水管(flow)
题目描述
某国有 \(n\) 个城市,水利调配非常有问题,这导致部分地区出现严重的缺水,而部分地区却全年洪灾泛滥。政府请你来做些调整和规划。
你打算将原有的但是已经废弃了的 \(m\) 条水管重新使用。第 \(i\) 条水管连接城市 \(x_i\) 和 \(y_i\) 。
这些水管联通了所有城市。每座城市对水的需求不同设为 \(a_i\),部分城市处于缺水状态,\(a_i\) 为正,部分城市处于洪涝状态,\(a_i\) 为负。
你需要做到每个城市都刚好满足它的需求,即缺 \(a_i\) mol 水的城市需要刚好输入 \(a_i\) 的水,而多出 \(a_i\) mol 水的城市需要刚好输出 \(a_i\) mol 水。
你需要判断能否满足要求,若满足,你还需要输出所有的 \(f\)
输出格式
如果不能满足要求,输出Impossible
。
如果满足要求,第一行输出Possible
,接下来 \(m\) 行,第 \(i+1\) 行输出 \(f_i\)。
若有多组解,随意输出一组即可。 如果 \(f_i\)为0也要输出。
这道题乍一看跟网络流好像有亿点点关系,但是实则毛线关系没有。
首先一眼看出什么时候是 Impossible
,即 \(a_i\) 的和为 0 时才可能每个城市刚好满足他的需求,你有15了
对于满足的情况有两种方法:归一法和推流法(自己取得名字)
法一:推流法
从树根开始 dfs,你可以理解为我手中推着节点里多余的谁向前走(当然可能是负的),我走过的节点都满足需求,因为和为0,所以我走完后手上剩下的水也为0。但是这种方法略显麻烦,因为我回溯的时候也要推着水走,太不方便了。
法二:归一法
如其名,这种方法即我先遍历到叶子结点,然后回溯的时候把水全部输到根节点综合一下就行了,简单好用。
开始80分是判Impossible的时候挂了。
AC 代码:
#include<bits/stdc++.h>
using namespace std;
#define N 1200000
typedef long long LL;
int nex[N],fir[N],to[N],vis[N],ret[N],w[N],tot=0;
int n,m,dian[N>>2];
bool ward[N];
void add(int x,int y,int flag,int rt){
nex[++tot]=fir[x];
fir[x]=tot;
to[tot]=y;
ward[tot]=flag;
ret[tot]=rt;
}
LL dfs(int u,int fa){//采用归一法
vis[u]=1;
int cnt=-dian[u];
for(int e=fir[u];e;e=nex[e]){
int v=to[e];
if(v==fa||vis[v]) continue;
int liu=dfs(v,u);
cnt+=liu;
if(ward[e]==1){
w[ret[e]]=-liu;
}
else w[ret[e]]=liu;
}
return cnt;
}
int main(){
freopen("flow.in","r",stdin);
freopen("flow.out","w",stdout);
scanf("%d",&n);
LL sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&dian[i]);
sum+=dian[i];
}
if(sum){printf("Impossible\n");return 0;}
scanf("%d",&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y,1,i);
add(y,x,0,i);
}
printf("Possible\n");
int hai=dfs(1,0);
for(int i=1;i<=m;i++){
printf("%d\n",w[i]);
}
return 0;
}
备注:题解也用的这种方法。
T2 宝藏(treasure)
potato 游山涉水, 想要找到埋藏在深林中的宝藏。
他偶然得到了这个深林的藏宝图, 深林可以被看作一个 \(n * m\) 的矩阵。宝藏在地图中以 " $ $ $ "被标记出来,与此同时其他地方都是". "。
深林中有两条大河, 一条是纵向的, 一条是横向的。由于陆地上的宝藏都已经被人们 开采完了,potato 只好转而寻求埋藏在两条大河深处的宝藏。可他并不知道大河具体在哪,也不知道大河的宽度有多少,地图上也没有标明。他唯一确定的,是两条大河横跨整个深林。
他通过小道消息得出两条大河中的宝藏的个数之和为 \(\mathrm{k}\) 。请你帮 potato 统计 大河位置情况 的方案数。
如图是两条大河的合法位置, 注意大河方向一个为横,一个为纵,且长度都是无穷大的,宽度至少为 1。蓝色和黄色分别表示了两条大河,注意它们相交的绿色区域被计算了两次贡献。
对于 \(100 \%\) 的数据 \(\mathrm{n}, \mathrm{t}, \mathrm{k}<=100000, \mathrm{~m}<=100\) 提示: 请注意程序的常数和空间
首先拿到这道题的时候思路是很明显的:
因为重叠部分不冲突,所以我们把行和列分开来算,考虑到m只有100,所以果断预处理每行每列的宝藏数,然后求前缀和。存在map里,然后暴力从1枚举到k,求行和列的答案数和,赛时就是这样写的,于是收货了30分。
我们只允许在时间复杂度中出现n,而不是 \(n^2\)。所以思考从m入手,列产生的方案最多有 \(m^2\) 种,对于每一种合法的 \(k'\),我们考虑使用尺取法在n中通过滑动区间的方式找出所有的 \(k-k'\)。
尺取法
顺便对尺取法又有了更深的理解,以往对尺取法的理解仅限于双指针模拟一个滑动区间,但是这对于目标为0的区间会出现bug,特别是一串0,而且因为有0,也会导致含有0的部分值在一个区间内值相同。
对于这种问题,先做一个前缀和,我们可以每次采用一个类似三指针的方法,即一个一个枚举右端点,然后建立两个指针,一个枚举到大于目标答案,一个枚举到大于等于目标答案,差即使答案。
for(int i=1;i<=n;i++){
while(row[i]-row[lst-1]>K&&lst<=i)++lst;
while(row[i]-row[j-1]>=K&&j<=i)++j;
res+=j-lst;
}
然后你发现其实查找过程可以用二分代替,只是多个 \(log\),doge
AC 代码:
#include<bits/stdc++.h>
using namespace std;
#define N 200000
int ha[N],li[200];
int n,m,k;
long long ans=0;
map<int,int>mp1;
int main(){
freopen("treasure.in","r",stdin);
freopen("treasure.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++){
char ch[200];
scanf("%s",ch+1);
for(int j=1;j<=m;j++){
if(ch[j]=='$'){
ha[i]++;
li[j]++;
}
}
ha[i]+=ha[i-1];
}
for(int i=2;i<=m;i++){
li[i]+=li[i-1];
}
for(int len=1;len<=m;len++){
for(int i=len;i<=m;i++){
mp1[li[i]-li[i-len]]++;
}
}
for(auto v:mp1){
int kk=k-v.first;
long long sum=0;
for(int i=1;i<=n;i++){
sum+=upper_bound(ha,ha+i,ha[i]-kk)-lower_bound(ha,ha+i,ha[i]-kk);
}
ans+=sum*v.second;
}
printf("%lld",ans);
return 0;
}
顺便学习了map的遍历,大大的好!
10-04 NOIP模拟赛的更多相关文章
- 10.17 NOIP模拟赛
目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
- 2018.10.16 NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...
- 2016.10.30 NOIP模拟赛 day2 PM 整理
满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...
- 2016.10.30 NOIP模拟赛 day2 AM 整理
题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分 2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...
- 2018.10.04 NOIP模拟 K进制(模拟)
传送门 签到题,直接瞎模拟就行了. 代码
- 2017 10.25 NOIP模拟赛
期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...
- 2018.10.03 NOIP+ 模拟赛 解题报告
得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...
- 2018.10.30 NOIp模拟赛 T1 改造二叉树
[题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...
- 2016.10.29 NOIP模拟赛 PM 考试整理
300分的题,只得了第三题的100分. 题目+数据:链接:http://pan.baidu.com/s/1o7P4YXs 密码:4how T1:这道题目存在着诸多的问题: 1.开始的序列是无法消除的( ...
随机推荐
- Activity的创建
Activity的创建: 1.layout内写入相关代码 此处为显示的页面 2.Java内创建相关类写入代码 3.在清单内写入 快捷方法:直接完成上面步骤 layout: match_parent// ...
- 【Java】删除项目中多余的SVG图片资源
在DB库的菜单表,每个菜单会存放对应的svg图片名称,用于菜单渲染 在页面中的渲染: 在项目的目录的存放位置: 需求是这个目录还存放了很多不需要的svg图片,需要把他们删除掉 数量有七八十张,人肉手删 ...
- 【Tool】常用软件地址(装机备用)
浏览器: 360极速 https://browser.360.cn/ee/ 谷歌 https://www.google.cn/chrome/ 社交通讯 微信 https://weixin.qq.com ...
- 作为国产深度学习框架中分布式计算特性最强大的OneFlow的最大缺点是什么?
OneFlow是国产深度学习框架中分布式计算特性最强大的,因为其原生支持分布式特性,世界上的历史中的深度学习框架唯一可以做到这一点的也就只有Google的TensorFlow和Jax了,虽然有人说Go ...
- 和xshell和crt说再见,认识了一款55k star多端跨平台终端神器,强大酷炫
一.Tabby简介 Tabby(以前称为Terminus)是一款高度可配置的终端仿真器.SSH 和串行客户端.开源且跨平台,支持在Windows.macOS和Linux系统下使用. 源码下载 http ...
- P2P 下载入门
基本概念 直链下载: https://file-examples.com/wp-content/storage/2017/04/file_example_MP4_480_1_5MG.mp4 直链就是一 ...
- Standard Quorum Intersection
标准定足数交集 定义和背景 系统模型: 系统中有 \(n\) 个节点,其中最多 \(f\) 个节点可能是拜占庭故障节点(恶意节点). 为了保证容忍 \(f\) 个拜占庭节点,系统通常需要至少 \(3f ...
- SSM + Freemarker 开发框架快速搭建
1.项目骨架建立 一.使用开发工具IDEA,构建Maven项目,然后调整Maven项目结构,使其成为一个标准的web项目: 此处不选择Maven骨架,直接Next: 输入项目的相关信息,直接Finis ...
- 【工具分享】红队重点资产指纹识别 -- P1finger -0.02(最新版本)
工具介绍: P1finger 红队行动下的重点资产指纹识别工具.P1finger 是一个重点资产指纹识别的工具,旨在通过HTTP请求特征来识别目标系统.其主要特点包括: 语言和实现: 语言:使用Go语 ...
- ZXING 修复预览页面变形问题
ZXING之前都用的好好的,结果在一个Android11的设备上翻了车 (基于全屏预览的情况下) 扫码页面预览效果变形, 在网上找了一些代码,修改后发现无效,不适用我这边的设备, 最后想着,预览结果变 ...