首页 > 其他分享 >绝对众数

绝对众数

时间:2023-10-26 21:48:02浏览次数:28  
标签:itl putchar int make 绝对 pos 众数 pair

出现次数大于长度一半的数,一般来讲摩尔投票即可,但是还有神秘做法。

考虑统计每个二进制位上 0/1 的出现次数,如果绝对众数存在,那么它的那一位上一定是出现较多的那个。我们可以 \(O(n\log n)\) 找出可能的答案。注意到出现次数具有可减性,在一些情况下比摩尔投票维护起来更简单。

比如我们换到二维,每次统计一个子矩形里的绝对众数,这个方法就直接对每一位开个前缀和即可。

#include <bits/stdc++.h>

using namespace std;

const int N = 1025, M = 1e6 + 5;

namespace IO{
	inline char gc(){
		static const int Rlen=1<<22|1;static char buf[Rlen],*p1,*p2;
		return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;
	}
	template<typename T>T get_integer(){
		char c;bool f=false;while(!isdigit(c=gc()))f=c=='-';T x=c^48;
		while(isdigit(c=gc()))x=((x+(x<<2))<<1)+(c^48);return f?-x:x;
	}
	inline int read(){return get_integer<int>();}
}using namespace IO;
inline void write(int x){
	if(x==-1){
		putchar('-'),putchar('1'),putchar('\n');
		return;
	}
	static int st[20],top=0;
	while(x) st[++top]=x%10,x/=10;
	while(top) putchar(st[top--]+48);
	putchar('\n');
}

int a[N][N], sum[N][N], n, m, q;
int cnt[M], lx[M], rx[M], ly[M], ry[M], p[M], res[M];
bool vis[M];
vector<pair<int, int> > pos[M];
vector<pair<pair<int, int>, int>> ask[M];

#define mp make_pair

inline int calc(int z, int lx, int ly, int rx, int ry) {
	int res = 0;
	for (int i = lx; i <= rx; ++i) {
		vector<pair<int, int> > :: iterator itl, itr;
		itl = lower_bound(pos[z].begin(), pos[z].end(), make_pair(i, 0));
		itr = upper_bound(pos[z].begin(), pos[z].end(), make_pair(i, 100000000));
		int ll = lower_bound(itl, itr, make_pair(i, ly)) - itl;
		int rr = upper_bound(itl, itr, make_pair(i, ry)) - itl;
		--rr; if (ll <= rr) res += rr - ll + 1;
	} return res;
}

set<int> st;

int tree[N];

inline void add(int x) {
	for (int i = x; i <= m; i += i & -i) ++tree[i]; 
}

inline void del(int x) {
	for (int i = x; i <= m; i += i & -i) tree[i] = 0;
}

inline int query(int x) {
	int res = 0;
	for (int i = x; i; i -= i & -i) res += tree[i];
	return res;
}

inline void calc(int x) {
	if (ask[x].empty()) return ;
	sort(ask[x].begin(), ask[x].end());
	sort(pos[x].begin(), pos[x].end());
	for (int i = 0, j = 0; i < ask[x].size(); ++i) {
		while (j < pos[x].size() && pos[x][j].first <= ask[x][i].first.first) {
			add(pos[x][j].second); ++j;
		} int t = ask[x][i].second;
		if (t < 0) res[-t] -= query(ask[x][i].first.second);
		else res[t] += query(ask[x][i].first.second);
	}
	for (pair<int, int> i : pos[x]) del(i.second);
}

int main() {
	n = read(); m = read(); q = read();
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= m; ++j) {
			a[i][j] = read(), ++cnt[a[i][j]];
			pos[a[i][j]].push_back(make_pair(i, j));
		}
	for (int i = 1; i <= q; ++i) {
		lx[i] = read(); ly[i] = read(); rx[i] = read(); ry[i] = read();
	}
	for (int k = 0; k < 20; ++k) {
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= m; ++j) {
				sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + ((a[i][j] >> k) & 1);
			}
		}
		for (int i = 1; i <= q; ++i) {
			int sm = (rx[i] - lx[i] + 1) * (ry[i] - ly[i] + 1);
			int c1 = sum[rx[i]][ry[i]] - sum[rx[i]][ly[i] - 1] - sum[lx[i] - 1][ry[i]] + sum[lx[i] - 1][ly[i] - 1];
			int c0 = sm - c1;
			p[i] |= (c1 >= c0) << k;
		}
	}
	for (int i = 1; i <= q; ++i) {
		st.insert(p[i]);
		ask[p[i]].push_back(mp(mp(rx[i], ry[i]), i));
		ask[p[i]].push_back(mp(mp(lx[i] - 1, ry[i]), -i));
		ask[p[i]].push_back(mp(mp(rx[i], ly[i] - 1), -i));
		ask[p[i]].push_back(mp(mp(lx[i] - 1, ly[i] - 1), i));
	}
	for (int i : st) calc(i);
	for (int i = 1; i <= q; ++i) {
		int sm = (rx[i] - lx[i] + 1) * (ry[i] - ly[i] + 1);
		if (res[i] * 2 <= sm) puts("-1");
		else printf("%d\n", p[i]);
	}
	return 0;
}

