memset

Hdu 3887 Counting Offspring \\ Poj 3321 Apple Tree \\BZOJ 1103 [POI2007]大都市meg

霸气de小男生 提交于 2020-04-03 07:14:09
这几个题练习DFS序的一些应用。 问题引入: 给定一颗n(n <= 10^5)个节点的有根树,每个节点标有权值,现有如下两种操作: 1、C x y 以节点x的权值修改为y。 2、Q x 求出以节点x为根的子树权值和。 最直观的做法, 枚举一个子树内所有节点的权值加和。但这种做法的每一次讯问的时间复杂度是O(n)的,很明显无法满足题目的需要,我们需要更优的解法。 我们考虑DFS序的另外一种形式,当访问到一个节点时记下当前的时间戳,我们设它为L[x], 结束访问一个节点时当前的时间戳设为R[x]。则以x为根的子树刚好是下标为L[x]和R[x]中间的点。我们看下面这个例子。 有了DFS序这个性质我们就可以讲这个问题转化成一个区间求和问题。 每一次询问的复杂度就是O(logn)级别的,完全可以接受。 另外:很多人习惯在生成DFS序的时候,叶子节点的进出时间戳差1,我习惯于叶子节点的进出时间戳一样。这样根节点的时间戳为[1,n] 比如说:上图中如果采用叶子节点进出时间戳差1的写法,DFS序为:4、3、1、7、7、1、2、6、6、2、3、5、8、8、5、4.数量为2*n 如果按照我习惯的做法,DFS序为:4、3、1、7、2、6、5、8. 两种做法都可以,我习惯于第二种。 练习题: 第一题: http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意

HIT 1917 2—SAT

允我心安 提交于 2020-04-03 04:34:44
题目大意:一国有n个党派,每个党派在议会中都有2个代表, 现要组建和平委员会,要从每个党派在议会的代表中选出1人,一共n人组成和平委员会。 已知有一些代表之间存在仇恨,也就是说他们不能同时被选为和平委员会的成员, 现要你判断满足要求的和平委员会能否创立?如果能,请任意给出一种方案。( POI 0106 ) ————————————————————————————————————————— 这道题就是裸的2—SAT 不过我用了tarjan缩点 然后一波拓排 tips:一个问题无解当且仅当一个集合的两个点在同一个联通块里面 所以特判完无解之后一波拓排就可以解决问题辣 #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using std::min; const int M=17005; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int n,m; int next(int x){return x&1?x+1:x-1;}

CF #560 div3

戏子无情 提交于 2020-04-01 04:22:58
碎碎念 只想着快了 细节考虑不周,补题时一直就奇怪当时怎么就没这么想呢, 还有题意,老是会遗漏,英文水平不够呀 还有特判问题,错误想法前的特判,改掉其他地方后特判也要改呀 对于数学规律,算出的公式看自己的解决思路来化简 写写前五题吧 后俩有空补一下 A:给定01字符串s,长度n,x,y, 0=<x<y<n;可任意对某位取反,问使得s % 10^x == 10^y需进行的最小操作数。 嘛 简单 保证s的倒数y位都为0就ok了嘛 然后倒数的 x~y位之间也都是0就可以了 嗯 搞搞, 过了,开心 早上一看 hacked了 哇 看了下代码 判断倒数第x位的时候顺手判断了一下该位是否为1, 为0则操作数++,其实保证了s没有前导0 ,x<n,那倒数x位前肯定有1存在,x位是啥就无所谓了 呜 #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<stack> #include<list> #include<set> using namespace std; typedef long long ll; typedef pair

NOIP 前夕 模板整理

