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,看多出来了多少个独立集,然 ...
随机推荐
- Less(1)
1.先判断注入类型 (1)首先看到要求,要求传一个ID参数,并且要求是数字型的:?id=1 (2)再输入?id=1' 发现报错 (3)输入?id=1'' 单引号报错,双引号正常显示,判断是字符型注入: ...
- JMeter基础知识系列三
JMeter测试结果字段的意义: Label:定义HTTP请求名称. Samples:表示这次测试中一共发出了多少个请求. Average:平均响应时长,当使用了Transaction Control ...
- 解决SQL Server中无管理员账户权限问题
遇到忘记SQL Server管理员账户密码或管理员账户被意外删除的情况,如何在SQL Server中添加一个新的管理员账户?按一下步骤操作可添加一个windows账户到SQL Server中,并分配数 ...
- django--DateTimeField字段orm操作
django中的models.py是我们用来创建数据库里需要的表的,规定表中各个字段的类型,选择合适的字段类型尤为重要,常用的字段类型有:CharField.choice.IntegerField.T ...
- ReactNative: 使用View组件创建九宫格
一.简言 初学RN,一切皆新.View组件跟我们iOS中UIView类似,作为一个容器视图使用,它主要负责承载其他的子组件.View组件采用的是FlexBox伸缩盒子布局,通过对它的布局可以影响子组件 ...
- 【linux命令】权限管理命令(chattr、lsattr、sudo)
目录 chattr lsattr sudo 一.chattr命令 chattr命令用来修改文件系统的权限属性,只有 root 用户可以使用,建立凌驾于 rwx 基础权限之上的授权. PS:chattr ...
- H5混合应用之上下文切换
一.native/web/hybrid 简介 目前主流应用程序大体分为:Native App(原生应用).Web App(网页应用).Hybrid App(混合应用),它们三者的优缺点比较如下表: 应 ...
- vue 渐变 进度条 progress
废话 不多少说 ,直接上代码 新建文件 gradual-progress.vue <!-- * @Author: gfc * @Date: 2019-11-07 14:00:11 * @Last ...
- (四)初识NumPy(函数和图像的数组表示)
本章节主要介绍NumPy中的三个主要的函数,分别是随机函数.统计函数和梯度函数,以及一个较经典的用数组来表示图像的栗子!,希望大家能有新的收货,共同进步! 一.np.random的随机函数(1) ra ...
- Netty—TCP的粘包和拆包问题
一.前言 虽然TCP协议是可靠性传输协议,但是对于TCP长连接而言,对于消息发送仍然可能会发生粘贴的情形.主要是因为TCP是一种二进制流的传输协议,它会根据TCP缓冲对包进行划分.有可能将一个大数据包 ...