NOIP 2013 提高组 合集

D1 T1 转圈游戏

快速幂裸题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long ll;
ll mod;
ll qpow(ll x,ll y)
{
ll ans=1;
while(y)
{
if(y&1) ans=(ans*x)%mod;
y>>=1;
x=(x*x)%mod;
}
return ans;
}
int main()
{
ll m,k,x; cin >> mod >> m >> k >> x ;
// printf("%lld\n",qpow(10,10));
printf("%lld\n",(x+qpow(10,k)%mod*m%mod)%mod);
return 0;
}

D1 T2 火柴排队

我们显然可以固定一个序列,因为我们可以通过相对的交换来等价地达到目的。

所以只需要求离散化后的逆序对即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod 99999997
#define N 100010
using namespace std; typedef long long ll;
ll tree[N<<1],n;
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
ll rd() {ll x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
struct Node
{
ll len; int id,now;
}a[N],b[N];
inline bool cmp_len(const Node &x,const Node &y) {return x.len<y.len;}
// inline bool cmp_id(const Node &x,const Node &y) {return x.id<y.id;}
inline int lowbit(int x) {return x&(-x);}
void update(int x)
{
for(int i=x;i>=1;i-=lowbit(i)) (tree[i]+=1)%=mod;
}
ll query(int x)
{
ll ans=0; for(int i=x;i<=n+1;i+=lowbit(i)) (ans+=tree[i])%=mod;
return ans;
}
int main()
{
n=rd();
for(int i=1;i<=n;i++)
{
a[i].len=rd();
a[i].id=i;
}
for(int i=1;i<=n;i++)
{
b[i].len=rd();
b[i].id=i;
}
sort(a+1,a+n+1,cmp_len); sort(b+1,b+n+1,cmp_len);
// puts("Fuck"); for(int i=1;i<=n;i++) printf("%lld ",b[i].id); puts("");
for(int i=1;i<=n;i++)
{
a[a[i].id].now=b[i].id;
}
// for(int i=1;i<=n;i++) printf("%d\n",a[i].now); puts("");
ll ans=0;
for(int i=1;i<=n;i++)
{
update(a[i].now);
(ans+=query(a[i].now+1))%=mod;
}
printf("%lld\n",ans);
return 0;
}

D1 T3 运输计划

离线+树剖+线段树+并查集

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
using namespace std;
struct Node
{
int x,y,z;
}a[N]; int n,m;
int head[N],to[N<<1],val[N<<1],nxt[N<<1],tot,F[N],dep[N],f[N][20],g[N][20]; bool vis[N];
inline bool cmp(const Node &x,const Node &y) {return x.z>y.z;}
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
inline void add(int x,int y,int z) {to[++tot]=y; val[tot]=z; nxt[tot]=head[x]; head[x]=tot;}
int find(int x) {return F[x]==x?x:F[x]=find(F[x]);}
void dfs(int pos,int fa)
{
f[pos][0]=fa; dep[pos]=dep[fa]+1; for(int i=1;i<=18;i++) f[pos][i]=f[f[pos][i-1]][i-1];
for(int i=head[pos];i;i=nxt[i]) if(to[i]!=fa)
{
dfs(to[i],pos);
}
}
void dfs2(int pos,int fa)
{
for(int i=head[pos];i;i=nxt[i]) if(to[i]!=fa)
{
g[to[i]][0]=val[i];
for(int j=1;j<=18;j++) g[to[i]][j]=min(g[to[i]][j-1],g[f[to[i]][j-1]][j-1]);
dfs2(to[i],pos);
}
}
int calc(int x,int y)
{
// printf("%d %d\n",x,y);
int ans=0x7f7f7f7f;
if(dep[x]<dep[y]) swap(x,y);
// printf("%d %d %d\n",x,y,ans);
for(int i=18;~i;i--)
{
// printf("%d %d %d\n",x,y,ans);
if(dep[f[x][i]]>=dep[y]) ans=min(ans,g[x][i]),x=f[x][i];
}
if(x==y) return ans;
for(int i=18;~i;i--)
{
// printf("%d %d %d\n",x,y,ans);
if(f[x][i]!=f[y][i]) ans=min(ans,min(g[x][i],g[y][i])),x=f[x][i],y=f[y][i];
}
// printf("%d %d %d\n",x,y,ans);
return min(ans,min(g[x][0],g[y][0]));
}
inline bool merge(int x,int y)
{
x=find(x); y=find(y);
if(x==y) return true;
F[x]=y; return false;
}
void test()
{
for(int i=1;i<=3;i++)
{
for(int j=0;j<=18;j++) printf("%d ",g[i][j]);
puts("");
}
}
int main()
{
memset(g,0x7f,sizeof g); n=rd(),m=rd();
int x,y; for(int i=1;i<=n;i++) F[i]=i;
for(int i=1;i<=m;i++) a[i].x=rd(),a[i].y=rd(),a[i].z=rd();
sort(a+1,a+m+1,cmp); for(int i=1;i<=m;i++)
{
if(!merge(a[i].x,a[i].y))
{
// printf("Shit %d %d %d\n",a[i].x,a[i].y,a[i].z);
add(a[i].x,a[i].y,a[i].z); add(a[i].y,a[i].x,a[i].z);
}
}
// printf("%d\n",find(1));
for(int i=1;i<=n;i++)
{
x=find(i);
if(!vis[x]) dfs(x,x),dfs2(x,x),vis[x]=1;
}
// test();
int q=rd(); for(int i=1;i<=q;i++)
{
x=rd(),y=rd(); if(find(x)!=find(y)) {puts("-1"); continue;}
printf("%d\n",calc(x,y));
}
return 0;
}

D2 T1 积木大赛

sb题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int n,a; cin >> n ;
int last=0,ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
if(a>last) ans += (a-last);
last=a;
}
cout << ans << endl ;
return 0;
}

