平时二十二测

第一题水题未放,今天第二题又读入超时2000*2000的读入要快读啊,上次没长教训

第二题:

图论题.二维前缀和的应用.

最重要的:

这就是一棵树啊

标算为:对于不包含环的图,连通块数目=点数-边数,所以利用二维前缀和进行预处理,O(1)求出矩形区域内的边数和点数.

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2005;
int sum[maxn][maxn], row[maxn][maxn], line[maxn][maxn], a[maxn][maxn];
int read(){
    int x = 0; int f = 1; char c = getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c<=‘9‘&&c>=‘0‘){x=x*10+c-‘0‘;c=getchar();}
    return x*=f;
}
char s[2005];

int main(){
    freopen("duty.in","r",stdin);
    freopen("duty.out","w",stdout);
    int N = read(), M = read(), Q = read();
    for(int i = 1; i <= N; i++){
        scanf("%s", s);

        for(int j = 1; j <= M; j++){
            a[i][j] = s[j - 1] -‘0‘;
            sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];
        }
    }

    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= M; j++) {
            if(a[i][j] && a[i+1][j]) line[i][j]++;
            line[i][j] += line[i][j - 1];
        }
    for(int i = 1; i <= N; i++)//?
        for(int j = 1; j <= M; j++) line[i][j] += line[i - 1][j];

    for(int j = 1; j <= M; j++)
        for(int i = 1; i <= N; i++) {
            if(a[i][j] && a[i][j+1]) row[i][j]++;
            row[i][j] += row[i - 1][j];
        }
    for(int j = 1; j <= M; j++)
        for(int i = 1; i <= N; i++) row[i][j] += row[i][j - 1];
    while(Q--){
        int xl = read(), yl = read(), xr = read(), yr = read();
        int point = sum[xr][yr] - sum[xr][yl-1] - sum[xl-1][yr] + sum[xl-1][yl-1];
        int edge1 = line[xr-1][yr] - line[xr-1][yl-1] - line[xl-1][yr] + line[xl-1][yl-1];
        int edge2 = row[xr][yr-1] - row[xr][yl-1] - row[xl-1][yr-1] + row[xl-1][yl-1];
        //printf("%d %d %d\n", edge1, edge2, point);
        printf("%d\n", point - edge1 - edge2);
    }

}

第三题:

推性质:答案就是x[1],x[2]…x[n]这个序列的逆序对个数.

采用经典的树状数组或分治法在O(nlogn)的时间内求出逆序对数目即可.

可以得到n<=100000时的40分.

x[1]=a的数据告诉我们,x[i]=i*a%mod

假设x[i]=x[i-1]+a(也就是x[i-1]+a<mod),且x[i-1]和前面所有数字形成了m个逆序对,同时,除去x[i-1]和x[i]所在的等差数列,x[i]前面的所有数字可以分成k段等差序列,那么x[i]将和前面所有数字组成m-k个逆序对.

原因在于:每段等差序列中必然有一个数字和x[i-1]能组成逆序对,但不能和x[i]组成逆序对.那么每段等差数列的贡献都会减1.

因此我们可以O(1)从x[i-1]的贡献得到x[i]的贡献.

如果x[i]<a,不存在对应的x[i-1],我们需要直接计算它的贡献.前面有i-1个数字,我们数出有多少个数字不产生贡献(即小于x[i]的数字个数),即可求出有多少个数字形成了逆序对.用树状数组维护小于a的所有数值,可以在O(loga)的时间内完成一次这样的计算.小于a的数字至多有a个,所以这一部分的时间复杂度为O(aloga),空间复杂度为O(a)

总的时间复杂度为O(aloga+n)

可以得到x[1]=a的20分.

算法7:

算法6几乎就是满分做法了.现在x[1]!=a,我们只需针对最开始的一段不完整等差数列加一些特判就可以通过本题.

可以得到100分.

算法8:

实际上存在更加优越的算法,复杂度为O(aloga),不需要带有一个O(n)

考虑算法6,7中我们都把整个序列划分为了O(a)段.实际上同一段中所有元素的贡献是一个等差数列的形式,可以直接求和.细节可能较多.

#include<bits/stdc++.h>
using namespace std;
const int M = 1e5 + 5;
int c[M], a;

int query(int x){
    int ret = 0;
    x++;
    for( ; x; x -= x&(-x)) ret += c[x];
    return ret;
}
void add(int x){
    x++;
    for(; x <= a; x += x&(-x)) c[x]++;
}

int main(){
    freopen("fly.in","r",stdin);
    freopen("fly.out","w",stdout);
    int n, mod, x1;
    long long ans=0;
    scanf("%d%d%d%d",&n,&x1,&a,&mod);
    int x = x1;
    int del = 0, cir = 0;
    for(int i = 1; i <= n; i++){
        if(x >= a){
            del -= cir;
            if(x < x1) del++;
            ans += del;
        }
        else {
            del = (i-1) - query(x);
            ans += del;
            add(x);
        }
        x += a;
        if(x >= mod){
            cir++; x -= mod;
        }
    }
    printf("%lld\n",ans);
} 

