freopen

分块学习与例题

醉酒当歌 提交于 2020-02-10 00:43:37
分块 分块的算法网上讲解有很多,这里粗略讲讲 分块就是一种优雅的暴力方法 例如我们需要进行区间求和,区间修改的操作,假如我们使用暴力的方法,对于每一次修改每一次求和都枚举这个区间进行相关操作,时间复杂度是 \(O(n^2)\) ,对于一些数据量 \(>10^4\) 的问题稳定超时。 分块大致上是将一个长度为 n 的区间分成 \(\sqrt n\) 块,然后对于 n 次对区间的操作 l,r 可以转换成 对 块1 左边一格的单点操作以及对 块1 块2 区间操作加上对 块2 右边两格子的单点操作,同样时枚举进行暴力修改,对于一整块的我们对这个块打上标记,两边的我们暴力修改。当然对块的大小是仁者见仁,智者见智,当把块的大小设置为 \(\sqrt n\) 时不能通过,把块开小点可能会有意想不到的ac。 如此以来分块的时间复杂度为 \(O(n*\sqrt n)\) 以下是 LOJ 例题 传送门 LOJ #6277. 数列分块入门 1 题意 区间加法,单点查值 题解 belong[] 数组预处理出每一个节点所属的块的编号, lazy[] 数组为当前块所共同添加的数的大小,那么对与某个点 r 的查询,查询结果即为 \[ a[r]+lazy[belong[r]] \] #include <iostream> #include <algorithm> #include <cstdio>

$vjudge-$搜索专题题解

本秂侑毒 提交于 2020-02-07 06:47:35
退役了,刷点儿无脑水题$bushi$放松下$QwQ$ 然后先放个 链接 ,,,$QwQ$ $A$ 虽然是英文但并不难$get$题目大意?就说给定一个数独要求解出来,$over$ 昂显然直接$dfs$加剪枝就成?显然就是个考剪枝技巧的题呗$QwQ$ 首先显然在$dfs$的过程中每次一定是找到可能的取值最少的那个格子填? 然后考虑怎么记录每个格子的取值数量? 昂可以考虑给每行每列每个九宫格分别开个二进制数存哪些数被用了,然后对每个格子就把它这行这列这九宫格或起来,剩下的就是能用的了$QwQ$.而且因为是个$dfs$所以可以设成全局变量$QwQ$ $over$ 还有一个方法是$dlx$,老年退役选手不配拥有脑子不想学不写了$QwQ$ 阿还有就我没想到很好的方法找可能的取值最少的格子,,,所以我决定先不写,,,发现能过于是就不写了$QwQQQQQ$ 然后因为我是用$lowbit$找可能取值,所以找到的都是1嘛,所以在这题里面我都是1表示还没用0表示用了$QwQ$ #include<iomanip> #include<cstdio> #include<map> using namespace std; #define il inline #define gc getchar() #define ri register int #define rb register bool #define

JSOI2012~2013

断了今生、忘了曾经 提交于 2020-02-04 23:39:21
JSOI 2012~2013 C 游戏中的学问 题面: bzoj 题解:递推 注意一个圈至少要三个人…… (上来以为是圆排列然后WA) 式子看代码吧 code I 侦探jyy 题面: bzoj 题解:bfs 对于每个事件,假设他必须发生 那么有两种可能 一是由他往上只要有一个点是一开始钦定了要发生 二是由所有入度为零且不是他祖先的点往下推,推完后还有钦定被发生而没有发生的 code Q 贪心的导游 题面: bzoj 题解:主席树 看到 \(a[i],p\leq 1000\) ,可以考虑暴力 每次在主席树的 \([l,r]\) 区间找到对应的数字 具体看代码吧 code C code #include<bits/stdc++.h> using namespace std; #define ll long long ll s[3005][3005],n,k,p; int main() { scanf("%lld%lld%lld",&n,&k,&p); s[0][0]=1; for(int j=1;j<=k;++j) for(int i=3*j;i<=n;++i) s[i][j]=(1ll*(i-1)*(i-2)*s[i-3][j-1]+1ll*(i-1)*s[i-1][j])%p; printf("%lld\n",s[n][k]); return 0; } top I code

文件读写重定向freopen函数