D2 T2 花匠

dp裸题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100010
int a[N],f[N][2];
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
int main()
{
int n=rd(); for(int i=1;i<=n;i++) a[i]=rd();
f[1][0]=f[1][1]=1;
for(int i=2;i<=n;i++)
{
if(a[i]>a[i-1]) f[i][0]=f[i-1][1]+1;
else f[i][0]=f[i-1][0];
if(a[i]<a[i-1]) f[i][1]=f[i-1][0]+1;
else f[i][1]=f[i-1][1];
}
printf("%d\n",max(f[n][0],f[n][1]));
return 0;
}

D2 T3 华容道

挖坑代填

NOIP2013 提高组合集的更多相关文章

  1. NOIP2011 提高组合集

    NOIP 2011 提高组合集 D1 T1 铺地毯 模拟,题目让你干啥你就干啥 #include <iostream> #include <cstdio> using name ...

  2. NOIP2010 提高组合集

    NOIP 2010 提高组合集 T1 机器翻译 模拟题,用一个栈模拟,桶记录即可. #include <iostream> #include <cstdio> #include ...

  3. NOIP2015 提高组合集

    NOIP 2015 提高组 合集 D1 T1 神奇的幻方 题目让你干啥你就干啥,让你咋走你就咋走就完事儿了 #include <iostream> #include <cstdio& ...

  4. NOIP2014 提高组合集

    NOIP 2014 提高组 合集 D1 T1 生活大爆炸版石头剪刀布 首先,先将两个人的猜拳序列都变得不小于n.然后逐个模拟.胜败什么的看表就行了. #include <iostream> ...

  5. NOIP2012 提高组合集

    NOIP 2012 提高组 合集 D1 T1 Vigenère 密码 模拟题,观察到两个数对应位置-1相加的和%26就是对应的字母,按照这个性质模拟即可. #include <iostream& ...

  6. [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路

    [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...

  7. [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)

    [NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...

  8. NOIP2013提高问题求解T2(关于递推与递归)

    同步发表于我的洛谷博客. NOIP2013提高问题求解2: 现有一只青蛙,初始时在n号荷叶上.当它某一时刻在k号荷叶上时,下一时刻将等概率地随机跳到1,2,--,k号荷叶之一上,直到跳到第1号荷叶为止 ...

  9. [NOIP2013 提高组] 华容道 P1979 洛谷

    [NOIP2013 提高组] 华容道 P1979 洛谷 强烈推荐,更好的阅读体验 经典题目:spfa+bfs+转化 题目大意: 给出一个01网格图,和点坐标x,y空格坐标a,b,目标位置tx,ty要求 ...

随机推荐

  1. PHP定义字符串时单引号和双引号的区别

    一般用单引号或双引号标识一个字符串.单引号串与双引号串,在PHP中的处理是不同的.双引号中的内容可以被解释并被替换,单引号串中的内容则被作为普通字符处理. 例如: $str=6; echo " ...

  2. Sql2008调试问题

    t-sql调试的时候,报以下错误 处理 1.要在服务器本机,不要远程 2.服务器名称用电脑名称(cmd->hostname),不要用IP,(local)或. 调试快捷键跟VS一样 F11逐语句 ...

  3. P1823 音乐会的等待

    题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...

  4. (转)淘淘商城系列——商品搜索功能Service实现

    http://blog.csdn.net/column/details/15737.html 首先我们在taotao-search-interface工程中新建一个SearchService接口,并在 ...

  5. 导出功能在数据库内容为数字,excel表格中是汉字的时候

    代码如下: @ExcelField(title = "饮水器评价",dictType = "waterer_rate" ,align = 2, sort = 2 ...

  6. 虚拟机找不到本机vmnet0,vmnet8,无法连接xshell,解决方案

    首先出现这个问题肯定是第一次下载虚拟机把之前的注册表覆盖了,网卡找不到,首先卸载VMware 并且将C\ProgramData下的VMware文件夹删除掉 ,下载cceaner,点击注册表清除干净,再 ...

  7. python bs4库

    Beautiful Soup parses anything you give it, and does the tree traversal stuff for you. BeautifulSoup ...

  8. cgroup代码浅析(1)

    前置:这里使用的linux版本是4.8,x86体系. cgroup_init_early(); 聊这个函数就需要先了解cgroup. cgroup概念 这个函数就是初始化cgroup所需要的参数的.c ...

  9. JAVA基础——集合浅析

    Java  集合      数组是一种很常见的数据结构,开始接触编程的时候多数程序都和数组相关.刚开始接触Java时也是一直使用数组写一些程序,后来越来越觉得数组这东西没法满足需求了,这时一位“前辈” ...

  10. uint8_t、uint16_t、uint32_t是啥?

    最近在做一个简单的按键检测,定义一个uint8_t的函数,函数作用是返回一个按键编号数字. 函数返回值 return 1/2/3/4,代表4个按键 但是按键检测结果却是错误的!!! 百思不得其解,后来 ...