9.26模拟赛

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

40分

#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;

LL od,t;
inline LL read(){
    char ch=getchar();LL x=0,f=1;
    for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)f=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-‘0‘;
    return x*f;
}

LL GCD(LL x,LL y){
    return y==0?x:GCD(y,x%y);
}

LL gcd(LL a,LL b,LL &x,LL &y){
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    LL r=gcd(b,a%b,x,y);
    LL tmp=0;
    tmp=x;
    x=y;
    y=(tmp-(a/b)*y);
    return r;
}

void slove1(){
    t=read();
    for(register LL i=1;i<=t;i++){
       LL a,p,x,y;
       a=read();p=read();
       LL r=gcd(a,p,x,y);
       while(x<0)x=p+x;
       printf("%I64d\n",x);
    }
}

void slove2(){
    t=read();
    for(register int i=1;i<=t;i++){
        LL a,p;
        a=read();p=read();
        printf("4\n1\n16\n6\n48\n");
    }
}

void slove3(){
    t=read();
    for(register int i=1;i<=t;i++){
        LL n,m,ans=0;
        n=read();m=read();
        for(LL p=1;p<=n;p++)
         for(LL q=1;q<=m;q++)
          ans+=GCD(p,q);
        printf("%I64d\n",ans);
    }
}

void slove4(){
    t=read();
    for(register int i=1;i<=t;i++){
        LL n,ans=0;n=read();
        for(int j=1;j<=n;j++)ans+=n/j;
        printf("%I64d\n",ans);
    }
}

int main(){
    freopen("years.in","r",stdin);
    freopen("years.out","w",stdout);
    od=read();
    if(od==1)slove1();
    if(od==2)slove2();
    if(od==3)slove3();
    if(od==4)slove4();
    fclose(stdin);fclose(stdout);
    return 0;
}

运输计划

【题目背景】

公元 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 。

题目大意:求每次将某条边+1后,有多少个点到1的最短路改变。

35分 q遍spfa

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define maxn 100005
using namespace std;
queue<int>q;
int n,m,qx,sumedge;
int head[maxn],dis[maxn],g[maxn],inq[maxn];

inline int read(){
    char ch=getchar();int x=0,f=1;
    for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)f=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-‘0‘;
    return x*f;
}

struct Edge{
    int x,y,z,nxt;
    Edge(int x=0,int y=0,int z=0,int nxt=0):
        x(x),y(y),z(z),nxt(nxt){}
}edge[maxn<<2];

void add(int x,int y,int z){
    edge[++sumedge]=Edge(x,y,z,head[x]);
    head[x]=sumedge;
}

inline void spfa(){
    while(!q.empty())q.pop();
    memset(dis,127/3,sizeof(dis));
    memset(inq,0,sizeof(inq));
    dis[1]=0;inq[1]=1;q.push(1);
    while(!q.empty()){
        int now=q.front();q.pop();inq[now]=0;
        for(int i=head[now];i;i=edge[i].nxt){
            int v=edge[i].y;
            if(dis[v]>dis[now]+edge[i].z){
                dis[v]=dis[now]+edge[i].z;
                if(!inq[v]){
                    inq[v]=1;
                    q.push(v);
                }
            }
        }
    }
}

int Spfa(){
    while(!q.empty())q.pop();
    memset(g,127/3,sizeof(g));
    memset(inq,0,sizeof(inq));
    g[1]=0;inq[1]=1;q.push(1);
    while(!q.empty()){
        int now=q.front();q.pop();inq[now]=0;
        for(int i=head[now];i;i=edge[i].nxt){
            int v=edge[i].y;
            if(g[v]>g[now]+edge[i].z){
                g[v]=g[now]+edge[i].z;
                if(!inq[v]){
                    inq[v]=1;
                    q.push(v);
                }
            }
        }
    }
    int js=0;
    for(register int i=1;i<=n;i++)
     if(dis[i]!=g[i])js++;
     return js;
}
int main(){
    freopen("trainfare.in","r",stdin);
    freopen("trainfare.out","w",stdout);
    n=read();m=read();qx=read();
    for(register int i=1;i<=m;i++){
        int x,y;
        x=read();y=read();
        add(x,y,1);add(y,x,1);
    }
    spfa();
    for(register int i=1;i<=qx;i++){
        int x;x=read();
        edge[x*2].z++;edge[x*2-1].z++;
        printf("%d\n",Spfa());
    }
    fclose(stdin);fclose(stdout);
    return 0;
}

