liu_runda出的题再次$\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%$

题解

题目中为什么反复强调简单路径,没有环

没有环的图中点数-边数=联通块数

前缀和维护边的前缀和,和点的前缀和,

在维护边的前缀和不好维护转化为横着边前缀和,竖着边前缀和

注意边的边界问题

看边如何维护

就拿我的举例

你在当前为边且当前左面为边时置为1

那么当你统计答案时

        ll bia=bianheng[x2][y2]-bianheng[x1-1][y2]-bianheng[x2][y1]+bianheng[x1-1][y1];

思考我们统计答案时要把x2相连的边切断

类似的,我们维护竖着的边时也要类似操作

代码

#include<bits/stdc++.h>
using namespace std;
#define ll int
#define A 2101
char s[A][A];
ll vis[A][A],stax[4200000],stay[4200000],dian[A][A],bianheng[A][A],bianshu[A][A];
ll cnt=0,n,m,q;
const ll nowx[5]={0,0,0,1,-1};
const ll nowy[5]={0,1,-1,0,0};
void dfs(ll x,ll y,ll x1,ll y1,ll x2,ll y2){
vis[x][y]=cnt;
// printf("x=%lld y=%lld vis=%lld\n",x,y,vis[x][y]);
for(ll i=1;i<=4;i++){
ll xnow=x+nowx[i],ynow=y+nowy[i];
if(xnow>x2||xnow<x1) continue;
if(ynow>y2||ynow<y1) continue;
if(s[xnow][ynow]-'0'==0) continue;
if(vis[xnow][ynow]) continue;
dfs(xnow,ynow,x1,y1,x2,y2);
}
}
void bfs(ll x1,ll y1,ll x2,ll y2){
cnt=0;
for(ll i=x1;i<=x2;i++)
for(ll j=y1;j<=y2;j++){
if(s[i][j]=='1'&&!vis[i][j]){
++cnt;
dfs(i,j,x1,y1,x2,y2);
}
}
for(ll i=x1;i<=x2;i++)
for(ll j=y1;j<=y2;j++){
vis[i][j]=0;
}
printf("%d\n",cnt);
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(ll i=1;i<=n;i++){
scanf("%s",s[i]+1);
}
// memset()
for(ll i=1;i<=n;i++)
for(ll j=1;j<=m;j++){
if(s[i][j]=='1'&&s[i][j-1]=='1'){
bianheng[i][j]++;
}
if(s[i][j]=='1'&&s[i-1][j]=='1'){
bianshu[i][j]++;
}
if(s[i][j]=='1'){
dian[i][j]++;
}
}
for(ll i=1;i<=n;i++)
for(ll j=1;j<=m;j++){
bianheng[i][j]=bianheng[i][j]+bianheng[i-1][j]+bianheng[i][j-1]-bianheng[i-1][j-1];
bianshu[i][j]=bianshu[i][j]+bianshu[i-1][j]+bianshu[i][j-1]-bianshu[i-1][j-1];
dian[i][j]=dian[i][j]+dian[i-1][j]+dian[i][j-1]-dian[i-1][j-1];
}
// for(ll i=1;i<=n;i++,puts(""))
// for(ll j=1;j<=m;j++){
// printf("bian=%d ",bianheng[i][j]);
// }
for(ll i=1,x1,x2,y1,y2;i<=q;i++){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
ll bia=bianheng[x2][y2]-bianheng[x1-1][y2]-bianheng[x2][y1]+bianheng[x1-1][y1];
// printf("%d %d %d %d bia=%d\n",bianheng[x2][y2],bianheng[x1-1][y2],bianheng[x2][y1],bianheng[x1-1][y1-1],bia);
bia+=bianshu[x2][y2]-bianshu[x1][y2]-bianshu[x2][y1-1]+bianshu[x1][y1-1];
// printf("%d %d %d %d bia=%d\n",bianshu[x2][y2],bianshu[x1][y2],bianshu[x2][y1-1],bianshu[x1-1][y1-1],bia);
ll dia=dian[x2][y2]-dian[x1-1][y2]-dian[x2][y1-1]+dian[x1-1][y1-1];
printf("%d\n",dia-bia);
}
}

题解

其实就是求逆序对,然而逆序对是$n*log$的并不能过,思考优化

我们发现其实它给了多段等差数列,

先看所有等差数列都是完整的情况

我们在同一段等差数列上可以由$x[i-1]$推到$x[i]$思考我们找的是比当前大的个数,$x[i]=x[i-1]+a$所有之前等差数列贡献都要减一

那么设之前贡献$tmp$得到当前贡献$tmp-cnt(等差数列个数)$

那么我们思考$<a$(即等差数列首项)怎么维护,我们拿一个树状数组维护$<a$的所有值

假设当前值为$x$那么逆序对数就是$i-sum(x)-1$

然后我们考虑第一段不是完整的

假设当前$x$转移到$x2$中$x,x2$都比$begin$小那么等差数列上所有小于$begin$贡献都要减一(头一段上没有处于$x$--$x2$数不能转移)

