【9.23校内测试】【抽屉原理】【乱搞??(找众数】【Trie】

看到题目一开始想到的是一道求子集和的异或和,可以用$bitset$实现求子集和。然而这道题如果要强算子集和肯定是带不动的,况且还要算方案,所以尝试去找题目中的性质。
看到整除,很容易想到如果是一段区间,区间的头和尾的前缀和模后余数是一样的,那么这段区间(左开右闭)一定是满足整除的一段区间。而这道题目中,我们发现模数$n$很特殊,是这个序列的长度。继续深入思考。
这个序列一共有$n$个前缀和,而模$n$取余数一共有$n$个,其中如果余数是0那么便是符合条件的答案了,所以如果0,剩下$n-1$个余数对应到$n$个前缀和的位置,一定至少有两个位置的余数是一样的!这就是小学奥数的抽屉原理叻!因此得证,满足题目要求的方案一定至少有一种是连续的一段区间。(同时也说明题目中不可能有不存在满足条件的子集的情况
#include<bits/stdc++.h>
#define LL long long
#define RG register
using namespace std; int n;
LL a[]; void read(LL &x) {
x = ; char ch = getchar();
while(ch > '' || ch < '') ch = getchar();
while(ch>= '' && ch <= '') {
x = x * + ch - '';
ch = getchar();
}
} LL ans = ;
LL pre[], las[];
int main() {
freopen("set.in", "r", stdin);
freopen("set.out", "w", stdout);
scanf("%d", &n);
int tot = ;
int pos = ;
for(int i = ; i <= n; i ++) {
read(a[i]);
pre[i] = (pre[i-] + a[i]) % n;
if(las[pre[i]] || pre[i] == ) {
pos = i; break;
}
las[pre[i]] = i;
}
printf("%d\n", pos - las[pre[pos]]);
for(int i = las[pre[pos]] + ; i <= pos; i ++) printf("%d ", i);
return ;
}
/*
4
1 5 6 7
*/

这道题题目balabala说了一大堆,实际上就是要求数量最多的那个种类书的数量,如果$cnt>(n+1)/2$,那么就不能把剩下的书都包完,剩下的就是题目要求的不能看的书,而其他情况都可以使所有书都能被看。
而题目最大的限制就是$n$的范围,不然直接开桶排序扫一遍记录最大值即可。所以我们要想的就是在这样的基础上优化空间。
所以显然是不能把$a$数组存下来的,所以考虑在生成每一个$a$的时候处理出一些内容。我们可以记录一个$cnt$和$id$,$id$表示当前数量最大的数(这个当前不好理解,如果前面最大的数被其它数数量抵消了,那么就把前面那部分完全抛开当作没有,从新的起点开始这个$id$记录的就可能是抵消完后一个数量并不是最大的数)。如果当前$a$等于这个$id$,那么$cnt++$,否则$cnt--$,如果$cnt == 0$,意思是前面都被抵消完了,那么就重新开始,更新$id$。像这样扫一遍。
得出的这个$id$,如果它的数量$>=(n+1)/2$,那么它记录的就是全局众数,像最开始说的那样统计答案就行了。而如果它的数量没有达到,说明全局中没有数量$>=(n+1)/2$(如果全局中有,这个$id$就一定会统计成那个数),因此所有书都可以被看。所以我们用$id$为判断条件再去扫一遍统计它的数量就行了。
#include<bits/stdc++.h>
#define LL long long
using namespace std; LL cot[], X[], Y[], Z[];
int m, k, n; int main() {
freopen("read.in", "r", stdin);
freopen("read.out", "w", stdout);
scanf("%d%d", &m, &k);
for(int i = ; i <= m; i ++) scanf("%lld", &cot[i]), n += cot[i];
for(int i = ; i <= m; i ++) scanf("%lld", &X[i]);
for(int i = ; i <= m; i ++) scanf("%lld", &Y[i]);
for(int i = ; i <= m; i ++) scanf("%lld", &Z[i]);
int S = ( << k) - ;
LL id, num = ; LL las;
for(int i = ; i <= m; i ++) {
las = X[i];
if(num == ) { id = las; num = ; }
else if(las == id) num ++;
else num --;
for(int j = ; j < cot[i]; j ++) {
las = (las * Y[i] + Z[i]) & S;
if(num == ) { id = las; num = ; }
else if(las == id) num ++;
else num --;
}
}
num = ;
for(int i = ; i <= m; i ++) {
las = X[i];
if(las == id) num ++;
for(int j = ; j < cot[i]; j ++) {
las = (las * Y[i] + Z[i]) & S;
if(las == id) num ++;
}
}
if(num > (n+) / ) {
int tmp = n - num + ;
printf("%d", num - tmp);
} else printf("");
return ;
}
/*
4 2
1 1 1 1
1 1 1 2
0 0 0 0
0 0 0 0
*/


目前还没有完全理解并且改代码QAQ以后填坑!!
然后就要挂出这天早上考试时因为做的到最后束手无策而用鼠标在画图上艰难作的画叻!!魏无羡妈妈永远爱你!!

【9.23校内测试】【抽屉原理】【乱搞??(找众数】【Trie】的更多相关文章
- 【8.23校内测试】【贪心】【线段树优化DP】
$m$的数据范围看起来非常有问题??仔细多列几个例子可以发现,在$m<=5$的时候,只要找到有两行状态按位$&$起来等于$0$,就是可行方案,如果没有就不行. #include<i ...
- Atcoder Grand Contest 008 E - Next or Nextnext(乱搞+找性质)
Atcoder 题面传送门 & 洛谷题面传送门 震惊,我竟然能独立切掉 AGC E 难度的思维题! hb:nb tea 一道 感觉此题就是找性质,找性质,再找性质( 首先看到排列有关的问题,我 ...
- [CSP-S模拟测试]:凉宫春日的忧郁(乱搞)
题目传送门(内部题101) 输入格式 第一行输入一个整数$T$,表示数据组数. 接下来$T$行,每行两个数$X,Y$,表示$T$组数据. 输出格式 输出共有$T$行,对于每一组数据,如果$X^Y\le ...
- [CSP-S模拟测试]:统计(树状数组+乱搞)
题目传送门(内部题120) 输入格式 第一行,两个正整数$n,m$. 第二行,$n$个正整数$a_1,a_2,...,a_n$,保证$1\leqslant a_i\leqslant n$,可能存在相同 ...
- [CSP-S模拟测试]:Cicada拿衣服(暴力+乱搞)
题目传送门(内部题94) 输入格式 第一行两个整数$n,k$,代表衣服的数量和阈值. 接下来一行$n$个数,第$i$个数$a_i$表示每件衣服的愉悦值. 输出格式 输出一行$n$个数,第$i$个数为$ ...
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...
- 华农oj Problem J: 幻化【贪心/抽屉原理】
Problem J: 幻化 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 18 Solved: 3 [Submit][Status][Web Board ...
- Luogu P1134 阶乘问题 【数学/乱搞】 By cellur925
输入输出格式 输入格式: 仅一行包含一个正整数 NN . 输出格式: 一个整数,表示最右边的非零位的值. 输入输出样例 输入样例#1: 12 输出样例#1: 6 说明 USACO Training S ...
- bzoj1992鬼谷子的钱袋(二分乱搞 二进制)
1192: [HNOI2006]鬼谷子的钱袋 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3223 Solved: 2333 Descriptio ...
随机推荐
- Linux终端提示符PS1设置(颜色)
\d :代表日期,格式为weekday month date,例如:"Mon Aug 1"\H :完整的主机名称.例如:我的机器名称为:fc4.linux,则这个名称就是fc4.l ...
- windows下面安装Python和pip教程
第一步,先来安装Python.windows下面的Python安装一般是通过软件安装包安装而不是命令行,所以首先要在Python的官方主页上面下载最新的Python安装包.下载地址是:https:// ...
- Java多线程学习(七)并发编程中一些问题
本节思维导图: 关注微信公众号:"Java面试通关手册" 回复"Java多线程"获取思维导图源文件和思维导图软件. 多线程就一定好吗?快吗?? 并发编程的目的就 ...
- linux设置时区同步时间
linux设置时区同步时间 一.运行tzselect sudo tzselect 在这里我们选择亚洲 Asia,确认之后选择中国(China),最后选择北京(Beijing) 如图: 二.复制文件 ...
- 全面了解 Nginx 主要应用场景
前言 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得.所以还请见谅,同时欢迎留言交流 N ...
- docker swarm join 报错
[peter@minion ~]$ docker swarm join --token SWMTKN-1-3mj5po3c7o04le7quhkdhz6pm9b8ziv3qe0u7hx0hrgxsna ...
- /bin、/sbin、/usr/bin、/usr/sbin目录Linux执行文档的区别
/bin./sbin./usr/bin./usr/sbin目录的区别 在linux下我们经常用到的四个应用程序的目录是/bin./sbin./usr/bin./usr/sbin .而四者存放的文件 ...
- iOS控制器与视图加载方法
转载记录, 请看原文: 1. iOS中的各种加载方法(initWithNibName,loadNibNamed,initWithCoder,awakeFromNib等等)简单使用 http://w ...
- yii2联表查询
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...
- 05 java 基础:运算符、程序结构
赋值运算符 : = 三元运算符 : ? 算术运算符 : +.- .*./.% 自增自减运算符: ++.-- 关系运算符:>.<.==.>=.<=.!= 逻辑运算符 :& ...