标签:itl,putchar,int,make,绝对,pos,众数,pair
From: https://www.cnblogs.com/wwlwakioi/p/17790462.html

相关文章

  • python当前工作目录和当前文件的绝对路径
    当前文件的绝对路径:这个就是文件在硬盘上的真实路径,从盘符一直到文件所在的具体位置。当前工作目录(currentworkingdirectory)是文件系统当前所在的目录,如果命令没有额外指定路径,则默认为当前工作目录。    importos#当前文件的绝对路径print(os.path.abspath(......
  • JavaScript在发送AJAX请求时,URL的域名地址是使用绝对地址还是相对地址?
    在使用JavaScript发送AJAX请求时,URL的域名地址通常是使用相对地址。相对地址指的是相对于当前页面的URL来确定请求的目标地址。当请求发送到服务器时,浏览器会自动将相对地址转换为完整的绝对URL。这样做的好处是能够更灵活地处理不同环境下的URL路径,同时减少了在JavaScript代码中......
  • python模块导入规则(相对导入和绝对导入)
    python模块可以相对导入和绝对导入,但这两者是不能替换使用的。本文主要讨论工作目录下模块之间的导入规则。其中相对导入前面有一个'.',表示从该脚本所在目录开始索引,而绝对导入前面没有'.',表示从根目录开始索引。首先明确一点,python认为的根目录为当前运行的脚本所在的目录,而......
  • Linux绝对路径和相对路径
    在Linux中,简单的理解一个文件的路径,指的就是该文件存放的位置。只要我们告诉Linux系统某个文件存放的准确位置,那么它就可以找到这个文件。指明一个文件存放的位置,有2种方法,分别是使用绝对路径和相对路径。我们知道,Linux系统中所有的文件(目录)都被组织成以根目录“/”开始的倒......
  • burpsuite靶场----目录遍历----绝对路径
    burpsuite靶场----目录遍历----绝对路径靶场地址https://portswigger.net/web-security/file-path-traversal/lab-absolute-path-bypass正式开始1.随便打开一个图片2.然后filename先尝试./../../../../etc/passwd不行然后再尝试/etc/passed成功......
  • 力扣-2006-差的绝对值为 K 的数对数目
    给你一个整数数组nums和一个整数k,请你返回数对(i,j)的数目,满足i<j且|nums[i]-nums[j]|==k。|x|的值定义为:如果x>=0,那么值为x。如果x<0,那么值为-x。示例1:输入:nums=[1,2,2,1],k=1输出:4解释:差的绝对值为1的数对为:-[1,2,2,1]-[1,2,2,1]-......
  • 『PyQt5-Qt Designer篇』| 08 Qt Designer中容器布局和绝对布局的使用
    (08QtDesigner中容器布局和绝对布局的使用)1容器布局1.1设计容器布局先拖入一个容器Frame容器,然后拖入几个控件:把拖入的控件拖入容器中:选中容器,右键-布局-栅格布局:1.2保存文件并执行保存为test007_ConFra.ui,并生成test007_ConFra.py:#-*-coding:utf-8-*-#......
  • 力扣-2535-数组元素和与数字和的绝对差
    给你一个正整数数组nums。元素和是nums中的所有元素相加求和。数字和是nums中每一个元素的每一数位(重复数位需多次求和)相加求和。返回元素和与数字和的绝对差。注意:两个整数x和y的绝对差定义为|x-y|。 示例1:输入:nums=[1,15,6,3]输出:9解释:nums的元素......
  • 代码随想录day21 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 2
    530.二叉搜索树的最小绝对差classSolution{private:intresult=INT_MAX;TreeNode*pre=NULL;voidtraversal(TreeNode*cur){if(cur==NULL)return;traversal(cur->left);//左if(pre!=NULL){//中......
  • 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/
    今天解决了一个很早之前的问题!!!无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]之前一直以为是jar包不匹配,但是改了jar包之后连uri都分辨不出来了后来在网上查到是tomcat的问题,将tomcat的conf目录下的catalina.properties的tomc......