【未完成0.0】Noip2012提高组day2 解题报告
第一次写一套题的解题报告,感觉会比较长。(更新中Loading....):)
题目:
第一题:同余方程
描述
求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解。
格式
输入格式
输入只有一行,包含两个正整数a, b,用一个空格隔开。
输出格式
输出只有一行,包含一个正整数x0,即最小正整数解。输入数据保证一定有解。
样例1
样例输入1
3 10
样例输出1
7
限制
每个测试点1s
提示
对于40%的数据,2 ≤b≤ 1,000;
对于60%的数据,2 ≤b≤ 50,000,000;
对于100%的数据,2 ≤a, b≤ 2,000,000,000。
第二题:借教室
描述
在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。
面对海量租借教室的信息,我们自然希望编程解决这个问题。我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借。共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室。
我们假定,租借者对教室的大小、地点没有要求。即对于每份订单,我们只需要每天提供dj个教室,而它们具体是哪些教室,每天是否是相同的教室则不用考虑。
借教室的原则是先到先得,也就是说我们要按照订单的先后顺序依次为每份订单分配教室。如果在分配的过程中遇到一份订单无法完全满足,则需要停止教室的分配,通知当前申请人修改订单。这里的无法满足指从第sj天到第tj天中有至少一天剩余的教室数量不足dj个。
现在我们需要知道,是否会有订单无法完全满足。如果有,需要通知哪一个申请人修改订单。
格式
输入格式
第一行包含两个正整数n,m,表示天数和订单的数量。
第二行包含n个正整数,其中第i个数为ri,表示第i天可用于租借的教室数量。
接下来有m行,每行包含三个正整数dj,sj,tj,表示租借的数量,租借开始、结束分别在第几天。
每行相邻的两个数之间均用一个空格隔开。天数与订单均用从1开始的整数编号。
输出格式
如果所有订单均可满足,则输出只有一行,包含一个整数0。否则(订单无法完全满足)输出两行,第一行输出一个负整数-1,第二行输出需要修改订单的申请人编号。
样例1
样例输入1
4 3
2 5 4 3
2 1 3
3 2 4
4 2 4
样例输出1
-1
2
限制
每个测试点1s
提示
对于10%的数据,有1≤ n,m≤ 10;
对于30%的数据,有1≤ n,m≤1000;
对于70%的数据,有1≤ n,m≤ 10^5;
对于100%的数据,有1≤n,m≤10^6,0≤ri,dj≤10^9,1≤sj≤tj≤n。
第三题:疫情控制
描述
H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点。
H国的首都爆发了一种危害性极高的传染病。当局为了控制疫情,不让疫情扩散到边境城市(叶子节点所表示的城市),决定动用军队在一些城市建立检查点,使得从首都到边境城市的每一条路径上都至少有一个检查点,边境城市也可以建立检查点。但特别要注意的是,首都是不能建立检查点的。
现在,在H国的一些城市中已经驻扎有军队,且一个城市可以驻扎多个军队。一支军队可以在有道路连接的城市间移动,并在除首都以外的任意一个城市建立检查点,且只能在一个城市建立检查点。一支军队经过一条道路从一个城市移动到另一个城市所需要的时间等于道路的长度(单位:小时)。
请问最少需要多少个小时才能控制疫情。注意:不同的军队可以同时移动。
格式
输入格式
第一行一个整数n,表示城市个数。
接下来的n-1行,每行3个整数,u、v、w,每两个整数之间用一个空格隔开,表示从城市u到城市v有一条长为w的道路。数据保证输入的是一棵树,且根节点编号为1。
接下来一行一个整数m,表示军队个数。
接下来一行m个整数,每两个整数之间用一个空格隔开,分别表示这m个军队所驻扎的城市的编号。
输出格式
共一行,包含一个整数,表示控制疫情所需要的最少时间。如果无法控制疫情则输出-1。
样例1
样例输入1
4
1 2 1
1 3 2
3 4 3
2
2 2
样例输出1
3
限制
每个测试点2s
提示
保证军队不会驻扎在首都。
对于20%的数据,2≤ n≤ 10;
对于40%的数据,2 ≤n≤50,0<w <10^5;
对于60%的数据,2 ≤ n≤1000,0<w <10^6;
对于80%的数据,2 ≤ n≤10,000;
对于100%的数据,2≤m≤n≤50,000,0<w <10^9。
解题报告:
先扯一点题外话吧。现在是暑假集训(shang ke)的倒数第二天,明天就要回家了(呼...),16天的集训,也测试了9次,9次(0.0)好像明天还有一场测试。(表示好心累)突然想起hzwer博客的那句话“自己选的路,跪着也要走完”,现在正是需要这种精神。这个暑假,好好奋斗吧。
好的,废话就少说了。但其实今天的任务还没有做完,最后一题的长程序还没有编完,主要是今天有点浮躁,静不下心(毕竟明天就回家了),但是一定要编,学习一下上一届学长的刻苦。啊,又说了一大堆废话。-.-
好的,开始了。
首先第一题,同余方程。前两天才讲的数论,今天就考到了。一个扩展欧几里得,解方程的问题,用ax+by=gcd(a,b)解决。当时在想,负数会不会有特殊性?就先按最初讲的函数写了一遍,当b==0,x=1,y=0;再递归带回,却发现答案不对啊,然后陷入沉思。在草稿纸上模拟,又调试了好久,尝试着把b==0时,x=-1,y=1;递归带回,惊喜地发现样例过了。不放心,又自己出了一个数据,7 9,一试,错了。伤心。只好再调试,手动模拟过程,然后发现它的初值x=1,y=0才对。然后就懵了。突然灵光一闪,把最后的aa 分情况,样例中aa是小于0的,而这组数据aa是大于0的,所以用if判断一下。又自己出了几组数据,惊喜的发现全过了。评测也全过了。神奇的方法。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
long long a,b;
long long x,y;
void gcd(long long aa,long long bb,long long &x,long long &y)
{
if (bb==)
{
if (aa>)
{
x=;y=;return ;
}
else
{
x=-;y=;return ;//!!!x=-1,y=1!!!
}
}
else
{
gcd(bb,aa%bb,x,y);
long long t=x;
x=y;
y=t-aa/bb*y;
}
}
int main()
{
freopen("mod.in","r",stdin);
freopen("mod.out","w",stdout);
cin>>a>>b;
gcd(a,-b,x,y);
cout<<x;
return ;
}
其实正解不是我这样的,虽然我还没有仔细的研究这样做的理论证明,而且正解还对x mod b 我表示很惊讶,我没有这么做也是最小值?好好研究一下。
另附正解(感谢hzwer的代码)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define mod 1000000007
#define ll long long
#define inf (1LL<<60)
using namespace std;
ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
ll ans;
int a,b;
void exgcd(int a,int b,int &x,int &y)
{
if(b==){x=;y=;return;}
exgcd(b,a%b,x,y);
int t=x;x=y,y=t-a/b*y;
}
int main()
{
a=read();b=read();
int x,y;
exgcd(a,b,x,y);
x=(x%b+b)%b;
cout<<x<<endl;
return ;
}
第二题,借教室。第一遍浏览所有题的时候,一看这道题,立马想起前不久学的线段树,然后放心的去编第一题了。可是,现实是残酷的,我连线段树都编错了。还写了三篇博客来着。求心理阴影。更可笑的是,我在每个节点存的居然是和,不应该是最小值吗。Oh,no!好吧,被线段树伤透了心的我只好去网上学习了一个神奇的程序,虽然也用到了正解中的前缀和,但是判断过程和正解不一样,没有用二分,而是依次查找,感觉会很慢,但在cena上全过了,最慢也就0.7s,可是vijos可没给我面子,只得了35'。
代码如下:
#include<iostream>
#include<cstdio>
#define LL long long
using namespace std;
const int maxn=;
int n,m;
LL ri[maxn],p[maxn],sum[maxn];
int pos=,ma;
struct pp{
int d,s,t;
};
pp a[maxn];
int main()
{
freopen("classroom.in","r",stdin);
freopen("classroom.out","w",stdout);
cin>>n>>m;
for (int i=;i<=n;i++)
scanf("%d",&ri[i]);
for (int i=;i<=m;i++)
{
scanf("%d%d%d",&a[i].d,&a[i].s,&a[i].t);
if (a[i].t>ma) ma=a[i].t;
p[a[i].s]+=a[i].d;p[a[i].t]+=a[i].d;
if ((p[a[i].s]>ri[a[i].s]||p[a[i].t]>ri[a[i].t])&&pos>i)
pos=i;
sum[a[i].s]+=a[i].d;
sum[a[i].t+]-=a[i].d;
}
for (int i=;i<=n;i++)
sum[i]+=sum[i-];
for (int i=;i<=n;i++)
if (sum[i]>ri[i])
{
int tt=;
for (int j=;j<=m;j++)
{
if (j>pos) break;
if (a[j].s<=i&&a[j].t>=i)
tt+=a[j].d;
if (tt>ri[i])
{
pos=j;
break;
}
}
}
if (pos==)
printf("");
else
{
cout<<-<<endl;
cout<<pos;
}
return ;
}
二分+前缀和、线段树+二分+前缀和 都是对的,这里给出前者的代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<iostream>
#include<vector>
#include<cstdlib>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif
using namespace std;
const int maxn=+;
int n,m,r[maxn],d[maxn],s[maxn],t[maxn],a[maxn],sum[maxn];
bool flag=true;
bool judge(int k)
{
memset(a,,sizeof(a));
memset(sum,,sizeof(sum));
for (int i=;i<=k;i++)
{
a[s[i]]+=d[i];
a[t[i]+]-=d[i];
}
for (int i=;i<=n;i++)
{
sum[i]=sum[i-]+a[i];
if (sum[i]>r[i])
return false;
}
return true;
}
int main()
{
freopen("classroom.in","r",stdin);
freopen("classroom.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) scanf("%d",&r[i]);
for (int i=;i<=m;i++) scanf("%d%d%d",&d[i],&s[i],&t[i]);
int L=,R=m;
while (L+<R)
{
int mid=(L+R)>>;
if (judge(mid)) L=mid;
else R=mid;
}
bool judge_L=judge(L),judge_R=judge(R);
if (!judge_L) printf("-1\n%d",L);
else if (!judge_R) printf("-1\n%d",R);
else printf("");
return ;
}
第三题,疫情控制。做到这道题的时候,已经没有什么时间了,毕竟刚才的线段树,哎,就不说了。这道题是二分+贪心+倍增(好像不用?),思路嘛,人太懒,就不想打字了,上面都打了这么多了。参考网址:http://blog.csdn.net/u011542204/article/details/47857687 还有http://blog.csdn.net/doyouseeman/article/details/51009073,自我认为解释得还不错。只是今天真的不想去看这种长长的程序了。
今天还讲了倍增,是同学讲的,讲得不错,帮k啦啦啦。有时间自己再写一篇讲解倍增的博客。发一下同学anantheparty的倍增:http://blog.csdn.net/u011327397/article/details/51894479。
好啦,今天就先这样吧。(写了这么久的博客。休息一下。)
【未完成0.0】Noip2012提高组day2 解题报告的更多相关文章
- noip2015提高组day2解题报告
1.跳石头 题目描述 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石( ...
- NOIP2018提高组Day2 解题报告
前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). \(Day2\)的题目和\(Day1\)比起来,真的是难了很多啊. \(T1\):旅行(点此看 ...
- 【NOIP2015】提高组D1 解题报告
P1978神奇的幻方 Accepted 描述 幻方是一种很神奇的 N ∗ N 矩阵:它由数字 1,2,3, … … , N ∗ N 构成,且每行.每列及两条对角线上的数字之和都相同. 当 N 为奇数时 ...
- NOIP2018提高组Day1 解题报告
前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). 这次\(NOIP\ Day1\)的题目听说很简单(毕竟是三道原题),然而我\(T3\)依然悲剧 ...
- 牛客NOIP暑期七天营-提高组1 解题报告
https://ac.nowcoder.com/acm/contest/920#question A 构造+双指针 发现m的限制是1e5,而点数是5e4,所以不能构造太多的边,思考一下最短路树的定义. ...
- NOIP2012提高组day2 T2借教室
这题骗分可以骗到满分(可能是数据不太强给强行过去了) 这道题如果是按照题意去模拟用循环去修改区间的话只有45分,正解是二分+差分数组,骗分也是差分数组但是没有使用二分,时间复杂度在最坏的情况下是O(n ...
- NOIP 2018 提高组初赛解题报告
单项选择题: D 进制转换题,送分: D 计算机常识题,Python是解释运行的: B 常识题,1984年小平爷爷曰:“娃娃抓起”: A 数据结构常识题,带进去两个数据就可以选出来: D 历年真题没有 ...
- 刷题总结——疫情控制(NOIP2012提高组)
题目: 题目背景 NOIP2012 提高组 DAY2 试题. 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都 ...
- 18/9/16牛客网提高组Day2
牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...
随机推荐
- 笔试——JAVA相关
1. String 和 StringBuffer 的区别(转自http://pengcqu.iteye.com/blog/487538) Java笔试题经常考到“String和StringBuffer ...
- 工作流学习——Activiti流程定义管理三步曲 (zhuan)
http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ...
- Python 学习笔记 - 10.类(Class) 1
定义 Python 的 Class 比较特别,和我们习惯的静态语言类型定义有很大区别. 1. 使用一个名为 __init__ 的方法来完成初始化.2. 使用一个名为 __del__ 的方法来完成类似析 ...
- ftp断点续传
有时候ftp的文件太大了 容易断掉 使用shell下载 1 #!/bin/bash 2 cd /data2/GATK2/refSeqDB/1000genomePhase3 3 ftp -v -n 19 ...
- TensorFlow Playground
A Neural Network Playground Understanding neural networks with TensorFlow Playground 机器之心翻译
- 《云中歌》孟石头泡妞大法独家放送,单身汪get起来!!
谁说古代文人雅士只会诗词歌赋.琴棋书画?作为“玉中之王”的公子哥——孟石头泡妞可是个中高手,总结起来都能出一本“泡妞宝典”了,单身的乃们还不赶紧学起来! 第一步:假装自来熟相识,马上开启约会模式 看到 ...
- Element can be click when out of view
WebDriver can't action the element when out of view Webdriver can't action the element when the elem ...
- SAP MM常用表
EBAN 采购申请 MM模块EBAN_采购申请 EBKN 采购申请帐户设置 MM模块EBKN_采购申请帐户设置 EBUB 有关物料的运输请求的索引 MM模块EBUB_有关物料的运输请求的索引 EINA ...
- 能源项目xml文件 -- app-datasource.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- HTML5自学笔记[ 1 ]新增标签
新增语义化标签 <header></header>: 用于页面或板块头部. <footer></footer>:用于页面底部. <nav>& ...