HDU校赛 | 2019 Multi-University Training Contest 1
2019 Multi-University Training Contest 1
http://acm.hdu.edu.cn/contests/contest_show.php?cid=848
1001. Blank
这题我打比赛的时候想到正解了没敢写...
设\(f_{a,b,c,d}\)表示\(\{0,1,2,3\}\)最后一次出现的位置排序之后的结果,那么每次枚举四种情况转移就好了。
复杂度\(O(Tn^4)\),由于转移的循环除了个\(4!\)的常数所以跑的很快。
#include<bits/stdc++.h>
using namespace std;
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
#define lf double
#define pii pair<int,int >
#define vec vector<int >
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++)
const int maxn = 1e6+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 998244353;
int f[2][102][102][102],n,m,ans;
vector<pii > s[102];
void add(int &x,int y) {x+=y;if(x>=mod) x-=mod;}
int check(int a,int b,int c,int d) {
for(vector<pii > :: iterator i=s[a].begin();i!=s[a].end();i++)
if((b>=i->fr)+(c>=i->fr)+(d>=i->fr)+1!=i->sc) return 0;
return 1;
}
void solve() {
read(n),read(m);
for(int i=1,l,r,x;i<=m;i++) read(l),read(r),read(x),s[r].pb(mp(l,x));
f[0][0][0][0]=1;
for(int a=0,t=0;a<=n;a++,t^=1) {
for(int b=0;b<=a+1;b++)
for(int c=0;c<=b;c++)
for(int d=0;d<=c;d++)
f[t^1][b][c][d]=0;
for(int b=0;b<(a?a:1);b++)
for(int c=0;c<(b?b:1);c++)
for(int d=0;d<(c?c:1);d++) {
if(!check(a,b,c,d)) continue;
add(f[t^1][b][c][d],f[t][b][c][d]);
add(f[t^1][a][c][d],f[t][b][c][d]);
add(f[t^1][a][b][d],f[t][b][c][d]);
add(f[t^1][a][b][c],f[t][b][c][d]);
if(a==n) add(ans,f[t][b][c][d]);
}
}
write(ans);
}
void clear() {
ans=0;
memset(f,0,sizeof f);
for(int i=1;i<=n;i++) s[i].clear();
}
int main() {
int t;read(t);while(t--) solve(),clear();
return 0;
}
1002. Operation
赛后改的。。
考虑记录前缀线性基,然后我们模仿单调队列,贪心的让每一位的位置尽可能的靠后。
实现的话考虑对线性基每一位记录这一位最前出现的位置,这是因为这一位可能是很多数异或起来的,取最前面那个,实现可以参照代码。
复杂度\(O(Tn\log n)\)。
#include<bits/stdc++.h>
using namespace std;
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
#define lf double
#define pii pair<int,int >
#define vec vector<int >
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++)
const int maxn = 1e6+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 1e9+7;
int v[maxn],n,a[maxn][31],p[maxn][31],m;
void append(int x,int pos) {
for(int i=30;~i;i--) a[pos][i]=a[pos-1][i],p[pos][i]=p[pos-1][i];
int pps=pos;
for(int i=30;~i;i--)
if(x&(1<<i)) {
if(!a[pps][i]) {a[pps][i]=x;p[pps][i]=pos;return ;}
if(pos>p[pps][i]) swap(x,a[pps][i]),swap(pos,p[pps][i]);
x^=a[pps][i];
}
}
int query(int l,int r) {
int ans=0;
for(int i=30;~i;i--)
if(p[r][i]>=l&&(ans^a[r][i])>ans) ans^=a[r][i];
return ans;
}
void solve() {
read(n),read(m);
for(int i=1,x;i<=n;i++) read(x),append(x,i);
int la=0;
for(int i=1;i<=m;i++) {
int op,l,r;read(op);
if(op==0) {
read(l),read(r);l=(l^la)%n+1,r=(r^la)%n+1;if(l>r) swap(l,r);
write(la=query(l,r));
} else {
read(r);r=r^la;append(r,++n);
}
}
}
void clear() {
for(int i=1;i<=n;i++) {
memset(a[i],0,sizeof a[i]);
memset(p[i],0,sizeof p[i]);
}
}
int main() {
int t;read(t);while(t--) solve(),clear();
return 0;
}
1004. Vacation
二分答案,然后从后往前枚举判断就好了。
复杂度\(O(Tn\log v)\)。
#include<bits/stdc++.h>
using namespace std;
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
#define lf double
#define pii pair<int,int >
#define vec vector<int >
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++)
const int maxn = 1e5+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 1e9+7;
int n,l[maxn],s[maxn],v[maxn];
int check(lf t) {
lf lim=-1e9;
for(int i=n;~i;i--) {
lf tmp=(lf)s[i]-(lf)v[i]*t;
if(tmp>lim) lim=tmp;
lim+=l[i];
}//printf("lim :: %.6lf\n",lim);
return lim-l[0]<=0;
}
void solve() {
for(int i=0;i<=n;i++) read(l[i]);
for(int i=0;i<=n;i++) read(s[i]);
for(int i=0;i<=n;i++) read(v[i]);
lf l=0,r=1e9;
while(fabs(r-l)>1e-8) {
lf mid=(l+r)*0.5;
if(check(mid)) r=mid;
else l=mid;
}printf("%.8lf\n",l);
}
int main() {
while(scanf("%d",&n)!=EOF) solve();
return 0;
}
1005. Path
建出最短路径图,求最小割。
代码挖坑。
1012. Sequence
首先我们把\(a\)写成生成函数\(\sum_{i=1}^{n}a_ix^i\)。
对于一次\(k\)操作,显然\(a\)的生成函数会乘上\(\sum_{i\geqslant 0}x^{ik}\)。
显然顺序不影响答案。
那么统计一下每个操作出现了多少次,答案就是:
\]
注意到:
\]
所以做三遍\(\rm NTT\)就可以了,复杂度\(O(Tn\log n)\)。
#include<bits/stdc++.h>
using namespace std;
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
#define lf double
#define pii pair<int,int >
#define vec vector<int >
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++)
#define ll long long
const int maxn = 1e6+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 998244353;
int n,m,a[maxn],t[4],b[maxn],N,bit,pos[maxn],w[maxn],mxn,fac[maxn],ifac[maxn];
int qpow(int a,int x) {
int res=1;
for(;x;x>>=1,a=1ll*a*a%mod) if(x&1) res=1ll*res*a%mod;
return res;
}
int add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
int del(int x,int y) {return x-y<0?x-y+mod:x-y;}
void prepare() {
for(mxn=1,bit=0;mxn<=n*2;mxn<<=1,bit++);N=mxn;
w[0]=1,w[1]=qpow(3,(mod-1)/mxn),fac[0]=ifac[0]=1;
for(int i=2;i<=N;i++) w[i]=1ll*w[i-1]*w[1]%mod;
for(int i=1;i<N;i++) pos[i]=pos[i>>1]>>1|((i&1)<<(bit-1));
for(int i=1;i<m;i++) fac[i]=1ll*fac[i-1]*i%mod;
for(int i=1;i<m;i++) ifac[i]=1ll*ifac[i-1]*qpow(i,mod-2)%mod;
}
void ntt(int *r,int op) {
for(int i=1;i<N;i++) if(pos[i]>i) swap(r[i],r[pos[i]]);
for(int i=1,d=mxn>>1;i<N;i<<=1,d>>=1)
for(int j=0;j<N;j+=i<<1)
for(int k=0;k<i;k++) {
int x=r[j+k],y=1ll*r[i+j+k]*w[k*d]%mod;
r[j+k]=add(x,y),r[i+j+k]=del(x,y);
}
if(op==-1) {
reverse(r+1,r+N);int d=qpow(N,mod-2);
for(int i=0;i<N;i++) r[i]=1ll*r[i]*d%mod;
}
}
int c(int a,int b) {return 1ll*fac[a]*ifac[b]%mod*ifac[a-b]%mod;}
void calc(int k) {
for(int i=0;i<N;i++) b[i]=0;
b[0]=1;
for(int i=1;i*k<=n;i++) b[i*k]=c(i+t[k]-1,t[k]-1);
ntt(a,1),ntt(b,1);
for(int i=0;i<N;i++) a[i]=1ll*a[i]*b[i]%mod;
ntt(a,-1);
for(int i=n+1;i<N;i++) a[i]=0;
}
void solve() {
read(n),read(m);prepare();
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1,x;i<=m;i++) read(x),t[x]++;
for(int i=1;i<=3;i++) calc(i);ll ans=0;
for(int i=1;i<=n;i++) ans^=1ll*i*a[i];
printf("%lld\n",ans);
}
void clear() {
t[1]=t[2]=t[3]=0;
for(int i=0;i<N;i++) a[i]=b[i]=0;
}
int main() {
int t;read(t);while(t--) solve(),clear();
return 0;
}
HDU校赛 | 2019 Multi-University Training Contest 1的更多相关文章
- HDU校赛 | 2019 Multi-University Training Contest 6
2019 Multi-University Training Contest 6 http://acm.hdu.edu.cn/contests/contest_show.php?cid=853 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 5
2019 Multi-University Training Contest 5 http://acm.hdu.edu.cn/contests/contest_show.php?cid=852 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 4
2019 Multi-University Training Contest 4 http://acm.hdu.edu.cn/contests/contest_show.php?cid=851 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 3
2019 Multi-University Training Contest 3 http://acm.hdu.edu.cn/contests/contest_show.php?cid=850 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 2
2019 Multi-University Training Contest 2 http://acm.hdu.edu.cn/contests/contest_show.php?cid=849 100 ...
- hdu 4930 Fighting the Landlords--2014 Multi-University Training Contest 6
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 Fighting the Landlords Time Limit: 2000/1000 MS ...
- HDU 6143 - Killer Names | 2017 Multi-University Training Contest 8
/* HDU 6143 - Killer Names [ DP ] | 2017 Multi-University Training Contest 8 题意: m个字母组成两个长为n的序列,两序列中 ...
- HDU 6074 - Phone Call | 2017 Multi-University Training Contest 4
看标程的代码这么短,看我的.... 难道是静态LCA模板太长了? /* HDU 6074 - Phone Call [ LCA,并查集 ] | 2017 Multi-University Traini ...
- HDU 6068 - Classic Quotation | 2017 Multi-University Training Contest 4
/* HDU 6068 - Classic Quotation [ KMP,DP ] | 2017 Multi-University Training Contest 4 题意: 给出两个字符串 S[ ...
随机推荐
- Fluent设置充分发展湍流入口(利用profile)
计算模型: 物性参数为: 密度:100kg/m3 粘度系数:0.003333kg/(m·s) 原视频下载地址: https://pan.baidu.com/s/1W3n_K-dZCVMF7M63wV2 ...
- Debian系Linux 发行版 源配置说明
概述: 本文是在逛论坛是的发现,借鉴过来,以便学习.源列表主文件 /etc/apt/sources.list同时也可创建独立的源配置文件到 /etc/apt/sources.list.d/* 下 so ...
- ubuntu之路——day19.1 深度CNN的探究
1.经典的CNN LeNet-5 1998的CNN鼻祖 以前用的sigmoid和tanh 下图给的是relu和softmax AlexNet ImageNet2012的冠军 VGG-16 ImageN ...
- EventHandler
表示将处理不包含事件数据的事件的方法 作用:这句话的意思就是把这两个事放在一起了,意思就是叫你吃完饭了喊我一声.我委托你吃完饭了,喊我一声.这样我就不用过一会就来看一下你吃完了没有了,已经委托你了.
- Pushing state-of-the-art in 3D content understanding
Pushing state-of-the-art in 3D content understanding 2019-10-31 06:34:08 This blog is copied from: h ...
- Attribute application@allowBackup value=(true) from AndroidManifest.xml:7:9-35
1: 在 AndroidManifest.xml 配置文件中显式配置 android:allowBackup=false. 项目中代码 allowBackup="true" 改为 ...
- angular自定义module
在app.module.ts里面,imports部分,添加你的自定义模块名在你的自定义模块内,添加了component以后,需要添加exports导出,类似下面 import { NgModule } ...
- Flutter Plugin开发简单示例
新建Plugin项目: flutter create --template=plugin -i swift -a javahello lib/hello.dart: 插件包的Dart API. and ...
- Golang常见小细节总结(1)
本系列不定期更新,用于记录平常开发过程中出现的一些小问题 Array 类型的值作为函数参数    可以理解slice是对array的一个视图,底层还是array所以会被修改 通过map的ok来确 ...
- Thinkphp5 实现动态模板主题多个模板切换
在项目开发过程中会遇到一个网站有不同风格,本文详细介绍Thinkphp5 实现模板主题多个模板切换 一.在Config中配置view_path模板路径代码如下 1 2 3 4 5 6 7 8 9 10 ...