毁灭

【题目背景】

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

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

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

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

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

【题目描述】

曲族在玄灵大陆有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不解释

【输出描述】

一行表示答案

【样例输入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

题目大意:求切一条树边和非树边使图不连通有多少种方法

10分 md判断联通不连通应该用bfs...我这个傻叉用的kruskal....气哭...

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int n,m,fa[100005];
long long ans;

struct Edge{
    int x,y,exit;
}e[200008];

inline int read(){
    char ch=getchar();int x=0,f=1;
    for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)f=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-‘0‘;
    return x*f;
}

int f(int x){
    return fa[x]==x?x:fa[x]=f(fa[x]);
}

bool cut(int p,int q){
    int cnt=n;
    for(register int i=1;i<=n;i++)fa[i]=i;
    e[p].exit=0;e[q].exit=0;
    for(register int i=1;i<=n-1+m;i++){
        if(e[i].exit==0)continue;
        int fx=f(e[i].x),fy=f(e[i].y);
        if(fx!=fy){
            fa[fx]=fy;
            cnt--;
        }
    }
    e[p].exit=1;e[q].exit=1;
    return cnt!=1;
}

int main(){
    freopen("destroy.in","r",stdin);
    freopen("destroy.out","w",stdout);
    n=read();m=read();
    for(int i=1;i<n;i++){
      e[i].x=read();e[i].y=read();e[i].exit=1;
    }
    int k=n-1;
    for(int i=1;i<=m;i++){
        e[++k].x=read();e[k].y=read();e[k].exit=1;
    }
    for(int i=n;i<=m+n-1;i++)
        for(int j=1;j<n;j++)
            if(cut(i,j))++ans;
    printf("%I64d",ans);
    fclose(stdin);fclose(stdout);
    return 0;
}
时间: 2024-10-22 14:26:32

9.26模拟赛的相关文章

2018/02/26 模拟赛

第一题排序暴力 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<string> 5 #include<algorithm> 6 #include<cmath> 7 #include<utility> 8 #include<stdio.h> 9 #include<cstdlib> 10 #include<

2019.9.26模拟赛

T1序列 这个题大佬们爆踩std了 给一个序列,其中一段排序后是某一等比数列子序列,求最长长度. 怎么做 数据太水导致枚举公比的过了 序列中每两个数做商,如果整除了的话,这个商一定是公比的次幂.我们从大到小枚举它是公比的几次幂,从而求到最小的公比.由于\(2^{60} > 1^{18}\),这个枚举只需要从59开始即可.时间复杂度\(O(64n)\) Code pow有精损注意判一下.(不要瞎搞手写分数次幂) #include <bits/stdc++.h> namespace fdat

2019.10.26模拟赛

T1 序列 给定一长度为\(n\)的序列\(s\),定义其健美值为:\[\sum\limits_{i=1}^{n}|s_i - i|\]因为 zzq 喜欢健美,所以 zzq 希望减小\(s\)的健美值,以衬托 zzq 的健美.为了达到 zzq 的目的,zzq 希望你对序列进行旋转操作,一次旋转操作可以使序列中的所有元素前移一位,并使\(s_1\)移动到\(s_n\). 可以进行任意次旋转操作,zzq 希望旋转后的健美值最小,请找出这个最小值. SOV 智商检测题 我们发现对于每个数,移动每一次会

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

[铁一中OI模拟赛]2017.8.19 Day1

T1 小Z的情书 题目链接 思考: 题目主要难度在于旋转后的位置如何,在手写了样例之后不难发现规律. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) #define down(a,b,c) for(register int c=a;c>=b;--c) const int Maxn=1005; int n; bool Map[Maxn][Maxn],

bzoj2741: 【FOTILE模拟赛】L

2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2679  Solved: 766[Submit][Status][Discuss] Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一

20161026模拟赛解题报告

20161026模拟赛解题报告 By shenben T1 按照题目说的模拟即可 但这题有一个神坑:当25个字母都已经一一对应完毕后,剩下的两个字母默认对应. T2 所有的逆序对之间都会连边,求最大独立点集. 表面上是个图论题,其实是个LIS O(nlogn)求最长上升子序列的长度即可AC T3 第一次手贱,用链表存边,这是一个稠密图啊!!应该用邻接矩阵啊. 明明可以用floyed跑,非要dfs乱搞.结果10分.玩砸了吧. 最后只改到了40分. 网上的题解(没看懂): 首先这是一个神奇的图,叫做