今天题难度还不错,但一天考两次我真的受不了了

原文地址:https://www.cnblogs.com/EdSheeran/p/9897518.html

时间: 2024-11-13 09:39:16

平时二十二测的相关文章

JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中,也是能看到他的,所以还是非常值得去学习的一个知识点的,我们直接开车了 一.Map概述 泛型< k,v> 键值对,映射关系 基本特点 该集合存储键值对,是一对一对往里存,而且要保证键的唯一性 1.添加 put(key ,values) putAll() 2.删除 clear() remove(ob

【管理心得之二十二】小人物 仰视 大授权

场景再现====================Boss:小王,来我办公室一下.小王: 嗯Boss:近期总公司有会,需要到外地出差几日.我不在的这段期间里,公司大小事务你帮忙处理一下.          如果有什么难决定的事,第一时间电话.邮件联系我商定即可.小王:  明白.放心吧领导,绝不会让你失望的Boss:嗯,那就好,没事了. {小王走出办公室} 心中暗喜,"难道这就是传说中的授权,Boss不在的时候,我岂不是最高权力的行使者." ==================== 从场景

QT开发(二十二)——QMainWindow主窗口

QT开发(二十二)--QMainWindow主窗口 一.主窗口简介 应用程序中的主窗口是与用户进行长时间交互的顶层窗口,提供了应用程序的大部分功能,通常是应用程序启动后的第一个窗口,应用程序一般由一个主窗口和多个对话框组成. QT中直接支持主窗口,QMainWindow是QT中主窗口的基类,是继承于QWidget类的容器型组件. QMainWindow内部封装了菜单栏.工具栏.中心组件.停靠组件.状态栏等. QMainWindow内置了布局管理器,基本的组件布局如下: 二.菜单栏 QT中提供了预

《Programming in Lua 3》读书笔记(二十二)

日期:2014.8.6 PartⅣ The C API 26 Extending Your Application 使用Lua很重要的一点是用来做配置语言.配合主语言做一些功能的配置. 26.1 The Basics 有的时候程序需要配置一些功能信息,很多时候可能有许多别的方法比用lua做配置要更简单:如使用环境变量或者读取文件,读取文件涉及到文件的解析.如果使用Lua进行配置的话,相当于用lua文件替代了要读取的如csv.txt文件等. 使用Lua进行配置的时候,就需要使用Lua API去控制

企业搜索引擎开发之连接器connector(二十二)

下面来分析线程执行类,线程池ThreadPool类 对该类的理解需要对java的线程池比较熟悉 该类引用了一个内部类 /** * The lazily constructed LazyThreadPool instance. */ private LazyThreadPool lazyThreadPool; 该成员实现了单例模式,即该对象只有一个实例,属于懒汉式单例模式,当实例化该成员时,启用了线程同步机制 /** * Shut down the {@link ThreadPool}. Afte

每日算法之二十二:Swap Nodes in Pairs

Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm should use only constant space. You may not modify the values in the list, on

攻城狮在路上(叁)Linux(二十二)--- linux磁盘挂载与卸载 mount umount

挂载就是将文件系统与目录结合的操作.挂载点就是目录,该目录就是进入分区或文件系统的入口. 一.挂载前的注意事项: 1.单一文件系统不应该被重复挂载在不同的挂载点中. 2.单一目录不应该重复挂载多个文件系统. 3.即将作为挂载点的目录理论上应该都是空目录才对. 注意:对应2和3,如果要挂载的目录不为空,那么挂载了新的文件系统之后,原来的目录会暂时消失(并非覆盖掉),系统会显示最新挂载的文件系统.新分区被卸载之后,原来的文件系统会重新显示出来. 二.命令介绍 mount [-t 文件系统] [-L

爪哇国新游记之二十二----算术表达式计算求值

代码: import java.util.ArrayList; import java.util.List; // 辅助类 class Item{ String value; boolean isNumber; public Item(String value,boolean isNumber){ this.value=value; this.isNumber=isNumber; } public Item(char c,boolean isNumber){ this.value=String.

Android学习路线(二十二)运用Fragment构建动态UI——构建一个灵活的UI

先占个位置,下次翻译 :p When designing your application to support a wide range of screen sizes, you can reuse your fragments in different layout configurations to optimize the user experience based on the available screen space. For example, on a handset devi

Java Web总结二十二投票系统

投票系统需求: (1)查询所有候选人基本信息 (2)查询某位候选人详细信息 (3)投票人登录和退出 (4)投票人限制1分钟之内重复投票 (5)投票人IP和最后投票时间查询 (6)阻止相同用户名二次在线登录 (7)票数条形显示和候选人头像处理 (8)显示投票人归属地 (9)热门候选人,即投票数最多 (10)后台管理员登录 可选需求: (11)查询.删除.更新.增加候选人详细信息 (12)与一个Listener,创建所有表格式和初始化数据 代码参见:day19/vote(此处不上传) Java We