守給你的承諾、 提交于 2020-02-01 02:53:30
函数原型: FILE * freopen(const char * _Filename,const char * _Mode,FILE * _File); 其中FILE *是文件指针,参考 C文件 https://blog.csdn.net/nameofcsdn/article/details/103965715 mode是操作类型,最常用的就是"r"和“w”,表示读写。 _File是需要重定向到的文件指针 示例: #include <iostream> #include <string> using namespace std; int main() { freopen("D:\data in.txt","r",stdin); freopen("D:\data out.txt","w",stdout); int a; while(cin>>a){ cout<<a<<" "; } return 0; } 这里的2个重定向,一个是读取文件重定向到stdin,一个是输出文件重定向到stdout, 这样程序就是从文件读取数据,输出到文件,而输入输出的代码和格式,和标准输入输出是一样的。 一般做OJ题目时,如果涉及到大量输入输出,或者为了显示效果需要分开输入和输出内容,采用重定向比较方便。 来源: CSDN 作者: csuzhucong 链接: https://blog.csdn.net

「JSOI2011」汇总

末鹿安然 提交于 2020-01-31 00:56:14
「JSOI2011」柠檬 斜率优化题。 在优化前,还有一个值得一提的优化: 对于最后的最有分割方案,每一段的两个端点一定是同颜色的,并且作为这一段的 \(s_0\) 证明:如果不作为这一段的 \(s_0\) ,那么它显然没有贡献,把这一个单独分出来显然更优,直到最后两个端点就一定都是 \(s_0\) ,颜色相同。 那么我们只需要从之前和该点种类相同的位置进行转移即可。 这样就从直接枚举的复杂度 \(O(n^3)\) 优化到了 \(O(n^2)\) ,但还是不够,继续考虑优化。 我们先把转移方程写出来: \(dp_i\) 表示把前 \(i\) 个取完,且 \(i\) 点作为一段的终点最大收益。 \[dp_i=\max\limits_{1\le j \le i,a_j=a_i}\left\{dp_{j-1}+s_i(p_i-p_j+1)^2\right\}\] \(p_i\) 表示第 \(i\) 个点是种类为 \(s_i\) 的第 \(p_i\) 个点。 根据斜率优化的一些做法,我们可以把式子化成这样: \(p_i\times 2p_js_j+dp_i-s_i(p_i+1)^2=dp_{j-1}-2a_jp_j+a_jp_j^2\) 设 \(x_i = 2s_ip_i,y_i=dp_{i-1}-2s_ip_i+s_ip_i^2\) \(p_ix_j+dp_i-s_i(p_i+1)^2

[HNOI2005]狡猾的商人

北城余情 提交于 2020-01-29 16:51:28
题目描述 输入输出格式 输入格式 从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要你判断。每组数据的第一行为两个正整数n和m,其中n < 100,m < 1000,分别表示对应的账本记录了多少个月的收入情况以及偷看了多少次账本。接下来的m行表示刁姹偷看m次账本后记住的m条信息,每条信息占一行,有三个整数s,t和v,表示从第s个月到第t个月(包含第t个月)的总收入为v,这里假设s总是小于等于t。 输出格式: 输出文件output.txt中包含w行,每行是true或false,其中第i行为true当且仅当第i组数据,即第i个账本不是假的;第i行为false当且仅当第i组数据,即第i个账本是假的。 输入输出样例 输入样例#1: 2 3 3 1 2 10 1 3 -5 3 3 -15 5 3 1 5 100 3 5 50 1 2 51 输出样例#1: true false 题解: 1.差分约束,直接x-y连v的边,并且y-x连-v的边,然后spfa找负环 2.带权并查集,每一次合并find(y)和x并修改路径上的dis值,顺便路径压缩.然后如果在同一集合中直接判断矛盾即可 1 #include <algorithm> 2 #include <iostream> 3 #include <cstdlib> 4 #include

Codeforces 453abc 题解

人盡茶涼 提交于 2020-01-28 00:50:13
作为一只brony,当然要打这个比赛了 吐槽一句,T2的那个箱子在S4E2出现,但是TS在S3结尾有了翅膀,这幅图根本没有翅膀好吧。。。 A A A Little Pony and Expected Maximum 题目大意:求 m m m 面色子扔 n n n 次的期望最大值 可以得知,最大值在 [ 1 , x ] [1,x] [ 1 , x ] 的情况有 x n x^n x n 种,所以对于点数 i i i ,一共有 i n − ( i − 1 ) n i^n-(i-1)^n i n − ( i − 1 ) n 种情况最大值为 i i i ,每种情况贡献为 i i i ,所有情况的数量为 m n m^n m n ,于是答案为 a n s = ∑ i = 1 m i n − ( i − 1 ) n m n × i = ∑ i = 1 m ( i m ) n × i − ( i − 1 m ) n × i ans=\frac{\sum_{i=1}^mi^n-(i-1)^n}{m^n}\times i=\sum_{i=1}^m(\frac{i}{m})^n\times i-(\frac{i-1}{m})^n\times i a n s = m n ∑ i = 1 m ​ i n − ( i − 1 ) n ​ × i = i = 1 ∑ m ​ ( m i ​ ) n × i − (

C语言的文件操作 freopen

百般思念 提交于 2020-01-26 06:19:11
今天做USACO 用到了文件的操作。 之前做USACO只是格式化的些 写 freopen("xxx.in","r",stdin) 和"freopen("xxx.out","w",stdout)" 百度百科上是这么介绍的: 函数名: freopen  功 能: 替换一个流,或者说重新分配文件指针,实现重定向。如果stream流已经打开,则先关闭该流。如果该流已经定向,则freopen将会清除该定向。此函数一般用于将一个指定的文件打开一个预定义的流:标准输入、标准输出或者标准出错。   用 法: FILE *freopen(const char *filename,const char *type, FILE *stream); 头文件: stdio.h    例1: #include <stdio.h> #include <stdlib.h> int main() { if(freopen("file.txt","w",stdout)==NULL) fprintf(stderr,"error\n"); printf("This is in the file\n"); //这句话会在file.txt中显示。 fclose(stdout); //使用fclose()函数就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。 return 0; }    例2: /

文件与键盘输入与输出

穿精又带淫゛_ 提交于 2020-01-25 01:45:05
之前关于getchar的使用有个误区。getchar是一句输入结束后,挨个挨个读取的。 getchar用法 int getchar(void),从标准输入中一次读取一个字符。可以从键盘读入,也可以从文件读入。 从文件读入的方法: #include<stdio.h> FILE *fp; void main(){ char c; fp=freopen("test.txt","r",stdin); while((c=getchar())!=EOF){ putchar(c); } } 注意while((c=getchar())!=0),c=getchar()两边要再加括号。判断的是c的值,c从getchar读入后的值。一开始总以为c=getchar()会返回个1什么的。 gets()从标准输入中一次读入一句。可以键盘读入,可以文件读入。 从文件读入方法: #include<stdio.h> #include<string.h> FILE *fp; void main(){ char getstr[128]; char tmpstr[128]; char matchstr[128]; fp=freopen("test.txt","r",stdin); while(gets(getstr)){ if(strcmp(getstr,tmpstr)==0){ if(strcmp(getstr

COGS 2685. 迷妹

故事扮演 提交于 2020-01-24 16:56:12
★ 输入文件: fans.in 输出文件: fans.out 简单对比 时间限制:1 s 内存限制:256 MB 【题目描述】 小钟、小皓和小曦都是著名偶像派OI选手,他们都有很多迷妹。 现在,有n个妹子排成了一行,从左到右编号为1到n。这些妹子中,任意一个都是其中一个人的迷妹。 现在,蒟蒻wyz有Q个问题,第i个问题为:编号在l[i]到r[i]范围内的妹子中,分别有几个小钟的迷妹、小皓的迷妹、和小曦的迷妹。 【输入格式】 输入到fans.in 第一行2个正整数n,Q。 第2行到第n+1行每行一个正整数a[i],描述了第i个妹子是谁的迷妹。a[i]=1表示小钟的迷妹,a[i]=2表示小皓的迷妹,a[i]=3表示小曦的迷妹。 第n+2行到第n+Q+1行,每行2个整数,表示第i个问题。 【输出格式】 输出到fans.out 共Q行,每行3个用空格分开的整数,分别表示对于第i个问题,有多少小钟、小皓、小曦的迷妹。 【样例输入】 6 3 2 1 1 3 2 1 1 6 3 3 2 4 【样例输出】 3 2 1 1 0 0 2 0 1 【提示】 【数据范围】 对于10%的数据,保证1<=n<=10,Q<=10, 对于25%的数据,保证1<=n<=100,Q<=100, 对于45%的数据,保证1<=n<=1000,Q<=1000, 对于100%的数据,保证1<=n<=100,000,Q<