若当前已经比$begin$大了把它当成一个正常等差数列

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 111111
ll c[A];
ll tus,n,a,mod,now,cnt=0,ans=0,last,tmp;
void add(ll x,ll u){
for(ll i=x;i<=a;i+=i&-i)
c[i]+=u;
}
ll sum(ll x){
ll ans=0;
for(ll i=x;i>=1;i-=i&-i)
ans+=c[i];
return ans;
}
int main(){
scanf("%lld%lld%lld%lld",&n,&tus,&a,&mod);
ll now=tus;
if(tus<=a){
add(tus+1,1);
}
for(ll i=2;i<=n;i++){
now=(a+now)%mod;
if(now<a){
tmp=i-sum(now+1)-1;
cnt++;
add(now+1,1);
}
else{
tmp-=cnt;
if(now<tus) tmp++;
}
ans+=tmp;
}
printf("%lld\n",ans);
}

NOIP模拟测试20「周·任·飞」的更多相关文章

  1. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  2. NOIP模拟测试30「return·one·magic」

    magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...

  3. NOIP模拟测试16「Drink·blue·weed」

    话说这次考试 Drink 非常棒的一道卡常练习题,适合练习卡常 真的很棒 前置卡常知识 1.char要比int快 char是最快的 输出putchar,输入getchar 在这个题快了7000豪 2. ...

  4. NOIP模拟测试4「礼物·通讯·奇袭」

    礼物. 首先见到期望一定要想dp,看到n的范围无脑想状压, 然后我就只想到这了. dp方程式还是比较好想的,但是我依然想不出来 略经思考   颓题解 依然不会,随便写了个式子 i状态中不含j $f[i ...

  5. NOIP模拟测试38「金·斯诺·赤」

    金 辗转相减见祖宗 高精 #include<bits/stdc++.h> using namespace std; #define A 2000 #define P 1 #define N ...

  6. NOIP模拟测试28「阴阳·虎·山洞」

    写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方 ...

  7. NOIP模拟测试23「mine·water·gcd」

    mine 题解 一道比较水的dp 考试因为初始化挂掉了只有$80$分 代码有注释 #include<bits/stdc++.h> using namespace std; //无脑dp # ...

  8. NOIP模拟测试9「随·单·题」

    liu_runda出的题,先$\%\%\%\%\%\%\%\%\%\%\%$为敬 随 考试时没有Qj 然后甚至没做,甚至没交 我不知道我怎么想的 这个题挺难改 你需要用到 循环矩阵快速幂,矩阵快速幂优 ...

  9. noip模拟测试20

    考试总结:这次考试,我非常真实地感觉到了自己能力的提高,具体来说,在之前的考试中,读完题之后我只会想到暴力的思路,甚至有的题连暴力都打不出来,但是这次在考场上我已经有了自己的一些想法,有了一个深入思考 ...

随机推荐

  1. postman Variables变量的详解与应用

    变量 变量类型(按照作用域划分) 全局变量(全局环境里面的变量) 集合变量(请求集合里声明的变量) 自定义环境变量 数据变量(在runner时文件变量) 本地变量 变量权重类型 全局变量 < 集 ...

  2. .NET之生成数据库全流程

    开篇语 本文主要是回顾下从项目创建到生成数据到数据库(代码优先)的全部过程.采用EFCore作为ORM框架. 本次示例环境:vs2019.net5.mysql 创建项目 本次事例代码是用过vs2019 ...

  3. Java容器 | 基于源码分析List集合体系

    一.容器之List集合 List集合体系应该是日常开发中最常用的API,而且通常是作为面试压轴问题(JVM.集合.并发),集合这块代码的整体设计也是融合很多编程思想,对于程序员来说具有很高的参考和借鉴 ...

  4. linux下将一个大的文件拆分成若干小文件

    命令:split,例子: 以行数拆分 -l参数: split –l 50 原始文件 拆分后文件名前缀 说明:以50行对文件进行拆分,最后一个文件的行数没有50行以实际行数进行分配,比如有一个名为 wl ...

  5. 2020BUAA 软工-结对作业

    结对作业 项目 内容 北航2020软工 班级博客 作业要求 具体要求 1.在文章开头给出教学班级和可克隆的 GitHub 项目地址(例子如下).(1') 教学班级 005 项目地址 GitHub 2. ...

  6. golang:面向对象总结

    所谓的面向对象其实就是找一个专门做这个事的人来做,不用关心具体怎么实现的.所以说,面向过程强调的是过程,步骤.而面向对象强调的是对象,也就是干事的人. Go语言:面向对象语言特性 方法 嵌入 接口 没 ...

  7. vmware快捷键大全

    初学linux的朋友往往需要使用VMware这个软件 与其打交道多了 越来越觉得快捷键的重要性 特将搜集到的快捷键记录以便查阅记忆 Ctrl-Alt-Enter 进入全屏模式 ctrl+alt+ins ...

  8. Docker——安装部署

    前言 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE. Docker CE 即社区免费版,Docker EE 即企业版,强调安 ...

  9. 11.16-18 lsci、ipcs、ipcrm:清除ipc相关信息

    lspci:显示所有PCI设备 lspci命令用来显示系统中的所有PCI总线设备或是连接到该总线上的所有设备. lspci命令的参数选项及说明 -v     显示详细信息 -vv    显示更详细的信 ...

  10. python 解析html网页

    pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,使用方法: 代码如下: from pyquery import PyQuery as pq 1.可加载一段HTML字符串 ...