NOIP 2012 Day2

tags:

  • 扩展欧几里得
  • 二分答案
  • 查分
  • 倍增
  • 二分答案
  • 贪心
  • NOIP
    categories:
  • 信息学竞赛
  • 总结

同余方程
借教室
疫情控制

同余方程

Solution

  首先同余式可以转化为等式.
\[ax\equiv 1\mod b\Leftrightarrow ax+by=1\]
  根据扩展欧几里得定理, 对于式
\[ax+by=k(a,b),k\in \mathbf{R}\]一定存在整数解.然而题面说一定存在解, 也就是说\((a,b)=1\), 然后就可以利用扩展欧几里得递归求得一组解.利用这组解加上取模, 就可以获得最小整数解.

Code

#include<cstdio>
void exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1,y=0;return ;
    }
    exgcd(b,a%b,y,x);
    y-=x*(a/b);
}

int main(){
    int a,b,x,y;
    scanf("%d%d",&a,&b);
    exgcd(a,b,x,y);
    printf("%d",(x%b+b)%b);
    return 0;
}

借教室

Solution

  可以发现近些年 NOIP 总是出二分答案的题.
  其实就是给出一些操作, 每次对一定区间减去一个数, 求在哪次操作之后产生了负数.然而可以用线段树强行做, 也可以用一些巧妙一点的办法.

  • 线段树, 只需要有区间加操作和查询区间最小值操作, 一般线段树可以拿到95分, 还可以用可以各种卡常技巧, zkw线段树或者是标记永久化来加快.
  • 二分一个值\(\text{T}\), 表示前\(\text{T}\)次借教室后会不会出现不合法情况(即某天教室只剩下负数间), 然后用差分借完\(T\)次教室后每一天剩下的教室数.这个一般情况是不会被卡的.注意对于答案的记录.

Code

#include<cstring>
#include<cstdio>
#define N 1000055
#define inf 0x3f3f3f3f
#define int long long
struct Node{
    int l,r,s;
    void init(){scanf("%lld%lld%lld",&s,&l,&r);}
}s[N];

int n,m,d[N];
int qi[N];
int ans;

int min(int a,int b){
    return a<b?a:b;
}

bool check(int tim){
    qi[0]=0;
    for(int i=1;i<=n;++i)
        qi[i]=d[i]-d[i-1];
    for(int i=1;i<=tim;++i)
        qi[s[i].l]-=s[i].s,qi[s[i].r+1]+=s[i].s;
    int he=0;
    for(int i=1;i<=n+1;++i){he+=qi[i];if(he<0){ans=min(ans,tim);return false;}}
    return true;
}

main(){
    ans=inf;
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;++i)
        scanf("%lld",&d[i]);
    for(int i=1;i<=m;++i)
        s[i].init();
    int l=1,r=m,mid;
    while(l<=r){
        mid=(l+r)>>1;
        if(!check(mid))
            r=mid-1;
        else l=mid+1;
    }
    if(l>=m)
        printf("0");
    else printf("-1\n%lld",ans);
    return 0;
}

疫情控制

  并不是很明白为什么一天会出两道二分答案的题目...
  首先二分一个值\(\text{T}\), 表示在\(\text{T}\)时刻内能封锁这棵树
  还是有一个很重要的贪心策略, 就是一个点在到达根节点之前总是越往上走越好.然后根据倍增确定出每个点在给定时间\(\text{T}\)所到达的最高点(根节点为终点). 必然有一些点到达不了根节点, 那么就让它来控制这个点; 必然有在不同时间到达根节点的点, 这些点可以去控制根节点的不同没被控制的子树; 所以最后找出所有没有被控制的树点能到达根节点的军队进行贪心即可.
  细节太多了, 很讨厌呐.

原文地址:https://www.cnblogs.com/qdscwyy/p/8728111.html

时间: 2024-10-08 18:54:35

NOIP 2012 Day2的相关文章

NOIP 2012 提高组 DAY1 T2 国王游戏

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每 位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大臣,所获奖赏尽可能的少

NOIP 2012 题解

[D1T1vigenere密码] P1778vigenere密码 Accepted 标签:[显示标签] 描述 16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法--Vigenère密码.Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用M表示:称加密后的信息为密文,用C表示:而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为k. 在Vigenère

【NOIP 2012 国王游戏】 贪心+高精度

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每 位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大臣,所获奖赏尽可能的少

NOIp 2013 Day2 解题报告

NOIp 2013 Day2 解题报告 1.   积木大赛 每次只要选取连续最大的一段区间即可. 继续归纳可得,答案为∑i=1nmax{0,hi-hi-1} 复杂度O(N) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable/

扩展欧几里得模板(洛谷1082 同余方程NOIP 2012 提高组 第二天 第一题)

题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围] 对于 40%的数据,2 ≤b≤ 1,000: 对于 60%的数据,2 ≤b≤ 50,000,000: 对于 100%的数据,2 ≤a, b≤ 2,000,000,000

NOIP 2015 DAY2

跳石头 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石).在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达 终点. 为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳 跃距离尽可能长.由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能 移走起点和终点的岩石). 输入输出格式

NOIP 2012 Day1

tags: NOIP 模拟 倍增 高精 Python categories: 信息学竞赛 总结 Luogu P1079 Vigenère 密码 Solution 表示并不是很懂其他人发的题解. 我是这么想的, 既然是题目要求用密文转明文而且转换规则一定的, 所以就可以用明文转密文的逆过程来完成. 首先要搞明白明文是怎么变成密文的, 通过这个表可以观察到, 如果明文的一个字符是 ch1 ,密钥为 ch2 , 那么密文 ch3 对应的就是 ch1 在字母表中偏移 |ch2| 位, 例如 \(\tex

NOIP 2012 第一试 模拟题 魔法树 solution

题意 Solution 压位+前缀和 1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include <algorithm> 5 #define ll int 6 using namespace std; 7 const ll mod=100000007; 8 inline void read(ll &k) 9 { 10 ll f=1;char c=getchar();k

Codevs 3578 无线网络发射器选址== NOIP 2014 Day2 T1

3578 无线网络发射器选址 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 白银 Silver 题目描述 Description 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的 129 条东西向街道和 129 条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值 1 .东西向街道从北到南依次编号为0,1,2…128,南北向街道从西到东依次编号为 0,1,2…128. 东西向街道和南北向街