20191102 「HZOJ NOIP2019 Round #12」20191102模拟
先开坑。
md原题写挂我也真是。。。
100+20+10
白夜
打表大法吼
显然,不在环上的点对答案的贡献是 \((k-cycle)^{k-1}\) 。
打表得到环上的递推式,矩阵一下乘起来就好了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
}
const int maxn=100007;
const int maxm=200007;
const int mod=998244353;
int n,T;
int Head[maxn],to[maxm],Next[maxm],tot=1;
int aa,bb,k;
bool vis[maxn];
int col[maxn];
int size[maxn],top[maxn],dep[maxn],fa[maxn];
int son[maxn];
void add(int x,int y){
to[++tot]=y,Next[tot]=Head[x],Head[x]=tot;
}
namespace baoli{
bool check(int x){
vis[x]=1;
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(col[y]==col[x]) return false;
if(vis[y]) continue;
bool tmp=check(y);
if(tmp==false) return false;
}
if(x==aa){
if(col[aa]==col[bb]) return false;
if(!vis[bb]){
bool tmp=check(bb);
if(tmp==false) return false;
}
}
if(x==bb){
if(col[aa]==col[bb]) return false;
if(!vis[aa]){
bool tmp=check(aa);
if(tmp==false) return false;
}
}
return true;
}
int dfs(int step){
if(step==n+1){
memset(vis,0,sizeof(vis));
if(check(1)) return 1;
else return 0;
}
int res=0;
for(int i=1;i<=k;i++){
col[step]=i;
res=(res+dfs(step+1))%mod;
}
return res;
}
void MAIN(){
while(T--){
read(aa);read(bb);read(k);
if(k==1&&n!=1){
puts("0");continue;
}
printf("%lld\n",dfs(1));
}
}
}
namespace Try{
struct Matrix{
int mat[4][4],n;
Matrix(){
memset(mat,0,sizeof(mat));
n=2;
}
void reset(){
for(int i=1;i<=n;i++) mat[i][i]=1;
}
};
Matrix Mul(Matrix a,Matrix b){
Matrix c;c.n=a.n;
int l=a.n;
for(int i=1;i<=l;i++){
for(int j=1;j<=l;j++){
for(int k=1;k<=l;k++){
c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j]%mod);
c.mat[i][j]%=mod;
}
}
}
return c;
}
Matrix fpow(Matrix x,int p){
Matrix res;res.reset();
while(p){
if(p&1) res=Mul(res,x);p>>=1;
x=Mul(x,x);
}
return res;
}
int ksm(int x,int p){
int res=1;
while(p){
if(p&1) res=res*x%mod;p>>=1;
x=x*x%mod;
}
return res;
}
void dfs1(int x,int f,int dp){
dep[x]=dp,fa[x]=f,size[x]=1;
int mx=-1;
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(y==f) continue;
dfs1(y,x,dp+1);
size[x]+=size[y];
if(size[y]>mx) son[x]=y,mx=size[y];
}
}
void dfs2(int x,int tp){
top[x]=tp;
if(!son[x]) return;
dfs2(son[x],tp);
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(y==son[x]||y==fa[x]) continue;
dfs2(y,y);
}
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
return x;
}
int calc(int cyc){
if(cyc==1) return 0;
if(cyc==2){
return k*(k-1)%mod;
}
Matrix base,ans;
base.mat[1][1]=k-2,base.mat[1][2]=k-1,base.mat[2][1]=1;
ans.mat[1][1]=k*(k-1)%mod;
ans=Mul(ans,fpow(base,cyc-2));
return ans.mat[1][1];
}
void MAIN(){
dfs1(1,0,1);dfs2(1,1);
int x,y,ans=0;
while(T--){
read(x);read(y);read(k);
int lc=lca(x,y);int cyc=dep[x]+dep[y]-2*dep[lc]+1;
ans=ksm(k-1,n-cyc);
ans=(ans*calc(cyc))%mod;
printf("%lld\n",ans);
}
}
}
signed main(){
freopen("night.in","r",stdin);freopen("night.out","w",stdout);
read(n);
for(int x,i=2;i<=n;i++){
read(x);
add(x,i);add(i,x);
}
read(T);
Try::MAIN();
fclose(stdin);fclose(stdout);
return 0;
}
光明
区间最大字段和
GSS系列
样例太弱了...
这题被 \(O(n^2)\) 氧化钙过去了。。。
订正后代码:
using namespace std;
template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
}
const int maxn=100007;
int n,T;
int w[maxn];
int xx[maxn],yy[maxn];
#define lfc (x<<1)
#define rgc ((x<<1)|1)
#define mid ((l+r)>>1)
struct node{
int sum,lf,rg,val;
};
int sum[maxn<<2],val[maxn<<2],rg[maxn<<2],lf[maxn<<2];
void pushup(int x){
sum[x]=sum[lfc]+sum[rgc];
lf[x]=max(lf[lfc],sum[lfc]+lf[rgc]);
rg[x]=max(rg[rgc],sum[rgc]+rg[lfc]);
val[x]=max(max(val[lfc],val[rgc]),lf[rgc]+rg[lfc]);
}
void build(int x,int l,int r){
if(l==r){
int fff=1;
if(xx[l]%2==1&&yy[l]%2==1) fff=-1;
val[x]=sum[x]=lf[x]=rg[x]=fff*w[l];return;
}
build(lfc,l,mid);build(rgc,mid+1,r);
pushup(x);
}
int L,R,need;
node query(int x,int l,int r){
if(L<=l&&r<=R) return (node){sum[x],lf[x],rg[x],val[x]};
if(L>mid) return query(rgc,mid+1,r);
if(R<=mid) return query(lfc,l,mid);
node res,a1=query(lfc,l,mid),a2=query(rgc,mid+1,r);
res.sum=a1.sum+a2.sum;
res.lf=max(a1.lf,a1.sum+a2.lf);
res.rg=max(a2.rg,a1.rg+a2.sum);
res.val=max(max(a1.val,a2.val),a1.rg+a2.lf);
return res;
}
void change_val(int x,int l,int r){
if(l==r){
int fff=1;
if(xx[l]%2==1&&yy[l]%2==1) fff=-1;
val[x]=sum[x]=lf[x]=rg[x]=fff*need;
return;
}
if(L<=mid) change_val(lfc,l,mid);
else change_val(rgc,mid+1,r);
pushup(x);
}
int fffff;
void change_qf(int x,int l,int r){
if(l==r){
sum[x]=lf[x]=rg[x]=val[x]=-w[l]*fffff;
return;
}
if(L<=mid) change_qf(lfc,l,mid);
else change_qf(rgc,mid+1,r);
pushup(x);
}
void cz1(){
int a,b;
read(L);read(a);read(b);
if(a%2==1&&b%2==1){fffff=1;
change_qf(1,1,n);}
else{
fffff=-1;
change_qf(1,1,n);
}
xx[L]=a,yy[L]=b;
}
void cz2(){
read(L);read(need);
change_val(1,1,n);
w[L]=need;
}
void cz3(){
read(L);read(R);
printf("%d\n",query(1,1,n).val);
}
int main(){
freopen("light.in","r",stdin);freopen("light.out","w",stdout);
read(n);
for(int i=1;i<=n;i++) read(w[i]);
for(int i=1;i<=n;i++){
read(xx[i]);read(yy[i]);
}
build(1,1,n);
read(T);int op;
while(T--){
read(op);
if(op==1) cz1();
if(op==2) cz2();
if(op==3) cz3();
}
return 0;
}
暗雪
区间Dp+四边形不等式优化
这题数据被 \(O(n^4)\) 氧化钙过去了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
}
const int maxn=407;
const int INF=1e18;
int n,kk,a[maxn];
int dp[maxn][maxn][maxn];
int opt[maxn][maxn],s[maxn];
void Init(){
read(n);read(kk);
if(kk<=9&&(1<<kk)<n){
puts("-1");exit(0);
}
for(int i=1;i<=n;i++){
read(a[i]);
}
}
void Work(){
sort(a+1,a+n+1);
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(i==j) dp[i][j][0]=0;
else dp[i][j][0]=INF;
}
}
for(int k=1;k<=kk;k++){
for(int i=1;i<=n;i++) opt[i][i]=i;
for(int len=2;len<=n;len++){
for(int l=1;l+len-1<=n;l++){
int r=l+len-1;
dp[l][r][k]=INF;
for(int p=opt[l][r-1];p<=opt[l+1][r];p++){
if(p+1>r) continue;
int val=dp[l][p][k-1]+dp[p+1][r][k-1]+s[r]-s[l-1];
if(val<dp[l][r][k]){
dp[l][r][k]=val;opt[l][r]=p;
}
}
}
}
}
int div=__gcd(dp[1][n][kk],s[n]);
printf("%lld/%lld\n",dp[1][n][kk]/div,s[n]/div);
}
signed main(){
freopen("snow.in","r",stdin);freopen("snow.out","w",stdout);
Init();
Work();
return 0;
}
20191102 「HZOJ NOIP2019 Round #12」20191102模拟的更多相关文章
- 20191004 「HZOJ NOIP2019 Round #9」20191004模拟
综述 第一次 rk1 ,激动. 题目是 COCI 18/19 Round #1 的三至五题. 得分 \(100+100+20\) \(\mathrm{cipele}\) 问题描述 HZOJ1313 题 ...
- 20191003 「HZOJ NOIP2019 Round #8」20191003模拟
综述 试题为常州集训2019SCDay2 得分\(100+30(0)+28\) 时之终结 问题描述 HZOJ1310 题解 构造题. 发现部分分有一档是 \(Y\) 是 \(2^x\) ,于是自然想到 ...
- 20190922 「HZOJ NOIP2019 Round #7」20190922模拟
综述 这次是USACO2019JAN Gold的题目. \(\mathrm{Cow Poetry}\) 题解 因为每句诗的长度一定是\(k\),所以自然而然想到背包. 设\(opt[i][j]\)代表 ...
- wsoj「G2016 SCOI2018 Round #12」建筑师
传送门 小半个月前的测试,现在翻出来. 考试时我和sxyA了这题. 当时随便搞了个dp,dp[i][j]表示i个数能看到j个的情况数,考虑新加入一个比之前i-1个数都小的数,能看到它的情况是它加到第一 ...
- 「LibreOJ NOI Round #2」不等关系
「LibreOJ NOI Round #2」不等关系 解题思路 令 \(F(k)\) 为恰好有 \(k\) 个大于号不满足的答案,\(G(k)\) 表示钦点了 \(k\) 个大于号不满足,剩下随便填的 ...
- LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿
二次联通门 : LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 /* LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 dp 记录一下前驱 ...
- 「LibreOJ NOIP Round #1」七曜圣贤
题目啰嗦:支持三个操作: 不可重复集合:1.加入一个数 2.删除一个数 3.恢复目前最早的一次删除的数 操作可能不合法,每次有效操作之后求集合的mex(最小没有出现过的数) 50组数据+1e6,必须O ...
- 「LibreOJ NOIP Round #1」旅游路线
Description T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n.每条道路连接这 nnn 个景区中的某两个景 ...
- 「LibreOJ NOI Round #1」验题
麻烦的动态DP写了2天 简化题意:给树,求比给定独立集字典序大k的独立集是哪一个 主要思路: k排名都是类似二分的按位确定过程. 字典序比较本质是LCP下一位,故枚举LCP,看多出来了多少个独立集,然 ...
随机推荐
- Day5- Python基础5 模块导入、time、datetime、random、os、sys、hashlib、json&pickle
本节目录: 1.模块的分类 2.模块的导入 3.time模块 4.datetime模块 5.random 6.os模块 7.sys模块 8.hashlib 9.json&pickle 一.模块 ...
- 从傅里叶变换(FFT)到数论变换(NTT)
FFT可以用来计算多项式乘法,但是复数的运算中含有大量的浮点数,精度较低.对于只有整数参与运算的多项式,有时,\(\text{NTT(Number-Theoretic Transform)}\)会是更 ...
- 剑指Offer-31.整数中1出现的次数(从1到n整数中1出现的次数)(C++/Java)
题目: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.A ...
- 第05组 Alpha冲刺(2/4)
第05组 Alpha冲刺(2/4) 队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了 ...
- Python常用模块实战之ATM和购物车系统再升级
目录 一.项目地址 二.功能需求 一.项目地址 https://github.com/nickchen121/atm 二.功能需求 FUNC_MSG = { '0': '注销', '1': '登录', ...
- 完美解决MacOS catalina 升级后Vmware黑屏的问题
完美解决MacOS catalina 升级后VMware黑屏 1.关闭MacOS的rootless机制 #Rootless机制将成为对抗恶意程序的最后防线 1.尝试关闭Rootless,重启按住 Co ...
- [开源] FreeSql 配套工具,基于 Razor 模板实现最高兼容的生成器
FreeSql 经过半年的开发和坚持维护,在 0.6.x 版本中完成了几大重要事件: 1.按小包拆分,每个数据库实现为单独 dll: 2.实现 .net framework 4.5 支持: 3.同时支 ...
- win7和win10自带桌面便签哪里找
一些小伙伴习惯使用windows自带的便签功能,但win7和win10区别较大, 导致更新系统后不知道在哪里找,甚至以为没有该功能了, 其实不然,下面我总结了2种方法,希望能帮到有需要的人 win7( ...
- eclipse彻底去除validation(彻底解决编辑js文件的卡顿问题)
Eclipse中默认的JS编辑器非常慢,尤其在拷贝粘贴代码时,CPU总是占用很高甚至到100%,也就导致了编辑起来很卡. 这是因为Eclipse中带的Validate功能导致的,这个鸡肋的功能简直让人 ...
- OpenGL入门1.6:坐标系统,3D箱子
每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 我们已经学习了如何利用矩阵变换来对所有顶点进行变换 OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备 ...