noip2013 提高组
T1 转圈游戏 题目传送门
果不其然 第一题还是模拟题 一波快速幂解决问题
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m,k,x;
int qmod(int a,int b,int c){
int ans=;
while(b){
if(b&) ans=ans*a%c;
b=b/;
a=a*a%c;
}
return ans;
}
int main()
{
n=read(); m=read(); k=read(); x=read();
int v=qmod(,k,n);
printf("%d\n",(v*m+x)%n);
return ;
}
T2 火柴排队 题目传送门
这是道树状数组求逆序数对的题目 当然还要加一波离散化就好了 不过这题的离散化很玄学哇 2333
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=,mod=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); 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=;
while(x){ans+=sum[x]; x-=lowbit(x);}
return ans;
}
int main()
{
n=read();
for(int i=;i<=n;i++) a[i].w=read(),a[i].pos=i;
for(int i=;i<=n;i++) b[i].w=read(),b[i].pos=i;
sort(a+,a++n,cmp); sort(b+,b++n,cmp);
for(int i=;i<=n;i++) c[a[i].pos]=b[i].pos;
for(int i=;i<=n;i++){
insert(c[i]);
ans=(ans+i-push_sum(c[i]))%mod;
}
printf("%lld\n",ans);
return ;
}
T3 货车运输题目传送门
几乎是裸的lca吧 用lca维护一波最近公共祖先和路径最小值就好了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int w[M],n,f[M][];
int main()
{
n=read();
for(int i=;i<=n;i++) w[i]=read(),f[i][]=f[i][]=;
for(int i=;i<=n;i++)
for(int j=i-;j;j--){
if(w[i]>w[j]) f[i][]=max(f[i][],f[j][]+);
if(w[j]>w[i]) f[i][]=max(f[i][],f[j][]+);
if(f[i][]!=&&f[i][]!=) break;
}
printf("%d\n",max(f[n][],f[n][]));
return ;
}
T4 积木大赛 题目传送门
这道题就是我们只考虑相邻两列h1 h2 容易证明他的无后效性
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int w[M],n,f[M][];
int main()
{
n=read();
for(int i=;i<=n;i++) w[i]=read(),f[i][]=f[i][]=;
for(int i=;i<=n;i++)
for(int j=i-;j;j--){
if(w[i]>w[j]) f[i][]=max(f[i][],f[j][]+);
if(w[j]>w[i]) f[i][]=max(f[i][],f[j][]+);
if(f[i][]!=&&f[i][]!=) break;
}
printf("%d\n",max(f[n][],f[n][]));
return ;
}
当然其实正解我也写了一波 比dp快很多呀 2333
至于为什么是拐点
这道题就是求一个 大小大小大小或者 小大小大小大 的序列 其中大小是相对于相邻两个数而言
我们可以分情况考虑答案
1. 前一个数是 ‘大’ (定义为last)那么我们下一个数一定要比他小 这时我们考虑当前数 (定义为now)
如果now<last 很明显符合 那么答案++
如果last>=now 那么前面小于last的以及后面能<last的同样能符合now 那么我们完全可以用now代替last
2 前一个数是 ‘下' 同1
所以这个问题就转换成了求拐点数 拐点数+1就是答案了 2333
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,v[M];
int f,last,ans;
void solve(){
int sum=;
for(int i=;i<=n;i++){
if(f==&&v[i]<last) f=-,sum++;
if(f==-&&v[i]>last) f=,sum++;
last=v[i];
}
ans=max(ans,sum);
}
int main()
{
n=read();
for(int i=;i<=n;i++) v[i]=read();
last=v[]; f=; solve();
last=v[]; f=-; solve();
printf("%d\n",ans);
return ;
}
T5 花匠 题目传送门
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int w[M],n,f[M][];
int main()
{
n=read();
for(int i=;i<=n;i++) w[i]=read(),f[i][]=f[i][]=;
for(int i=;i<=n;i++)
for(int j=i-;j;j--){
if(w[i]>w[j]) f[i][]=max(f[i][],f[j][]+);
if(w[j]>w[i]) f[i][]=max(f[i][],f[j][]+);
if(f[i][]!=&&f[i][]!=) break;
}
printf("%d\n",max(f[n][],f[n][]));
return ;
}
T6 华容道 题目传送门
这道题黄学长都弃坑了 我纠结什么呢 以后补吧 hzwer
noip2013 提高组的更多相关文章
- [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路
[NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...
- [NOIP2013 提高组] 华容道 P1979 洛谷
[NOIP2013 提高组] 华容道 P1979 洛谷 强烈推荐,更好的阅读体验 经典题目:spfa+bfs+转化 题目大意: 给出一个01网格图,和点坐标x,y空格坐标a,b,目标位置tx,ty要求 ...
- [NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
一开始觉得是网络流..仔细一看应该是最短路,再看数据范围..呵呵不会写...这道题是最大生成树+最近公共祖先.第一次写..表示各种乱.. 因为要求运输货物质量最大,所以路径一定是在最大生成树上的.然后 ...
- 【NOIP2013提高组T3】加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- NOIP2013 提高组 Day1
https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%7C30 期望得分:100+100+100=300 实际得 ...
- [NOIP2013提高组]火柴排队
题目:洛谷P1966.Vijos P1842.codevs3286. 题目大意:有两排火柴,每根都有一个高度.设a.b分别表示两排火柴的高度,现在要令$\sum(a_i-b_i)^2$最小.现两排火柴 ...
- 积木大赛 noip2013提高组day2
这道题一开始想到处理中间是0的位置,但这样时间太慢了,后来想到一种类似二分的方法,就是把这一段的最小值找到,全部减去最小值,然后有0一出现,就又递归处理前一段,每次答案就加上这一段的最小值: AC代码 ...
- [NOIP2013] 提高组 洛谷P1969 积木大赛
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
- [NOIP2013] 提高组 洛谷P1970 花匠
题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定 把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希 望剩下的花排列得比较别致. 具 ...
- NOIP2013 提高组day2 3 华容道 BFS
描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的 ...
随机推荐
- fildder抓包工具详解
fildder页面介绍名称和含义 名称 含义 # 抓取HTTP Request的顺序,从1开始,以此递增 Result HTTP状态码 Protocol 请求使用的协议,如HTTP/HTTPS/FTP ...
- selenide 自动化UI测试中Configuration全局配置项目
selenide 在测试过程中需要设置许多的默认值,方便在测试过程中进行和很好的使用.下面我们在selenide中的api引用过来看看! static Configuration.AssertionM ...
- Spark性能超过Hadoop百倍
Spark在偷换概念,Hadoop跑硬盘,Spark跑内存,地球人都知道,内存的速度可是远超硬盘一个量级,超过100倍又有什么奇怪的.如果要比,咱们都拿硬盘来跑跑看!
- Sublime Text 3配置 Python3 开发环境
来自 https://www.cnblogs.com/zhangqinwei/p/6886600.html Sublime Text作为一款支持多种编程语言的文本编辑神器,深受广大开发者的喜爱.通过简 ...
- ISAP 最大流 最小割 模板
虽然这道题用最小割没有做出来,但是这个板子还是很棒: #include<stdio.h> #include<math.h> #include<string.h> # ...
- Pro Git - 笔记3
Git Branching Branches in a Nutshell Branches in a Nutshell let’s assume that you have a directory c ...
- 二分图最大权匹配:Kuhn-Munkres算法
http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646535.html
- java线程(4)——线程同步的锁技术
同步 同步,字面来看,有点一起工作的意思.但在线程同步中,"同"意为协同.互相配合. 比如: A.B两个线程,并不是说两个线程必须同时一起工作,而是说互相配合工作,在某个时间可能线 ...
- WCF 透明代理
现在我们通过类似的原理创建一个用于模拟WCF服务端和客户端工作原理的模拟程序.[源代码从这里下载] 目录 一.基本的组件和执行流程 二.创建自定义HttpHandler实现对服务调用请求的处理 三.定 ...
- 玩lua
https://my.oschina.net/wangxuanyihaha/blog/186401