noip2013 提高组

T1 转圈游戏 题目传送门

果不其然 第一题还是模拟题 一波快速幂解决问题

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int n,m,k,x;
int qmod(int a,int b,int c){
    int ans=1;
    while(b){
        if(b&1) ans=ans*a%c;
        b=b/2;
        a=a*a%c;
    }
    return ans;
}
int main()
{
    n=read(); m=read(); k=read(); x=read();
    int v=qmod(10,k,n);
    printf("%d\n",(v*m+x)%n);
    return 0;
}

T2 火柴排队 题目传送门

这是道树状数组求逆序数对的题目 当然还要加一波离散化就好了 不过这题的离散化很玄学哇 2333

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=100007,mod=99999997;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
struct node{int w,pos;}a[M],b[M];
bool cmp(node a,node b){return a.w<b.w;}
int c[M],sum[M],n;
LL ans;
int lowbit(int x){return x&-x;}
void insert(int x){
    while(x<=n){
        sum[x]++;
        x+=lowbit(x);
    }
}
int push_sum(int x){
    int ans=0;
    while(x){ans+=sum[x]; x-=lowbit(x);}
    return ans;
}
int main()
{
    n=read();
    for(int i=1;i<=n;i++) a[i].w=read(),a[i].pos=i;
    for(int i=1;i<=n;i++) b[i].w=read(),b[i].pos=i;
    sort(a+1,a+1+n,cmp); sort(b+1,b+1+n,cmp);
    for(int i=1;i<=n;i++) c[a[i].pos]=b[i].pos;
    for(int i=1;i<=n;i++){
        insert(c[i]);
        ans=(ans+i-push_sum(c[i]))%mod;
    }
    printf("%lld\n",ans);
    return 0;
}

T3 货车运输题目传送门

几乎是裸的lca吧 用lca维护一波最近公共祖先和路径最小值就好了

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=150007;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int w[M],n,f[M][2];
int main()
{
    n=read();
    for(int i=1;i<=n;i++) w[i]=read(),f[i][0]=f[i][1]=1;
    for(int i=1;i<=n;i++)
        for(int j=i-1;j;j--){
            if(w[i]>w[j]) f[i][1]=max(f[i][1],f[j][0]+1);
            if(w[j]>w[i]) f[i][0]=max(f[i][0],f[j][1]+1);
            if(f[i][0]!=1&&f[i][1]!=1) break;
        }
    printf("%d\n",max(f[n][0],f[n][1]));
    return 0;
}

T4 积木大赛  题目传送门

这道题就是我们只考虑相邻两列h1 h2 容易证明他的无后效性

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=150007;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int w[M],n,f[M][2];
int main()
{
    n=read();
    for(int i=1;i<=n;i++) w[i]=read(),f[i][0]=f[i][1]=1;
    for(int i=1;i<=n;i++)
        for(int j=i-1;j;j--){
            if(w[i]>w[j]) f[i][1]=max(f[i][1],f[j][0]+1);
            if(w[j]>w[i]) f[i][0]=max(f[i][0],f[j][1]+1);
            if(f[i][0]!=1&&f[i][1]!=1) break;
        }
    printf("%d\n",max(f[n][0],f[n][1]));
    return 0;
}

T5 花匠 题目传送门

正解似乎是算拐点+1 数据随机dp水过

0表示他是作为比较小的那个点 1则相反

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=150007;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int w[M],n,f[M][2];
int main()
{
    n=read();
    for(int i=1;i<=n;i++) w[i]=read(),f[i][0]=f[i][1]=1;
    for(int i=1;i<=n;i++)
        for(int j=i-1;j;j--){
            if(w[i]>w[j]) f[i][1]=max(f[i][1],f[j][0]+1);
            if(w[j]>w[i]) f[i][0]=max(f[i][0],f[j][1]+1);
            if(f[i][0]!=1&&f[i][1]!=1) break;
        }
    printf("%d\n",max(f[n][0],f[n][1]));
    return 0;
}

T6 华容道 题目传送门

这道题黄学长都弃坑了 我纠结什么呢 以后补吧 hzwer

