2017-9-26 NOIP模拟赛

NOIP 2017 全真模拟冲刺


---LRH&&XXY


题目名称


那些年


铁路计划


毁灭


题目类型


传统


传统


传统


可执行文件名


years


trainfare


destroy


输入文件名


years.in


trainfare.in


destroy.in


输出文件名


years.out


trainfare.out


destroy.out


每个测试点时限


1.5s


1.0s


1.0s


内存限制


256 MB


256 MB


256 MB


测试点数目


20


20


20


每个测试点分值


5


5


5

注意选手下发子文件夹

那些年

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
#define maxn 100010
#define M 2000010
int n,m,num,head[maxn];
bool vis[maxn];
struct node{
    int from,to;
}E1[maxn];
struct Node{
    int from,to;
}E[maxn];
struct node1{
    int to,pre,v;
}e[M+maxn*2];
void Insert(int from,int to,int v,int id){
    e[id].to=to;
    e[id].v=v;
    e[id].pre=head[from];
    head[from]=id;
}
void bfs(){
    memset(vis,0,sizeof(vis));
    queue<int>q;q.push(1);vis[1]=1;
    while(!q.empty()){
        int now=q.front();q.pop();
        for(int i=head[now];i;i=e[i].pre){
            if(e[i].v==0)continue;
            int to=e[i].to;
            if(!vis[to]){
                q.push(to);
                vis[to]=1;
            }
        }
    }
}
int main(){
    //freopen("Cola.txt","r",stdin);
    freopen("destroy.in","r",stdin);
    freopen("destroy.out","w",stdout);
    scanf("%d%d",&n,&m);int x,y;
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        Insert(x,y,1,i);
        Insert(y,x,1,i+n);
    }
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        Insert(x,y,1,n+n+i);
        Insert(y,x,1,n+n+m+i);
    }
    if(n==100000&&(m==50000||m==70000||m==90000)){
        long long ans=1LL*(n-1-m)*m+m;
        cout<<ans;
        return 0;
    }
    bool flag=0;
    long long ans=0;
    for(int i=1;i<n;i++){
        e[i].v=0;e[i+n].v=0;
        for(int j=1;j<=m;j++){
            flag=0;
            e[j+n+n].v=0;e[j+n+n+m].v=0;
            bfs();
            e[j+n+n].v=1;e[j+n+n+m].v=1;
            for(int k=1;k<=n;k++){
                if(!vis[k]){
                    flag=1;
                    break;
                }
            }
            if(flag)ans++;
        }
        e[i].v=1;e[i+n].v=1;
    }
    cout<<ans;
}

50分

运输计划

【题目背景】

公元 2044 年,人类进入了宇宙纪元。

【题目描述】

L 国有 n 个星球,还有 m 条双向航道,每条航道建立在两个星球之间,这 m条航道连通了 L 国的所有星球。为了方便,我们规定1号星球为好星球。

在好星球上,小 P 掌管一家物流公司,该公司有m个运输计划。第i个运输计划形如:有一艘物流飞船需要从 ui 号星球飞行到相邻的vi 号星球去。对于航道 j,飞船驶过它所花费的时间为 tj。开始所有的tj都是1秒。但星球居民对运输计划极其不满。

为了鼓励科技创新,L 国国王允许小 P 使用魔法到某个运输计划上,飞船驶过被施魔法的航道消耗时间为2秒,一个运输计划最多只能被施加1次魔法,每年小p只能使用一次魔法。

由于居民不识数,改为2秒后他们感觉飞船跑得飕飕快,于是就可能会对好星球上的小p产生满意度。好星球每一年都会对居民进行一次满意度调查。如果一个星球上的居民到好星球的时间增加了,他们就会对小P的物流公司产生1点满意度。好星球上的居民永远不会对小p的物流公司产生满意度。

在计划实施前,你需要帮助小p的物流公司统计出未来的每一年中,各将有多少个星球的居民对好星球有满意度。

【输入描述】

第一行包含三个整数N、M、Q 分别表示宇宙中星球数,小P的运输计划数和运输计划将要实施的年数。

接下来M行,其中第i行包含两个整数ui,v1表示第i条航线链接ui和vi两个星球。

接下来Q行其中第j行包含一个整数Rj,表示计划实行后第j年将会对第Rj个运输计划施魔法。

【输出描述】

一共Q行 其中第j行表示第j年有多少星球的居民对好星球上小p的物流公司产生了满意度。

【数据范围及约定】

对于24%的数据,满足以下条件  N<=100  M<=4950 Q<=30

对于48%的测试数据 满足以下条件:Q<=30

对于另外 32%的测试数据,满足以下条件:正确输出中不同数字<=50种。

对于全部测试数据 满足以下条件:

2 <= N <= 100 000 , 1 <= Q <= M <= 200 000

1 <= ui ,vi <=N, ui、vi不相等 , 1 <= Rj <=M 。

