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. 浅尝js垃圾回收机制

    局部作用域内的变量,在函数执行结束之后就会被js的垃圾回收机制销毁   为什么要销毁局部变量? => 为了释放内存   js垃圾回收机制何时会销毁局部变量 : 如果局部变量无法再得到访问,就会被 ...

  2. 前端的MySQL基础

    前端MySQL 一.引言 MySQL是一个关系型数据库管理系统,在Web应用方面,MySQL是最好的应用之一.其主要的他点是体积小.速度块.总体成本低.源码开放 二.MySQL的构成 在我们开始学习M ...

  3. 041.Python守护进程,锁信号量和事件

    一 守护进程 1.1 基本概念 守护进程 正常情况下,主进程默认等待子进程调用结束之后结束 守护进程在主进程执行代码结束后,自动终止 守护进程语法: 进程对象.daemon = True ,设置该进程 ...

  4. lua中求table长度--(转自有心故我在)

    关于lua table介绍,看以前的文章http://www.cnblogs.com/youxin/p/3672467.html. 官方文档是这么描述#的: 取长度操作符写作一元操作 #. 字符串的长 ...

  5. Nginx实战部署常用功能演示(超详细版),绝对给力~~~

    前言 上次分享了一些开发过程中常用的功能,但如果到真实环境中,其实还需要一些额外的配置,比如说跨域.缓存.配置SSL证书.高可用等,老规矩,还是挑几个平时比较常用的进行演示分享.上篇详见Nginx超详 ...

  6. centOS 7-Hadoop3.3.0完全分布式部署

    本文内容不乏对各大佬的案例借鉴,侵删. 本次实验用到的有虚拟机,Xshell,Hadoop压缩包和jdk压缩包   hadoop111A:192.168.241.111 hadoop222B:192. ...

  7. python 获取当天和前几天时间数据

    python 获取当天和前几天时间数据 import datetime from datetime import datetime, date, timedelta def dayDateRange( ...

  8. 端到端TVM编译器(上)

    端到端TVM编译器(上) 摘要 将机器学习引入到各种各样的硬件设备中.AI框架依赖于特定于供应商的算子库,针对窄范围的服务器级gpu进行优化.将工作负载部署到新平台,例如手机.嵌入式设备和加速器(例如 ...

  9. 多级中间表示概述MLIR

    多级中间表示概述MLIR MLIR项目是一种构建可重用和可扩展的编译器基础结构的新颖方法.MLIR旨在解决软件碎片,改善异构硬件的编译,显着降低构建特定于域的编译器的成本以及帮助将现有编译器连接在一起 ...

  10. TensorRT 3:更快的TensorFlow推理和Volta支持

    TensorRT 3:更快的TensorFlow推理和Volta支持 TensorRT 3: Faster TensorFlow Inference and Volta Support 英伟达Tens ...