时间秒杀一切 提交于 2020-03-30 16:07:33
归并排序: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int a[1200],s[1200],n; 6 void megre_sort(int l,int r) 7 { 8 if(l==r) return ; 9 int mid=(l+r)/2; 10 megre_sort(l,mid);megre_sort(mid+1,r); 11 int i=l,j=mid+1,k=l; 12 while(i<=mid&&j<=r) 13 { 14 if(a[i]<=a[j]) 15 s[k++]=a[i++]; 16 else 17 s[k++]=a[j++]; 18 } 19 while(i<=mid) 20 s[k++]=a[i++]; 21 while(j<=r) 22 s[k++]=a[j++]; 23 for(int i=1;i<=r;i++) 24 a[i]=s[i]; 25 } 26 int main() 27 { 28 scanf("%d",&n); 29 for(int i=1;i<=n;i++) 30 scanf("%d",&a[i]); 31 megre_sort(1,n); 32 for(int i=1;i<=n;i++) 33 printf

专题训练之树状数组

一曲冷凌霜 提交于 2020-03-30 09:18:20
推荐几个博客:https://blog.csdn.net/int64ago/article/details/7429868搞懂树状数组 https://blog.csdn.net/z309241990/article/details/9615259区间修改 https://blog.csdn.net/whereisherofrom/article/details/78922383完整版+题集 http://www.cnblogs.com/wuyiqi/archive/2011/12/25/2301071.html二进制思想求第k大数 http://www.cnblogs.com/oa414/archive/2011/07/21/2113234.html二分/二进制思想求第k大数 一维树状数组模板(区间求和、单点修改) 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=1e5+10; 6 int bit[maxn],n; 7 8 int lowbit(int x) 9 { 10 return x&(-x); 11 } 12 13 void add(int k,int num) 14 { 15 while ( k<=n ) { 16

专题训练之双连通

蹲街弑〆低调 提交于 2020-03-29 07:45:11
桥和割点例题+讲解:hihocoder1183 http://hihocoder.com/problemset/problem/1183 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #include<set> 6 using namespace std; 7 const int maxn=1005; 8 const int maxm=200010; 9 struct edge{ 10 int to,nxt; 11 bool cut; 12 }edge[maxm*2]; 13 int head[maxn],tot; 14 int low[maxn],dfn[maxn]; 15 int index,n,bridge; 16 set<int>st; 17 bool cut[maxn]; 18 19 void addedge(int u,int v) 20 { 21 edge[tot].to=v; 22 edge[tot].nxt=head[u]; 23 edge[tot].cut=false; 24 head[u]=tot++; 25 } 26 27 void tarjan(int u,int pre) 28 { 29 low[u]=dfn[u]=++index; 30

memset函数用法

流过昼夜 提交于 2020-03-27 16:28:33
转自: https://blog.csdn.net/liwenjia1981/article/details/6304547 头文件准备<string.h> 函数原型  void *memset(void *s, int ch, unsigned n); //n参数是以 字节 为单位,最好用sizeof() 例:memset(array,0,5*sizeof(int)); 用途:memset可以方便的清空一个结构类型的变量或数组。   如:   struct sample_struct   {   char csName[16];   int iSeq;   int iType;   };   对于变量   struct sample_strcut stTest;   memset(&stTest,0,sizeof(struct sample_struct));   如果是数组:   struct sample_struct TEST[10];   则   memset(TEST,0,sizeof(struct sample_struct)*10); 来源: https://www.cnblogs.com/guangzhouhe/p/12580522.html

C语言memset()函数的用法

感情迁移 提交于 2020-03-26 01:58:23
C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符) 到参数 str 所指向的字符串的前 n 个字符。 声明 下面是 memset() 函数的声明。 void *memset(void *str, int c, size_t n) 参数 str -- 指向要填充的内存块。 c -- 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。 n -- 要被设置为该值的字节数。 例:char a[100];memset(a, ‘/0’, sizeof(a)); memset可以方便的清空一个结构类型的变量或数组。 struct sample_struct { char csName[16]; int iSeq ; int iType ; } ; int main() { struct sample_struct stTest; //一般的情况stTest方法: /* stTest.csName[0]='\0'; stTest.iSeq=0; stTest.iType=0;*/ memset(&stTest,0,sizeof(stTest)); printf("%c%d%d",stTest.csName[0],stTest.iSeq,stTest.iType); //如果是数组 /*

高精度加减乘除法

ぃ、小莉子 提交于 2020-03-16 04:11:15
百练2981 http://poj.grids.cn/practice/2981/ View Code 1 #include<stdio.h> 2 #include<string.h> 3 int num[301]; 4 int main() 5 { 6 int i,j,f = 0,f1; 7 char c1[201],c2[201]; 8 gets(c1); 9 gets(c2); 10 i = strlen(c1)-1; 11 j = strlen(c2)-1; 12 int g = 0; 13 while(i>=0&&j>=0) 14 { 15 g++; 16 if(c1[i]-'0'+c2[j]-'0'+num[g]>9) 17 { 18 num[g+1] += (c1[i]-'0'+c2[j]-'0'+num[g])/10; 19 num[g] = (c1[i]-'0'+c2[j]-'0'+num[g])%10; 20 f1 = 0; 21 } 22 else 23 num[g] += c1[i]-'0'+c2[j]-'0'; 24 i--;j--; 25 } 26 while(i>=0) 27 { 28 g++; 29 if(num[g]+c1[i]-'0'>9) 30 { 31 num[g+1] += (num[g]+c1[i]-'0')/10; 32 num[g]

校内题目T2695 桶哥的问题——吃桶

流过昼夜 提交于 2020-03-12 04:23:58
同T2一样外校蒟蒻可能没看过: 题目描述: 题目背景 @桶哥 桶哥的桶没有送完。 题目描述 桶哥的桶没有送完,他还有n个桶。他决定把这些桶吃掉。他的每一个桶两个属性:种类 aia_i a i ​ 和美味值 bib_i b i ​ 。若下标为x, y, z(下标从1开始)的三个桶满足: x<z x < z x < z 且 x+y=z−2y x + y = z - 2y x + y = z − 2 y 且 ax=az a_x = a_z a x ​ = a z ​ 那么它们构成一个套餐,会产生 (x+z)∗(bx−bz) (x + z) * (b_x - b_z) ( x + z ) ∗ ( b x ​ − b z ​ ) 的价值。问:一共会产生多少价值? 上面那个看不清楚的下标是z 输入输出格式 输入格式: 第一行两个整数 n,mn,m n , m,表示共有m种共n个桶。 第二行n个整数表示 bib_i b i ​ , 第三行n个整数表示 aia_i a i ​ ,(下标) 输出格式: 一行一个整数,表示一共会产生多少价值。由于这个数可能很大,你只需要输出它除以10007的余数。 如果答案是负的,请将其加上10007再对10007取余。如-1应输出10006. 正解开始: 然而 _rqy 大佬讲的我并没怎么听懂,所以也是一蒙一蒙的。 转换一下公式: x+y=z-2y z-x=3y x