【样例输入及输出】

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
#define maxn 100010
int n,m,q,head[maxn],dis[maxn],Dis[maxn];
struct node{
    int to,pre,v;
}e[200010*2];
struct Node{
    int from,to;
}E[200010];
bool vis[maxn];
void Insert(int from,int to,int v,int id){
    e[id].to=to;
    e[id].v=v;
    e[id].pre=head[from];
    head[from]=id;
}
void spfa(int s){
    queue<int>q;
    memset(vis,0,sizeof(vis));
    memset(dis,127/3,sizeof(dis));
    q.push(s);vis[s]=1;dis[s]=0;
    while(!q.empty()){
        int now=q.front();q.pop();vis[now]=1;
        for(int i=head[now];i;i=e[i].pre){
            int to=e[i].to;
            if(dis[to]>dis[now]+e[i].v){
                dis[to]=dis[now]+e[i].v;
                if(!vis[to]){
                    q.push(to);
                    vis[to]=1;
                }
            }
        }
    }
}
void bfs(int s){
    queue<int>q;
    memset(vis,0,sizeof(vis));
    q.push(s);vis[s]=1;Dis[s]=0;
    while(!q.empty()){
        int now=q.front();q.pop();
        for(int i=head[now];i;i=e[i].pre){
            int to=e[i].to;
            if(!vis[to]){
                Dis[to]=Dis[now]+1;
                vis[to]=1;
                q.push(to);
            }
        }
    }
}
int main(){
    //freopen("Cola.txt","r",stdin);
    freopen("trainfare.in","r",stdin);
    freopen("trainfare.out","w",stdout);
    scanf("%d%d%d",&n,&m,&q);
    int x,y;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        E[i].from=x;
        E[i].to=y;
        Insert(x,y,1,i);Insert(y,x,1,i+m);
    }
    int now;
    bfs(1);
    while(q--){
        scanf("%d",&now);
        e[now].v=2;e[now+m].v=2;
        int ans=0;
        spfa(1);
        for(int i=2;i<=n;i++){
            if(dis[i]>Dis[i])ans++;
        }
        printf("%d\n",ans);
    }
}

30分 暴力

 

 

毁灭

【题目背景】

在神秘的玄灵大陆上生活着曲墨两个部族,他们世代对立。

曲族新任族长曲香檀为了壮大曲族,大开杀戮,纤纤素手,沾满鲜血。一日,她乔装遇刺,身负重伤。

墨族神医墨连城,被女子的美貌所吸引,不但救了她,两人同时坠入爱河。

曲香檀竭尽全力隐瞒身份,新谎言掩盖了旧谎言,最终仍误会成塔,她离开了他,继续她的杀戮,继续她的族长之路。

连城不忍心爱之人双手沾满献血,在曲香檀即将开展下一次杀戮时,他决定阻止她——破坏曲族内部联络通道,不惜代价......

【题目描述】

曲族在玄灵大陆有n个聚居地,当初曲香檀为了方便调配族人,在族人的聚居地之间开辟了许多双向空间隧道,保证任意两个聚居地可以直接或间接连通。同时为了节省资源对抗墨族,所以任意两个聚居地之间有且只有一条空间隧道可以直接或间接到达。现在为了抵御墨连城,曲香檀又耗费玄力,打通了m条双向地下暗河,但这m条暗河不能惠及每一个聚居地。曲族内部既可以通过空间隧道联络,也可以用地下暗河,当然也可以两者都用。

墨连城之前治疗曲香檀,耗费了大半玄力。又通过各种方法获取曲族新的联络网,玄力更是所剩无几。所以他决定仅破坏1条空间隧道和1条地下暗河。破坏后,只要曲族内部有任意2个聚居地不能互达,连城就成功了。想在,他想知道有多少种方式可以破坏曲族的内部联络。

【输入描述】

第一行包含两个整数n和m。

接下来n-1行,每行两个整数x,y,表示x和y之间有一条双向空间隧道。

接下来m行,每行两个整数x,y,表示x和y之间有一条双向地下暗河。

【输出描述】

一行表示答案

【样例输入1】

4 1

1 2

2 3

1 4

3 4

【样例输出1】

3

【注意】

样例2与样例3请看下发子文件夹

样例1解释:

地下暗河只有1条,3空间隧道任选一条都可以使曲族内部不连通,总共有3种方式

样例2与样例3不解释

【子任务】


测试点编号


N=


M=


特殊性质


1


10


10



2


100


100


3、4


500


500


5、6、7


3000


3000


8、9、10


8000


1000


11


100000


50000


1、空间隧道构成一条链

2、每条地下暗河连通两个相邻聚居地

3、不会有两条地下暗河连通相同的聚居地


12


100000


70000


13


100000


90000


14、15、16


100000


100000



17、18、19、20


100000


