得分: \(20+0+40=60\)(\(T1\)大暴力,\(T2\)分类讨论写挂,\(T3\)分类讨论\(40\)分)

\(T1\):天空碎片

一道神仙数学题,貌似需要两次使用中国剩余定理

反正不会做。

\(T2\):未来拼图

通过题目描述,我们可以发现,这道题就是让你求出一个多项式,使其与自己循环卷积能够得到给定的式子。(类似于多项式开方

则我们可以先考虑将这个式子\(DFT\)成点值表示法,然后将每个数开方。

由于每个数的平方根有两个,因此我们需要逐一枚举其正负性。

又考虑到其第\(1\sim n-1\)项是对称的,因此需枚举的项个数减半,效率也就大大提高。

然后,对于每一个序列,我们将其\(IDFT\)回原来的式子,暴力验证其正确性。

如果正确,则我们将其扔入\(set\)(因此这个序列需要用\(vector\)存储),这样一来可以去重,以来也方便求出字典序最小的序列。

最后方案数就是\(set\)的\(size()\),字典序最小的解就是\(set\)中的第一项。

代码如下:

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 25
#define DB double
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define INF 1e9
using namespace std;
int n,a[N+5];
class PolynomialSolver
{
private:
typedef vector<int> V;V K;set<V> S;
struct Complex//定义复数
{
DB x,y;I Complex(Con DB& a=0,Con DB& b=0):x(a),y(b){}
I Complex operator - () const {return Complex(-x,-y);}//取负
I Complex operator + (Con Complex& t) const {return Complex(x+t.x,y+t.y);}//复数加法
I Complex operator - (Con Complex& t) const {return Complex(x-t.x,y-t.y);}//复数减法
I Complex operator * (Con Complex& t) const {return Complex(x*t.x-y*t.y,x*t.y+y*t.x);}//复数乘法
}s[N+5],w[N+5],BackUp[N+5],Copy[N+5];
I Complex Sqrt(Con Complex& x)//开平方(取任一平方根,因为之后会枚举正负性)
{
Reg DB Ang=atan2(x.y,x.x),Len=sqrt(x.x*x.x+x.y*x.y);//求出原先复数的辐角与模长
return Ang/=2,Len=sqrt(Len),Complex(Len*cos(Ang),Len*sin(Ang));//辐角除以2,模长开平方,求出开平方后的复数
}
I void BruteForceFT(Complex* s)//DFT与IDFT
{
RI i,j;for(i=0;i^n;++i) BackUp[i]=s[i];//先复制一份
for(i=0;i^n;++i) for(s[i]=Complex(),j=0;j^n;++j) s[i]=s[i]+BackUp[j]*w[i*j%n];//进行变换
}
I bool Check(V k,int* tar)//验证一个解的合法性
{
RI i,j,t;for(i=1;i^n;++i) if(k[i]^k[n-i]) return false;//如果不满足对称性,返回false
for(i=0;i^n;++i)//枚举第i个位置
{
for(t=j=0;j^n;++j) t+=k[j]*k[(i-j+n)%n];//枚举第j个位置给第i个位置的贡献
if(t^tar[i]) return false;//如果第i个位置算出的值与给定序列中第i位上的值不相等,则返回false
}return true;//返回true
}
public:
I void Solve(int* v)//求解答案
{
RI i,j,p=n+2>>1,lim=1<<p,tot=0;Reg DB theta=2*acos(-1)/n;
for(i=0;i^n;++i) w[i]=Complex(cos(theta*i),sin(theta*i));//预处理出单位根,用于做DFT
for(i=0;i^n;++i) s[i]=v[i];for(BruteForceFT(s),i=0;i^n;++i) s[i]=Sqrt(s[i]);//DFT一遍,然后将每个数开方
for(i=0;i^n;++i) w[i].y=-w[i].y;//将单位根的虚部取负,用于做IDFT
for(S.clear(),i=0;i^lim;++i)//枚举根的正负性
{
for(j=0;j^n;++j) Copy[j]=(i>>min(j,n-j))&1?-s[j]:s[j];//复制一份
for(BruteForceFT(Copy),K.clear(),j=0;j^n;++j) K.push_back(max(Copy[j].x/n,0)+0.5);//IDFT一遍,求出数列
Check(K,a)&&(S.insert(K),0);//验证其正确性,如果正确则扔入set
}if(S.empty()) return (void)(puts("0"));printf("%d ",S.size());//如果为空,输出0表示无解,否则输出set的大小表示方案数
for(K=*S.begin(),i=0;i^n;++i) printf("%d ",K[i]);putchar('\n');//输出set中的第一项,即字典序最小的答案
}
}P;
int main()
{
freopen("puzzle.in","r",stdin),freopen("puzzle.out","w",stdout);
RI Ttot,i;scanf("%d",&Ttot);W(Ttot--)
{
for(scanf("%d",&n),i=0;i^n;++i) scanf("%d",&a[i]);//读入
P.Solve(a);//求解
}return 0;
}

\(T3\):完美理论

我们可以考虑枚举一个点,作为两棵树共同的根节点。

然后,我们强制若选择一个节点,就必须选择其父节点,这样就可以保证连通性了。

于是这就成为了一个经典的最大权闭合图的模板,可以用网络流做。

我们从每个节点向其在两棵树中的父节点分别连一条边权为\(INF\)的边,然后从源向权值为正的点连一条容量为点权的边,并从权值为负的点向汇连一条容量为点权相反数的边。

再求出正点权总和减去最大流的值,就是以该点为根时的最优答案了。

最后把以每个点为根的答案取个\(max\),就是最终答案了。

代码如下:

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100
#define min(x,y) ((x)<(y)?(x):(y))
#define Gmax(x,y) (x<(y)&&(x=(y)))
#define INF 1e9
using namespace std;
int n,a[N+5];
class Tree//存储一棵树
{
private:
int ee;
I void dfs(CI x) {for(RI i=lnk[x];i;i=e[i].nxt) e[i].to^fa[x]&&(fa[e[i].to]=x,dfs(e[i].to),0);}//遍历树
public:
int fa[N+5],lnk[N+5];struct edge {int to,nxt;}e[N<<1];
I void add(CI x,CI y) {e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y;}//建边
I void Clear() {ee=0,memset(lnk,0,sizeof(lnk));}//清空
I void MR(CI x) {fa[x]=0,dfs(x);}//将点x作为根,现将其父节点赋为0,然后dfs
}T1,T2;
class Dinic//Dinic跑网络流
{
private:
#define add(x,y,v) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y,e[ee].Cap=v)
static const int Psz=N+2,Lsz=6*N;int ee,lnk[Psz+5],cur[Psz+5],q[Psz+5],dep[Psz+5];
struct edge {int to,nxt,Cap;}e[Lsz+5];
I bool BFS()//BFS找增广路
{
RI i,k,H=1,T=1;memset(dep,0,sizeof(dep)),dep[q[1]=s]=1;W(H<=T&&!dep[t])
for(i=lnk[k=q[H++]];i;i=e[i].nxt) e[i].Cap&&!dep[e[i].to]&&(dep[q[++T]=e[i].to]=dep[k]+1);
return dep[t]?(memcpy(cur,lnk,sizeof(lnk)),true):false;
}
I int DFS(CI x,RI f)//DFS统计流量
{
if(!(x^t)||!f) return f;RI i,t,res=0;
for(i=cur[x];i;i=e[i].nxt)
{
if(cur[x]=i,(dep[x]+1)^dep[e[i].to]||!(t=DFS(e[i].to,min(f,e[i].Cap)))) continue;
if(e[i].Cap-=t,e[((i-1)^1)+1].Cap+=t,res+=t,!(f-=t)) break;
}return !res&&(dep[x]=-1),res;
}
public:
int s,t;I Dinic() {s=1,t=2;}I int P(CI x) {return x+2;}
I void Clear() {ee=0,memset(lnk,0,sizeof(lnk));}//清空数组
I void Add(CI x,CI y,CI v) {add(x,y,v),add(y,x,0);}//建边
I int MaxFlow() {RI res=0;W(BFS()) res+=DFS(s,INF);return res;}//求最大流
#undef add
}D;
int main()
{
freopen("theory.in","r",stdin),freopen("theory.out","w",stdout);
RI Ttot,i,j,x,y,sum,ans,t;scanf("%d",&Ttot);W(Ttot--)
{
for(ans=sum=0,scanf("%d",&n),T1.Clear(),T2.Clear(),i=1;i<=n;++i) scanf("%d",&a[i]),a[i]>0&&(sum+=a[i]);//读入数据,统计正点权总和
for(i=1;i^n;++i) scanf("%d%d",&x,&y),T1.add(x,y),T1.add(y,x);//建边
for(i=1;i^n;++i) scanf("%d%d",&x,&y),T2.add(x,y),T2.add(y,x);//建边
for(i=1;i<=n;++i)
{
for(T1.MR(i),T2.MR(i),D.Clear(),j=1;j<=n;++j) a[j]>0?D.Add(D.s,D.P(j),a[j]):D.Add(D.P(j),D.t,-a[j]);//以i为根,从源向权值为正的点连边,并从权值为负的点向汇连边
for(j=1;j<=n;++j) T1.fa[j]&&(D.Add(D.P(j),D.P(T1.fa[j]),INF),0),T2.fa[j]&&(D.Add(D.P(j),D.P(T2.fa[j]),INF),0);//向父节点连边
t=D.MaxFlow(),Gmax(ans,sum-t);//更新答案
}printf("%d\n",ans);//输出答案
}return 0;
}

2019.03.09 ZJOI2019模拟赛 解题报告的更多相关文章

  1. 2019.03.19 ZJOI2019模拟赛 解题报告

    得分: \(100+10+45=155\)(\(T1\)又是水题,\(T2\)写暴力,\(T3\)大力\(STL\)乱搞) \(T1\):哈夫曼树 首先,根据题目中给出的式子,可以发现,我们要求的其实 ...

  2. 2019.03.02 ZJOI2019模拟赛 解题报告

    得分: \(10+0+40=50\)(\(T1\),\(T3\)只能写大暴力,\(T2\)压根不会) \(T1\):道路建造 应该是一道比较经典的容斥题,可惜比赛时没有看出来. 由于要求最后删一条边或 ...

  3. 2019.03.13 ZJOI2019模拟赛 解题报告

    得分: \(55+12+10=77\)(\(T1\)误认为有可二分性,\(T2\)不小心把\(n\)开了\(char\),\(T3\)直接\(puts("0")\)水\(10\)分 ...

  4. 2019.03.14 ZJOI2019模拟赛 解题报告

    得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...

  5. 2019.03.15 ZJOI2019模拟赛 解题报告

    得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...

  6. 2019.03.16 ZJOI2019模拟赛 解题报告

    得分: \(100+27+20=147\)(\(T1\)巨水,\(T2,T3\)只能写暴力分) \(T1\):深邃 比较套路的一眼题,显然是一个二分+贪心,感觉就是\(NOIP2018Day1T3\) ...

  7. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  8. 2018.10.26NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 70\) 实际得分:\(40 + 100 + 70\) 妈妈我又挂分了qwq..T1过了大样例就没管,直到临考试结束前\(10min\)才发现大样例是假 ...

  9. 2018.10.17NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 +100\) 实际得分:\(100 + 100 + 60\) 辣鸡模拟赛.. 5min切掉T1,看了一下T2 T3,感觉T3会被艹爆因为太原了.. 淦了20 ...