时间: 2024-12-14 18:43:14

noip2013 提高组的相关文章

【解题】noip2013提高组(day1+day2)

这套题,勾起了我无数美好的回忆←意思是该好好复习了... [day1] 一.转圈游戏 首先,第一题,在处理k的时候应该用快速幂算法. 大概就是下面这样,要注意的是:1.二分时要判断有无余数.2.先设数,在进行乘积运算,不然会递归两次=.= 1 int pow(int a,int pos) 2 { 3 if(pos==1) return a%t; 4 int temp=pow(a,pos/2); 5 if(pos%2==1) return (temp*temp*a)%t; 6 return (te

洛谷 P1969 积木大赛(NOIp2013提高组D2T1)

题目描述 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成n块高度为 0 的积木).接下来每次操作,小朋友们可以选择一段连续区间[l, r],然后将第第 L 块到第 R 块之间(含第 L 块和第 R 块)所有积木的高度分别增加1. 小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少.但她不是一个勤于动手的孩子,所

[部分题解]noip2013提高组Day2

积木大赛: 之前没有仔细地想,然后就直接暴力一点(骗点分),去扫每一高度,连到一起的个数,于是2组超时 先把暴力程序贴上来(可以当对拍机) 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 FILE *fin = fopen("block.in","r"); 5 FILE *fout= fopen("block.out","w&quo

2016.7.12 NOIP2013提高组 day2解题报告(未完成版)

考试马不停蹄地到来,昨天的程序还没改完,今天又考了day2,虽然没有昨天那么懵逼,但还是不尽如人意,现在还没讲题,我打算先自己看一次解题报告,争取加深理解,毕竟一位前辈说过,做一套题的质量取决于题本身的质量和你思考的程度. 考试总结: 1.数据分析推测可行算法很重要,要灵活掌握常用算法的时间复杂度: 2.对拍的方式要熟练,写对拍耗费的时间过多: 3.要加强代码实现的能力,比较突出的表现就是写200-300行多函数模拟或搜索的能力: 4.不要急于写过不完的程序,要多拿一点时间来分析数据,样例不够还

noip2013——提高组——积木大赛

noip2013 D2T1 太简单了,不说了. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int read(){ int t=1,num=0; char c=getchar(); while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar();} while(c>=

[NOIP2013] 提高组 洛谷P1970 花匠

题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定 把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希 望剩下的花排列得比较别致. 具体而言,栋栋的花的高度可以看成一列整数h1,h2..hn.设当一部分花被移走后,剩下的花的高度依次为g1,g2..gn,则栋栋希望下面两个条件中至少有一个满足: 条件 A:对于所有g(2i)>g(2i-1),g(2i)>g(2i+1) 条件 B:对于所有g(2i)<g(2i-1),g(2i)

NOIP2013 提高组day2 3 华容道 BFS

描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的: 在一个 n*m 棋盘上有 n*m 个格子,其中有且只有一个格子是空白的,其余 n*m-1个格子上每个格子上有一个棋子,每个棋子的大小都是 1*1 的: 有些棋子是固定的,有些棋子则是可以移动的: 任何与空白的格子相邻(有公共的边)的格子上的棋子都可以移动到空白

[NOIP2013提高组]货车运输

题目:洛谷P1967.Vijos P1843.codevs3287. 题目大意:有n个城市m条道路,每条道路有一个限重,规定货车运货不能超过限重.有一些询问,问你两个城市之间一次最多能运多少重的货(可能无法到达). 解题思路:首先,要保证原来连通的点连通,限重要尽可能大,所以最大生成树.然后对每个询问找两个点的最近公共祖先,然后求出两点路径上最大限重的最小值即可. 用倍增求LCA,可以边算边求出最小值,不用用一些复杂的方法.代码中我用sml[x][i]表示x和它的第$2^i$个祖先之间的路径上最

洛谷P1967 [NOIP2013提高组Day1T2]货车运输

P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物. 输入输出格式 输入格式: 输入文件名为 truck.in. 输入文件第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道 路. 接下来 m 行每行 3 个整数 x. y. z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y