bzoj

BZOJ 3876: [Ahoi2014&Jsoi2014]支线剧情 有源汇上下界费用流

你说的曾经没有我的故事 提交于 2019-11-26 17:55:12
title BZOJ 3876 LUOGU 4043 Description 【故事背景】 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等。不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情。这些游戏往往都有很多的支线剧情,现在JYY想花费最少的时间看完所有的支线剧情。 【问题描述】 JYY现在所玩的RPG游戏中,一共有N个剧情点,由1到N编号,第i个剧情点可以根据JYY的不同的选择,而经过不同的支线剧情,前往Ki种不同的新的剧情点。当然如果为0,则说明i号剧情点是游戏的一个结局了。 JYY观看一个支线剧情需要一定的时间。JYY一开始处在1号剧情点,也就是游戏的开始。显然任何一个剧情点都是从1号剧情点可达的。此外,随着游戏的进行,剧情是不可逆的。所以游戏保证从任意剧情点出发,都不能再回到这个剧情点。由于JYY过度使用修改器,导致游戏的“存档”和“读档”功能损坏了,所以JYY要想回到之前的剧情点,唯一的方法就是退出当前游戏,并开始新的游戏,也就是回到1号剧情点。JYY可以在任何时刻退出游戏并重新开始。不断开始新的游戏重复观看已经看过的剧情是很痛苦,JYY希望花费最少的时间,看完所有不同的支线剧情。 Input 输入一行包含一个正整数N。 接下来N行,第i行为i号剧情点的信息; 第一个整数为,接下来个整数对,Bij和Tij,表示从剧情点i可以前往剧 情点

BZOJ 1398 Vijos1382寻找主人 Necklace (最小表示法)

假如想象 提交于 2019-11-26 14:48:27
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1398 题目: Description 给定两个项链的表示,判断他们是否可能是一条项链。 Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的)。 Output 如果两条项链不可能同构,那么输出’No’,否则的话,第一行输出一个’Yes’ 第二行输出该项链的字典序最小的表示。 设L = 项链长度,L <= 1000000。 Sample Input 2234342423 2423223434 Sample Output Yes 2234342423 思路: 最小表达法裸题 代码: #include <bits/stdc++.h> using namespace std; const int maxn=1e6+10; char a[maxn],b[maxn]; int getmin(char *s,int n){ int i=0,j=1,k=0,t; while(i<n && j<n && k<n){ t=s[(i+k)%n]-s[(j+k)%n]; if(!t) k++; else{ if(t>0) i+=k+1; else j+=k+1; if(i==j) j++; k=0; } } return i<j?i:j; }

BZOJ 3275: Number 最小割

元气小坏坏 提交于 2019-11-26 14:06:00
title BZOJ 3275 Description 有N个正整数,需要从中选出一些数,使这些数的和最大。 若两个数a,b同时满足以下条件,则a,b不能同时被选 1:存在正整数C,使a * a+b * b=c * c 2:gcd(a,b)=1 Input 第一行一个正整数n,表示数的个数。n<=3000 第二行n个正整数a1,a2,...an Output 最大的和 Sample Input 5 3 4 5 6 7 Sample Output 22 analysis 现在感觉挺套路的一个题,直接说建图了: 拆点,因为只能取一次,源点连向入点,出点连向汇点,容量都为 \(a[i]\) ; 满足题目条件的两个点相连,容量为 \(INF\) ; 跑最大流最小割; 最后答案为 \(\sum a[i]-maxflow/2\) ( \(code\) 里就是 \(sum-ans/2\) )。 code #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10,maxm=1e6+10,inf=0x3f3f3f3f; char buf[1<<15],*fs,*ft; inline char getc() { return (ft==fs&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),ft=

BZOJ 3511: 土地划分 最小割

╄→尐↘猪︶ㄣ 提交于 2019-11-26 14:05:41
title BZOJ 3511 LUOGU 4210 Description Y国有N座城市,并且有M条双向公路将这些城市连接起来,并且任意两个城市至少有一条路径可以互达。 Y国的国王去世之后,他的两个儿子A和B都想成为新的国王,但他们都想让这个国家更加安定,不会用武力解决问题。 于是他们想将这个国家分成两个小国家A国和B国。现在,A拥有1号城市,B拥有N号城市,其他的城市还尚未确定归属哪边(划分之后的国家内部城市可以不连通)。 由于大家都想让国家变得更好,而某些城市的人民愿意国王的A儿子作为他们的领袖,而某些城市更看好B,而为了交通的便捷,如果划分后的公路连接两个同一个国家的城市,那么更利于城市之间的交流。于是大臣们设计了一种对土地划分的评分机制,具体如下: 对于城市i,如果它划分给A国,将得到VA[i]的得分;划分给B国,将得到VB[i]的得分。 对于一条公路i,如果它连接两个A国的城市,将得到EA[i]的得分;连接两个B国的城市,将得到EB[i]的得分;否则,这条公路将失去意义,将扣除EC[i]的得分。 现请你找到最优的土地划分,使得这种它的评分最高。 Input 第一行包含两个整数N,M,含义如问题描述所示。 接下来一行N-2个非负整数,表示VA[2..N-1]。 接下来一行N-2个非负整数,表示VB[2..N-1]。 接下来M行,每行五个非负整数描述一条公路:X Y EA

BZOJ 5338: [TJOI2018]xor 可持久化trie+dfs序