1000000

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
#define maxn 100010
#define M 2000010
int n,m,num,head[maxn];
bool vis[maxn];
struct node{
    int from,to;
}E1[maxn];
struct Node{
    int from,to;
}E[maxn];
struct node1{
    int to,pre,v;
}e[M+maxn*2];
void Insert(int from,int to,int v,int id){
    e[id].to=to;
    e[id].v=v;
    e[id].pre=head[from];
    head[from]=id;
}
void bfs(){
    memset(vis,0,sizeof(vis));
    queue<int>q;q.push(1);vis[1]=1;
    while(!q.empty()){
        int now=q.front();q.pop();
        for(int i=head[now];i;i=e[i].pre){
            if(e[i].v==0)continue;
            int to=e[i].to;
            if(!vis[to]){
                q.push(to);
                vis[to]=1;
            }
        }
    }
}
int main(){
    //freopen("Cola.txt","r",stdin);
    freopen("destroy.in","r",stdin);
    freopen("destroy.out","w",stdout);
    scanf("%d%d",&n,&m);int x,y;
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        Insert(x,y,1,i);
        Insert(y,x,1,i+n);
    }
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        Insert(x,y,1,n+n+i);
        Insert(y,x,1,n+n+m+i);
    }
    if(n==100000&&(m==50000||m==70000||m==90000)){
        long long ans=1LL*(n-1-m)*m+m;
        cout<<ans;
        return 0;
    }
    bool flag=0;
    long long ans=0;
    for(int i=1;i<n;i++){
        e[i].v=0;e[i+n].v=0;
        for(int j=1;j<=m;j++){
            flag=0;
            e[j+n+n].v=0;e[j+n+n+m].v=0;
            bfs();
            e[j+n+n].v=1;e[j+n+n+m].v=1;
            for(int k=1;k<=n;k++){
                if(!vis[k]){
                    flag=1;
                    break;
                }
            }
            if(flag)ans++;
        }
        e[i].v=1;e[i+n].v=1;
    }
    cout<<ans;
}

25分 暴力

时间: 2024-08-27 10:37:20

2017-9-26 NOIP模拟赛的相关文章

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

2017 11.6 NOIP模拟赛

1.数学老师的报复(attack.pas/c/cpp)[问题描述]11 班数学大佬 YXN 又在上数学课的时候把班主任 MP6 的错误当众挑出来了,MP6 再一次感到很难堪,于是决定报复 YXNMP6 对 YXN 说:给你一个函数 f(x),定义如下:f ( 1 ) = 1f ( 2 ) = 1f ( n ) = ( A * f ( n - 1 ) + B * f ( n - 2 ) ) mod 7.YXN 说这还不简单,可以秒杀!MP6 微微笑了笑说:n 等于 100 你算得出来,那 n 等于

2017 9 15 noip模拟赛

t1: #include<cstdio> #include<cstring> const int N=1000010; int a[N],b[N]; int sum=1,maxx=0; int main() { freopen("sequence.in","r",stdin); freopen("sequence.out","w",stdout); int n; scanf("%d"

2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)

期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233 “来来来,学弟,我考你道水题检验一下你的水平……” 一个栈内初始有n个红色和蓝色的小球,请你按照以下规则进行操作 只要栈顶的小球是红色的,将其取出,直到栈顶的球是蓝色 然后将栈顶的蓝球变成红色 最后放入若干个

2017.9.24 noip模拟赛 day2—组合数

简化版题意: 给定n,m(n<=m),求C(n,m)的末尾有几个0 输入格式: 第一行一个整数t,代表数据组数. 接下来t行,每行两个整数n,m 输出格式: t行,每行一个整数,代表C(n,m)的末尾0的个数. 样例输入: 310 111 720 4 样例输出: 110 数据范围: 1<=m<=n<=1000000,t<=1000 首先这道题需要知道一个公式:C(n,m)=n!/(n-m)!*m! 然后10=2*5,也就是说,对于一个数,我们将其因数分解,2和5中较少的数的个

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

【noip模拟赛】 射击

这题似乎是什么安阳一中的模拟题,不管了,反正是学长出的noip模拟赛里面的题目.... 射击(shoot.pas/.c/.cpp) 时间限制:1s,内存限制128MB 题目描述: 据史书记载,对越反击战时期,有位中国侦察兵,他的代号叫814.一天他执行狙击任务,他的任务地区是n座恰巧在一条直线上的山.这些山所在直线恰巧为东西走向,山从东到西依次编号为1~n.一天814隐藏在编号为k的山上,每座山上都有1个目标. 814也非常的厉害,任务结束时杀了很多人,可是史书中只记载了两点: 1:814一定攻

NOIP模拟赛

#1[Nescafé 31]杯NOIP模拟赛 t1 题意:n*m的棋盘上从(1,1)走到(n,m),只能向下或向右,一些格子有老鼠,每个老鼠互不相同,当处于与老鼠有重边的格子时,视为看见了这只老鼠,求到终点看到最少的不同老鼠数. 分析:DP 由于求得是看到的不同的老鼠数目,不能直接用过河卒做,因为同一个位置的老鼠可能会统计多次,我们还需要增加一维即方向. f[i,j,0]表示到从上面一个格子走到(i,j)时最少老鼠数,f[i,j,1]表示左边. f[i,j,0]:=min(f[i-1,j,0]+

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl