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);
}

转载于:https://www.cnblogs.com/znsbc-13/p/11366198.html

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模拟测试21「折纸·不等式」

    折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...

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

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

  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模拟测试17「入阵曲·将军令·星空」

    入阵曲 题解 应用了一种美妙移项思想, 我们先考虑在一维上的做法 维护前缀和$(sum[r]-sum[l-1])\%k==0$可以转化为 $sum[r]\% k==sum[l-1]\%k$开个桶维护一 ...

  9. NOIP模拟测试11「string·matrix·big」

    打的big出了点小问题,maxx初值我设的0然后少了10分 第二题暴力打炸 第一题剪了一些没用的枝依然40分 总分70 这是一次失败的考试 string 想到和序列那个题很像,但我没做序列,考场回忆学 ...

最新文章

  1. 从某一日期开始过day天的日期
  2. Android之独孤口诀:之强大的“测试单元”
  3. user exits, customer exits, badi
  4. linux下elasticsearch 安装、配置及示例
  5. UIButton的竖排图片和文本
  6. 【摘录】Android2.3所支持语言的列表
  7. MVC3.0与C#截取字符串
  8. Spring + Ibatis + MySql实例详解
  9. 金山盛大成立合资公司
  10. 【Jmeter】Jmeter使用教程
  11. jqueryeasyui 事件方法onChange(),onSelect()
  12. 极米H5值得入手吗?极米H5实际体验如何?画面对比实测
  13. matlab 三分之一倍频程,三分之一倍频程谱
  14. Java 开发验证码。随机产生一个四位数的验证码,每位数可能是数字、大写字母或小写字母。
  15. Ant Design删除操作弹出对话框
  16. ffmpeg webm 提取_ffmpeg简单使用教程 转码、压制、提取、截取、合并、录屏等
  17. 【MySQL】 DATE_FORMAT() 格式化时间
  18. 吾父马达加斯加之旅-2
  19. linux 下查看网速
  20. iso16949是什么管理体系

热门文章

  1. Final Cut Pro X如何去视频水印/视频去水印
  2. Maven的maven-install-plugin插件详解
  3. JDK 命令之 jar -- 压缩/解压缩工具
  4. MySQL命令之show用法详解
  5. HH SaaS电商系统的销售订单毛利润设计
  6. python中的range_python中range()与xrange()用法分析
  7. oracle 查看内存参数配置,Oracle内存参数配置及版本问题
  8. mysql uroot e_批量 kill mysql 连接
  9. java鼠标左键按下后拖动实现多选_鼠标拖拽多选功能
  10. 工业级以太网交换机具有哪些优越特性