拟墨画扇 提交于 2019-11-26 13:55:46
强行把序列问题放树上,好无聊啊~ code: #include <bits/stdc++.h> #define N 200005 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int tot,edges,tim; int cnt[N*33],ch[N*33][2],tree[N],seq[N],val[N],ba[N]; int fa[N],son[N],size[N],top[N],dep[N],hd[N],to[N<<1],nex[N<<1],dfn[N],ed[N]; inline void add(int u,int v) { nex[++edges]=hd[u],hd[u]=edges,to[edges]=v; } void insert(int pre,int &x,int v) { int now=x=++tot; for(int i=30;i>=0;--i) { int o=((v>>i)&1); ch[now][o^1]=ch[pre][o^1]; ch[now][o]=++tot; pre=ch[pre][o]; now=tot; cnt[now]=cnt[pre]+1; } } void dfs1(int u,int ff) { fa[u]=ff,dep[u]=dep[ff]+1

[欧拉函数] Bzoj P2226 LCMSum

社会主义新天地 提交于 2019-11-26 12:31:36
Description Given n, calculate the sum LCM(1,n) + LCM(2,n) + .. + LCM(n,n), where LCM(i,n) denotes the Least Common Multiple of the integers i and n. 题解 代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 1000010 4 #define ll long long 5 using namespace std; 6 ll T,bz[N],phi[N],q[N],ans[N]; 7 int main() 8 { 9 scanf("%lld",&T),phi[1]=1; 10 for (ll i=2;i<=N;i++) 11 { 12 if (!bz[i]) q[++q[0]]=i,phi[i]=i-1; 13 for (ll j=1;j<=q[0]&&i*q[j]<=N;j++) 14 if (i*q[j]<N) 15 { 16 bz[i*q[j]]=1; 17 if (i%q[j]==0) { phi[i*q[j]]=phi[i]*q[j]; break; } 18 phi[i*q[j]]=phi[i]*(q[j]-1); 19 } 20 } 21 for (int i

[莫比乌斯函数][二分] Bzoj 2440 完全平方数

北慕城南 提交于 2019-11-26 12:15:23
Description 小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些 数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而 这丝毫不影响他对其他数的热爱。 这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一 个小X讨厌的数。他列出了所有小X不讨厌的数,然后选取了第 K个数送给了 小X。小X很开心地收下了。 然而现在小 W 却记不起送给小X的是哪个数了。你能帮他一下吗? 题解 二分答案,将问题转换为求[1,m]种有多少个无平方因子数 没有平方因子不就是μ(i)!=0 根据容斥原理,满足要求的ans=n-只有一个质数因子次数大于等于2的个数+只有2个质数因子大于等于2的个数-... 代码 1 #include <cmath> 2 #include <cstdio> 3 #include <iostream> 4 #define ll long long 5 using namespace std; 6 const ll N=100010,inf=(1<<31)-1; 7 ll T,n,l,r,ans,mobius[N],p[N],bz[N]; 8 bool check(ll x) { ll r=0; for (ll i=1;i<=sqrt(x);i++) r+=mobius[i]*x/(i*i); return r>=n; }

bzoj 1878 HH的项链

限于喜欢 提交于 2019-11-26 11:08:36
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 8273 Solved: 4004 Description HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此他的项链变得越来越长。有一天,他突然提出了一 个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只 好求助睿智的你,来解决这个问题。 Input 第一行:一个整数N,表示项链的长度。 第二行:N个整数,表示依次表示项链中贝壳的编号(编号为0到1000000之间的整数)。 第三行:一个整数M,表示HH询问的个数。 接下来M行:每行两个整数,L和R(1 ≤ L ≤ R ≤ N),表示询问的区间。 N ≤ 50000,M ≤ 200000。 Output M行,每行一个整数,依次表示询问对应的答案。 Sample Input 6 1 2 3 4 3 5 3 1 2 3 5 2 6 Sample Output 2 2 4 题解: 基础 莫队。想通过莫队过掉这题的话,去bzoj上提交可以AC。洛谷的加强了数据,最后两个测试点会TLE。 代码: #include<bits/stdc++.h>

bzoj 1878 HH的项链

删除回忆录丶 提交于 2019-11-26 11:06:47
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 8273 Solved: 4004 Description HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此他的项链变得越来越长。有一天,他突然提出了一 个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只 好求助睿智的你,来解决这个问题。 Input 第一行:一个整数N,表示项链的长度。 第二行:N个整数,表示依次表示项链中贝壳的编号(编号为0到1000000之间的整数)。 第三行:一个整数M,表示HH询问的个数。 接下来M行:每行两个整数,L和R(1 ≤ L ≤ R ≤ N),表示询问的区间。 N ≤ 50000,M ≤ 200000。 Output M行,每行一个整数,依次表示询问对应的答案。 Sample Input 6 1 2 3 4 3 5 3 1 2 3 5 2 6 Sample Output 2 2 4 题解: 基础 莫队。想通过莫队过掉这题的话,去bzoj上提交可以AC。洛谷的加强了数据,最后两个测试点会TLE。 代码: #include<bits/stdc++.h>

BZOJ 3261: 最大异或和 可持久化trie

百般思念 提交于 2019-11-26 08:29:18
模板题,刷点数据结构 ~ code: #include <bits/stdc++.h> #define N 600009 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int rt[N],sum[N],tot; struct node { int ch[2],cnt; }t[N*28]; void insert(int a,int b,int len,int num) { if(len<0) return; int o=(num>>len)&1; t[b].ch[o^1]=t[a].ch[o^1]; t[b].ch[o]=++tot; t[t[b].ch[o]].cnt=t[t[a].ch[o]].cnt+1; insert(t[a].ch[o],t[b].ch[o],len-1,num); } int query(int l,int r,int len,int x) { if(len<0) return 0; int o=(x>>len)&1; if(t[t[r].ch[o^1]].cnt>t[t[l].ch[o^1]].cnt) { return (1<<len)+query(t[l].ch[o^1],t[r].ch[o^1],len-1,x); } else { return query(t[l