随机推荐

  1. AdvancedEncryptionStandard

    import java.security.GeneralSecurityException; import javax.crypto.Cipher; import javax.crypto.spec. ...

  2. 6.过滤器(Filter)

    ---恢复内容开始--- 1.过滤器简介: 过滤器是一个用于拦截在数据源和数据目的地之间消息的一个对象. 过滤器 功能: 分析请求,将请求发送给指定的资源或自己创建一个响应返回:在请求到达服务器端前处 ...

  3. java生成复杂word文档

    在Web应用中,有时需要按照固定的模板将数据导出到Word,如流程审批单,在流程处理完成后将处理过程按照流程单的要求导出,有时程序中需要实现生成 标准Word文档,要求能够打印,并且保持页面样式不变, ...

  4. [转]js 判断js函数、变量是否存在

    本文转自:http://blog.csdn.net/liang4571231/article/details/4042519 在进行js编程时,总会出现可能一些函数或者变量未定义而被引用,导致报错的情 ...

  5. LeetCode 870.优势洗牌(C++)

    给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述. 返回 A 的任意排列,使其相对于 B 的优势最大化. 示例 1: 输入: ...

  6. WebGL 踩坑系列-3

    WebGL 踩坑系列-3 绘制球体 在 WebGL 中绘制物体时需要的顶点是以直角坐标表示的, 当然了,gl_Position 是一个四维的向量,一般将顶点赋值给 gl_Position 时,最后一维 ...

  7. POJ 3259——Wormholes——————【最短路、SPFA、判负环】

    Wormholes Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit St ...

  8. vue学习中遇到的onchange、push、splice、forEach方法使用

    最近在做vue的练习,发现有些js中的基础知识掌握的不牢,记录一下: 1.onchange事件:是在域的内容改变时发生,单选框与复选框改变后触发的事件. 2.push方法:向数组的末尾添加一个或多个元 ...

  9. ES增删改查入门1

    1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful接口URL的格式: http://localhost:9200/ ...

  10. SQL链接字符串

    Windows身份验证:  Data Source=.;Initial Catalog=MyItcast;Integrated Security=True 数据库身份验证:      Data Sou ...