10 01模拟赛订正

好吧,这是我第一次写模拟赛的订正,主要是有时间而且这次的题确实好...

第一题确实好,用的算法人人都会,就是看你能不能想到,我考只打了O(n^4)的暴力,最后还苦逼的MLE,爆零了...

暴力就不多说了...枚举两个点更新其他的点...

其实我考场上思考的是,能被标记的点都与其他的点有什么联系,可惜,除了模拟题目的做法,就不会了...

那让我们就认真地思考一发:我们设A(x1,x2),B(x2,c2),C(x3,c3)来更新D点,只有:有两个点横坐标相等,有两个点纵坐标相等,才可以更新出来一个新的点...

那我们看更新之后又出现了什么结果,还是有两个点横坐标相等,有两个点纵坐标相等,这是就要思考了或许我们不必枚举点,而应该在行列之间大做文章...

之后,根据网格题的经验,我们就连边,即点A被标记,那我们将行列连边,之后,我们在手玩一下A,B,C点就会发现,点D的行列已经联通了...而这就用到了并查集...

其实我们再想想就知道为什么会是这样的,因为每个被标记的点都其实提供一种行与列的关系,当两个对角线的点出现时,目标点的x与y都已经被代表,而此时再出现一个顶点,就将目标点的行列联通了...

而这里有体验到了并查集的魅力,即维护关系的合并与查询,而这种关系则需要我们慧眼挖掘...

还有网格题的行列建图则也是一种好的思路,因为图论中大量的算法我们就能利用了...

#include<bits/stdc++.h>
using namespace std;
const int N=5100;
int f[N*2],n,m,q,sum[N][N];
inline int read()
{
    int x=0,ff=1;
    char ch=getchar();
    while(!isdigit(ch)){if(ch==‘-‘) ff=-1;ch=getchar();}
    while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*ff;
}
inline int getf(int k) {return f[k]==k?k:(f[k]=getf(f[k]));}
int main()
{
    freopen("grid.in","r",stdin);
    freopen("grid.out","w",stdout);
    n=read();m=read();q=read();
    for(register int i=1;i<=n*2;++i) f[i]=i;
    for(register int i=1;i<=m;++i)
    {
        int x=read(),y=read()+n;//将列+n
        int t1=getf(x);
        int t2=getf(y);
        if(t1!=t2) f[t1]=t2;
    }
    for(register int i=1;i<=n;++i)
        for(register int j=1;j<=n;++j)
        {
            int t1=getf(i);
            int t2=getf(j+n);
            if(t1==t2) sum[i][j]++;
            sum[i][j]+=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1];
        }
    for(register int i=1;i<=q;++i)
    {
        int r1=read(),c1=read();
        int r2=read(),c2=read();
        printf("%d\n",sum[r2][c2]-sum[r2][c1-1]-sum[r1-1][c2]+sum[r1-1][c1-1]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/gcfer/p/11782374.html

时间: 2024-11-08 23:49:01

10 01模拟赛订正的相关文章

10.2模拟赛总结

10.2 模拟赛总结 T1. 数位dp: 一个非常非常非常非常显然的数位 DP \([L,R] = [1,R]-[1,L-1]\) 所以是分别求两次小于等于某个数字的方案数 \(f(i,j,k)\) 表示从低位数起的第 \(i\) 位,按照规则计算后答案为 \(j\quad (j=0,1)\) \(k\) 表示只考虑后面结尾和 \(lmt\)后面几位 的大小关系 \((k=0,1)\) 考虑第 \(i+1\) 位,算一下新构成的数字并判断下大小就可以了 注意到 \(L,R\) 数据范围特别大,需

10.22 模拟赛

10.22 模拟赛 T1 染色 考虑每个连通块删成一棵树就好了. mmp场上就我路径压缩写炸.... #include<iostream> #define MAXN 200006 using namespace std; int n , m; int fa[MAXN] , siz[MAXN] , book[MAXN] , sz[MAXN]; int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); } int main() {

10.31 模拟赛

10.31 模拟赛 A LIS 考虑每个数字前从 $ m $ 降序构造到 $ a_i $ 即可. #include <iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<vector> using namespace std; #define MAXN 300006 int n , m , k; int A[MAXN]; vector<int&g

10.5模拟赛

这么多模拟赛都没整理,能整理一天算一天吧qaq T1题面 sol:应该不难吧,分别对横坐标和纵坐标取差的绝对值,易知:如果互质就可以看到,否则就不行.然后出题人很毒瘤要用unsigned long long. #include <cstdio> #include <algorithm> using namespace std; long long x1,y1,x2,y2,c1=0,c2=0; unsigned long long x,y; unsigned long long AB

1015&amp;&amp;1017模拟赛订正题解

1015 反正这两次的模拟赛都不太会写吧 感觉越来越dl 今天初赛 真好 T1 反正题目给你excatalan 提醒你是卡特兰数了 m=0 的情况 你发现就是卡特兰 那么考虑 m为任意数字的 方法 显然 我们需要知道卡特兰数的证明方法 其实昨天探讨的时候 想了更多方法 有必要解决这样的问题 首先证明方法有折线法 由折线法 我们不妨引出 另外一种证明思想 卡特兰数对应的 问题模型都是 在第K次执行 操作2的时候 操作1都是至少执行了K次 那么我们用x轴表示 当前的操作次数 一共需要2n次 然后把操

2019.10.24模拟赛赛后总结

本文原创,如果有不到位的地方欢迎通过右下角的按钮私信我! A.Icow Player 题目描述 被无止境的农活压榨得筋疲力尽后,Farmer John打算用他在MP3播放器市场新买的iCow来听些音乐,放松一下.FJ的iCow里存了N(1 <= N <= 1,000)首曲子,按1..N依次编号.至于曲子播放的顺序,则是按一个Farmer John自己设计的算法来决定: * 第i首曲子有一个初始权值R_i(1 <= R_i <= 10,000). * 当一首曲子播放完毕,接下来播放的

2104.10.29模拟赛【奶牛编号】

2.奶牛编号 [问题描述] 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛.      然而,他有点迷信,标识奶牛用的二进制数字,必须只含有K位“1” (1 <= K <= 10). 当然,每个标识数字的首位必须为“1”.      FJ按递增的顺序,安排标识数字,开始是最小可行的标识数字 (由“1”组成的一个K位数).      不幸的是,他没有记录下标识数字.请帮他计算,第N个标识数字 (1 <= N <= 10^7). [输入] 第1行:空格隔开的两

10.1 模拟赛

由于算错了inf 又ak失败了 过于菜 T1 年轮蛋糕 loj 2758 题目大意: n个数构成的环 把这个环分成三段 使最小的最大 求这个最小段的和的最大值 思路: 可以想到二分 因为log方可以过 所以可以二分长度后lower_bound找断点 或者使用滑动窗口 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cma

10.27 模拟赛

这一次终极被吊打 甚至没进前十 T2 最后改错 T3 没写正解 T1 elim 题目大意: n 行 m 列的游戏棋盘,一行或一列上有连续 三个或更多的相同颜色的棋子时,这些棋子都被消除 当有多处可以被消除时,这些地方的棋子将同时被消除 求消除后的棋盘 思路: sb模拟 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cm