【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 ...
随机推荐
- 关于angularJS的一些用法
AngularJS 事件指令: ng-click/dblclick ng-mousedown/up ng-mouseenter/leave ng-mousemove/over/out ng-keydo ...
- python简单爬虫(二)
上一篇简单的实现了获取url返回的内容,在这一篇就要第返回的内容进行提取,并将结果保存到html中. 一 . 需求: 抓取主页面:百度百科Python词条 https://baike.baidu. ...
- perl6正则 2: 字母,数字,空格,下划线, 字符集
数字, 字母, 下划线 在perl6中, 如果是 数字, 字母, 下划线, 在正则里可以正接写上. > so / True > so 'perl6_' ~~ /_/ True > 非 ...
- Android设备相关配置
http://source.android.com/devices/tech/storage/index.html Android supports devices with external sto ...
- 看看PHP迭代器的内部执行过程
class myIterator implements Iterator { private $position = 0; private $array = array( "first_el ...
- php 高并发解决方案(用于抢购) 转载
最近在做一个团购项目,遇到个问题,就是在抢购.秒杀.抽奖等活动时,库存数量有限,但是同时下单人数超过了库存数量,就会导致商品超售问题.那么我们怎么来解决这个问题呢,我的思路如下: sql1:查询商品库 ...
- Linux中如何配置IP相关文件
Linux中如何配置IP 与网络相关的文件:1) /etc/sysconfig/network 设置主机名称及能否启动Network2) /etc/sysconfig/network-script ...
- springboot1.5.4 idea 自动保存编译更新
maven dependencies增加 <dependency> <groupId>org.springframework.boot</groupId> < ...
- 小甲鱼Python笔记(类)
类和对象 类的构造方法 def __init__(): 1 class People: 2 def __init__(self,name): 3 self.name = name 注意:在构造方法中的 ...
- Codeforces Round #278 (Div. 1) B - Strip dp+st表+单调队列
B - Strip 思路:简单dp,用st表+单调队列维护一下. #include<bits/stdc++.h> #define LL long long #define fi first ...