HEOI2016解题报告
树
#include<iostream>
#include<cstdio>
#define N 100009
using namespace std;
int f[N],head[N],tot,n,q,a[N],fa[N],ans[N],top,tag[N];
char c[N];
struct dwd {
int n,to;
} e[N<<];
inline void add(int u,int v) {
e[++tot].n=head[u];
e[tot].to=v;
head[u]=tot;
}
int find(int x) {
return f[x]=f[x]==x?x:find(f[x]);
}
inline char getch() {
char c=getchar();
while(!isalpha(c))c=getchar();
return c;
}
int rd() {
int x=;
char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c)) {
x=(x<<)+(x<<)+(c^);
c=getchar();
}
return x;
}
void dfs(int u,int faa) {
for(int i=head[u]; i; i=e[i].n) {
int v=e[i].to;
if(v==faa)continue;
fa[v]=u;
if(!tag[v])f[v]=u;
else f[v]=v;
dfs(v,u);
}
}
int main() {
n=rd();
q=rd();
int u,v;
for(int i=; i<n; ++i)u=rd(),v=rd(),add(u,v),add(v,u);
tag[]=;
f[]=;
for(int i=; i<=q; ++i) {
c[i]=getch();
a[i]=rd();
if(c[i]=='C')tag[a[i]]++;
}
dfs(,);
for(int i=q; i>=; --i) {
if(c[i]=='C') {
tag[a[i]]--;
if(!tag[a[i]])f[a[i]]=fa[a[i]];
} else ans[++top]=find(a[i]);
}
for(int i=top; i>=; --i)printf("%d\n",ans[i]);
return ;
}
排序
#include<iostream>
#include<cstdio>
#define N 30002
using namespace std;
int la[N<<],tr[N<<],a[N],ji,tag,n,m,l[N],r[N],ta[N],ans,q;
bool b[N];
inline void pushdown(int cnt,int l1,int l2){
int sum=tr[cnt];
if(la[cnt]==){
if(l1>=sum){
tr[cnt<<]=sum;sum=;
}
else{
tr[cnt<<]=l1;sum-=l1;
}
tr[cnt<<|]=sum;
}
else{
if(l2>=sum){
tr[cnt<<|]=sum;sum=;
}
else{
tr[cnt<<|]=l2;sum-=l2;
}
tr[cnt<<]=sum;
}
la[cnt<<]=la[cnt<<|]=la[cnt];la[cnt]=;
}
int dfs(int cnt,int l,int r){
if(l==r)return tr[cnt];
int mid=(l+r)>>;
if(la[cnt])pushdown(cnt,mid-l+,r-mid);
if(mid>=q)dfs(cnt<<,l,mid);
else dfs(cnt<<|,mid+,r);
}
void build(int cnt,int l,int r){
if(l==r){
tr[cnt]=b[l];
return;
}
int mid=(l+r)>>;
build(cnt<<,l,mid);build(cnt<<|,mid+,r);
tr[cnt]=tr[cnt<<]+tr[cnt<<|];//care
}
void gett(int cnt,int l,int r,int L,int R){
if(l>=L&&r<=R){
ji+=tr[cnt];
return;
}
int mid=(l+r)>>;
if(la[cnt])pushdown(cnt,mid-l+,r-mid);
if(mid>=L)gett(cnt<<,l,mid,L,R);
if(mid<R)gett(cnt<<|,mid+,r,L,R);
}
void returnn(int cnt,int l,int r,int L,int R){
if(l>=L&&r<=R){
la[cnt]=tag;
if(ji>=r-l+){
tr[cnt]=r-l+;
ji-=tr[cnt];
}
else{
tr[cnt]=ji;ji=;
}
return;
}
int mid=(l+r)>>;
if(tag==){
if(mid>=L)returnn(cnt<<,l,mid,L,R);
if(mid<R)returnn(cnt<<|,mid+,r,L,R);
}
else{
if(mid<R)returnn(cnt<<|,mid+,r,L,R);
if(mid>=L)returnn(cnt<<,l,mid,L,R);
}
tr[cnt]=tr[cnt<<]+tr[cnt<<|];
}
bool ch(int pos){
for(int i=;i<=n;++i)b[i]=a[i]>=pos?:;
build(,,n);
for(int i=;i<=m;++i){
ji=;
tag=ta[i];
gett(,,n,l[i],r[i]);
returnn(,,n,l[i],r[i]);
}
if(dfs(,,n))return ;
else return ;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
scanf("%d",&a[i]);
for(int i=;i<=m;++i){scanf("%d%d%d",&ta[i],&l[i],&r[i]);if(!ta[i])ta[i]=;}
scanf("%d",&q);
int l=,r=n;
while(l<=r){
int mid=(l+r)>>;
if(ch(mid)){
ans=mid;
l=mid+;
}
else r=mid-;
}
cout<<ans;
return ;
}
序列
佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他。玩具上有一个数列,数列中某些项的值
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,a[][],tot2,tot1,tot,ans,pim[],vis[],head[];
char s[];
struct dv
{
int a,b;
}b[][];
struct fd
{
int next,to;
}an[];
void add(int u,int v)
{
an[++tot].next=head[u];
an[tot].to=v;
head[u]=tot;
}
bool dfs(int pos,int tim)
{
for(int i=head[pos];i;i=an[i].next)
if(vis[an[i].to]!=tim)
{
int v=an[i].to;
vis[v]=tim;
if(!pim[v]||dfs(pim[v],tim))
{
pim[v]=pos;
return true;
}
}
return false;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
scanf("%s",s+);
for(int j=;j<=m;++j)
{
if(s[j]=='*')a[i][j]=;
else if(s[j]=='x')a[i][j]=;
else a[i][j]=;
if(a[i][j]!=)
{
if(a[i][j-]==||j==)b[i][j].a=++tot1;
else b[i][j].a=b[i][j-].a;
if(a[i-][j]==||i==)b[i][j].b=++tot2;
else b[i][j].b=b[i-][j].b;
if(a[i][j]==)add(b[i][j].a,b[i][j].b);
}
}
}
for(int i=;i<=tot1;++i)
if(dfs(i,i))ans++;
cout<<ans<<endl;
return ;
}
求和
在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心。
#include<iostream>
#include<cstdio>
#define N 300002
using namespace std;
typedef long long ll;
const int mod=;
const int Gi=;
const int G=;
ll a[N],b[N],rev[N],n,jie[N],ni[N],ans,l,L;
inline ll rd(){
ll x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
ll power(ll x,ll y){
ll ans=;
while(y){
if(y&)ans=(ans*x)%mod;
y>>=;x=(x*x)%mod;
}
return ans;
}
inline int ny(ll x){return power(x,mod-);}
inline void NTT(ll *a,int tag){
for(int i=;i<l;++i)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int i=;i<l;i<<=){
ll wn=power(tag==?G:Gi,(mod-)/(i<<));
for(int j=;j<l;j+=(i<<)){
ll w=;
for(int k=;k<i;++k,(w*=wn)%=mod){
ll x=a[j+k],y=w*a[j+k+i]%mod;
a[j+k]=(x+y)%mod;a[j+k+i]=(x-y+mod)%mod;
}
}
}
}
int main(){
n=rd();jie[]=;
for(int i=;i<=n;++i)jie[i]=jie[i-]*i%mod;ni[n]=power(jie[n],mod-);
for(int i=n-;i>=;--i)ni[i]=ni[i+]*(i+)%mod;
for(int i=;i<=n;++i)a[i]=(power(-,i)*ni[i]+mod)%mod;
b[]=;b[]=n+;for(int i=;i<=n;++i)b[i]=(power(i,n+)-)*ny((i-)*jie[i]%mod)%mod;
l=,L=;
while(l<(n<<))l<<=,L++;
for(int i=;i<l;++i)rev[i]=(rev[i>>]>>)|((i&)<<(L-));
NTT(a,);NTT(b,);
for(int i=;i<l;++i)a[i]=a[i]*b[i]%mod;
NTT(a,-);int nn=ny(l);
for(int i=;i<l;++i)a[i]=a[i]*nn%mod;
for(int i=;i<=n;++i)ans=(ans+power(,i)*jie[i]%mod*a[i]%mod)%mod;
cout<<ans;
return ;
}
字符串
// luogu-judger-enable-o2
// luogu-judger-enable-o2
%:pragma GCC optimize()
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 100002
#define inf 2e9
#define Re register
using namespace std;
int n,m,tong[N],sa[N],T[N],rank[N],y[N],height[N],p[N][],tr[N*],R[N*],L[N*],tot,a,b,c,d,logg[],lg2[N];
char s[N];
inline int minn(int x,int y){return x<y?x:y;}
inline int maxx(int x,int y){return x<y?y:x;}
inline void write(int a){
if(a>=)write(a/);
putchar(''+a%);
}
inline void writeln(int a){
if(a<){
a=-a; putchar('-');
}
write(a); puts("");
}
inline int rd(){
int x=;char c=getchar();
while(!isdigit(c)){c=getchar();}
while(isdigit(c)){x=x*+(c^);c=getchar();}
return x;
}
inline void qsort(){
for(Re int i=;i<=m;++i)tong[i]=;
for(Re int i=;i<=n;++i)tong[rank[i]]++;
for(Re int i=;i<=m;++i)tong[i]+=tong[i-];
for(Re int i=n;i>=;--i)sa[tong[rank[y[i]]]--]=y[i];
}
void SA(){
m=;
for(Re int i=;i<=n;++i)rank[i]=s[i],y[i]=i;
qsort();
for(Re int w=,p;p<n;m=p,w<<=){
p=;
for(Re int i=n-w+;i<=n;++i)y[++p]=i;
for(Re int i=;i<=n;++i)if(sa[i]>w)y[++p]=sa[i]-w;
qsort();swap(y,rank);rank[sa[]]=p=;
for(Re int i=;i<=n;++i)rank[sa[i]]=((y[sa[i-]]==y[sa[i]])&&(y[sa[i-]+w]==y[sa[i]+w]))?p:++p;
}
height[]=;
for(Re int i=,j;i<=n;++i){
if(rank[i]==)continue;
j=maxx(,height[rank[i-]]-);
while(s[i+j]==s[sa[rank[i]-]+j])j++;
height[rank[i]]=j;
p[rank[i]][]=j;
}
for(Re int i=;logg[i]<=n;++i)
for(Re int j=;j+logg[i]-<=n;++j)p[j][i]=minn(p[j][i-],p[j+logg[i-]][i-]);
}
inline int RMQ(int l,int r){
if(l>r)return inf;
int lo=lg2[r-l+];
return minn(p[l][lo],p[r-logg[lo]+][lo]);
}
bool query(int now,int la,int l,int r,int LL,int RR){
if(l>=LL&&r<=RR)return (tr[now]-tr[la])!=;
Re int mid=(l+r)>>;bool ans=;
if(mid>=LL)ans|=query(L[now],L[la],l,mid,LL,RR);if(ans)return ;
if(mid<RR)ans|=query(R[now],R[la],mid+,r,LL,RR);
return ans;
}
void upd(int &cnt,int la,int l,int r,int x){
cnt=++tot;L[cnt]=L[la];R[cnt]=R[la];tr[cnt]=tr[la]+;
if(l==r)return;Re int mid=(l+r)>>;
if(mid>=x)upd(L[cnt],L[la],l,mid,x);
else upd(R[cnt],R[la],mid+,r,x);
}
void build(int &cnt,int l,int r){
cnt=++tot;if(l==r)return;
int mid=(l+r)>>;build(L[cnt],l,mid);build(R[cnt],mid+,r);
}
bool check(int x,int len){
Re int l=,r=x,zuo=x,you=x;
while(l<=r){
Re int mid=(l+r)>>;
if(RMQ(mid+,x)>=len){
zuo=mid;r=mid-;
}else l=mid+;
}
l=x,r=n;
while(l<=r){
Re int mid=(l+r)>>;
if(RMQ(x+,mid)>=len){
you=mid;l=mid+;
}else r=mid-;
}
if(query(T[you],T[zuo-],,n,a,b-len+))return ;
else return ;
}
inline void gett(){
char c=getchar();while(!isalpha(c))c=getchar();n=;
while(isalpha(c))s[++n]=c,c=getchar();
}
int main(){
n=rd();m=rd();gett();
for(Re int i=;i<=;++i)logg[i]=(<<i);
for(Re int i=;i<=n;++i)lg2[i]=lg2[i>>]+;
SA();
build(T[],,n);
for(Re int i=;i<=n;++i)upd(T[i],T[i-],,n,sa[i]);///care!!!!!!!!!!!!!!
while(m--){
a=rd();b=rd();c=rd();d=rd();
Re int l=c,r=d,ans=c-;r=minn(r,c+b-a);
while(l<=r){
Re int mid=(l+r)>>;
if(check(rank[c],mid-c+)){ans=mid;l=mid+;}
else r=mid-;
}
writeln(ans-c+);
}
return ;
}
HEOI2016解题报告的更多相关文章
- TJOI2016 && HEOI2016 解题报告
好吧我来写一波题解骗访问量QAQ 题目可以在cogs提交 bzoj4551~4456 D1T1 tree 树剖可做,然而有更简单的做法,10min搞定 维护一个并查集,时光倒流,如果当前点没有标记就把 ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
随机推荐
- JS XMLHttpRequesst对象 http post的五种请求状态
记录一下js中对http请求的几种状态,下附代码 readyState 存有 XMLHttpRequest 的状态.从 0 到 4 发生变化. 0: 请求未初始化 1: 服务器连接已建立 2: 请求已 ...
- MYSQL 表大小限制
MySQL 3.22限制的表大小为4GB.由于在MySQL 3.23中使用了MyISAM存储引擎,最大表尺寸增加到了65536TB(2567 – 1字节).由于允许的表尺寸更大,MySQL数据库的最大 ...
- angularjs4+ionic3集成搭建
1:安装一下cnpm用淘宝镜像安装npm install -g cnpm --registry=https://registry.npm.taobao.org 2:使用 cnpm命令安装(全局安装 A ...
- 游标cursor案例
- mysql [assword expired
mysql 5.6 在使用Navicat在其他机器上进行远程登录数据库时 会出现 password expired ,需要重新设置一下密码. SET PASSWORD FOR 'root'@'%' = ...
- EXAMPLE FOR PEEWEE 多姿势使用 PEEWEE
使用 PEEWEE 断断续续的差不多已经三个年头了,但是没有像这次使用这么多的特性和功能,所以这次一并记录一下,需要注意的地方和一些使用细节,之后使用起来可能会更方便. 因为是使用的 SQLAched ...
- DAY03、基本数据类型和运算符
一.基本数据类型的使用 1.整型int: 作用:用来记录年龄.等级.数量 定义:age=18 使用:数学运算与比较运算: 例:print(10>3) print(10/3) 2.浮点型float ...
- 一、zipkin
zipkin是Twitter基于google的分布式监控系统Dapper(论文)的开发源实现,zipkin用于跟踪分布式服务之间的应用数据链路(具体就是收集微服务之间的调用情况,然后处理调用之间数据延 ...
- vue自定义组件及传值
1.使用 Vue.component() 方法注册组件 2.使用 props 属性传递参数 v-for="item in items": 遍历 Vue 实例中定义的名为 items ...
- 晨读笔记:CSS3选择器之属性选择器
一.属性选择器 1.E[foo^="bar"]:该属性选择器描述的是选择属性以bar开头的元素,如: //所有以名称g_开头的div的字体颜色为红色div[name^=" ...